CV预测:快速使用DenseNet神经网络

2024-06-18 08:52

本文主要是介绍CV预测:快速使用DenseNet神经网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AI预测相关目录

AI预测流程,包括ETL、算法策略、算法模型、模型评估、可视化等相关内容
最好有基础的python算法预测经验

  1. EEMD策略及踩坑
  2. VMD-CNN-LSTM时序预测
  3. 对双向LSTM等模型添加自注意力机制
  4. K折叠交叉验证
  5. optuna超参数优化框架
  6. 多任务学习-模型融合策略
  7. Transformer模型及Paddle实现
  8. 迁移学习在预测任务上的tensoflow2.0实现
  9. holt提取时序序列特征
  10. TCN时序预测及tf实现
  11. 注意力机制/多头注意力机制及其tensorflow实现
  12. 一文解析AI预测数据工程
  13. FITS:一个轻量级而又功能强大的时间序列分析模型
  14. DLinear:未来预测聚合历史信息的最简单网络
  15. LightGBM:更好更快地用于工业实践集成学习算法
  16. 面向多特征的AI预测指南
  17. 大模型时序预测初步调研【20240506】
  18. Time-LLM :超越了现有时间序列预测模型的学习器
  19. CV预测:快速使用LeNet-5卷积神经网络
  20. CV预测:快速使用ResNet深度残差神经网络并创建自己的训练集
  21. CV预测:快速使用DenseNet神经网络

文章目录

  • AI预测相关目录
  • DenseNet简介
  • 代码


DenseNet简介

DenseNet在ResNet基础上做出了改进,其主要优势点如下:

  • 1.提出了稠密连接的思想。将一个稠密块中的所有层直接相互连接,确保了网络中各层之间最大的信息流。同时减轻了梯度弥散的问题,增强了特征传播,鼓励了特征重用。
  • 2.采用了过渡层进行下采样。这一点和ResNet有明显的区别。
  • 3.提出了增长率k,指的是每个瓶颈层H,产生的特征图个数。相对较小的增长率(比如K=12)就足以在测试的数据集上获得最先进的结果。
  • 4.每个稠密块之后,使用压缩因子0对特征图通道数进行压缩。

在这里插入图片描述
基本设计如上图所示:
传统的卷积神经网络:将第1- 1层的输出作为第1层的输入,用公式可表示为: x= H(x1-1)
深度残差网络ResNet:ResNets添加了一个捷径连接,该连接使用恒等映射绕过了非线性变换H用公式可表示为:x= H(x-1)+ x1-1
稠密卷积网络DenseNet:为了进一步改善各层之间的信息流,提出了一种不同的连接模式–稠密连接:引入了从任何层到所有后续层的直接连接。该网络以前馈方式将每一层连接到其他每一层。对于每一层,所有先前层的特征图都用作输入,而其自身的特征图则用作所有后续层的输入。这种连接方式确保了网络中各层之间最大的信息流。

稠密连接的优点:
1.减轻了梯度弥散,增强了特征传播,鼓励了特征重用
2.在整个网络中改善了信息流和梯度,使得模型更易于训练
3.稠密连接具有正则化效果,减少了训练集较小任务的过度拟合

代码

MODEL

import tensorflow as tf
from tensorflow.keras import layers# 瓶颈层,相当于每一个稠密块中若干个相同的H函数
class BottleNeck(layers.Layer):# growth_rate对应的是论文中的增长率k,指经过一个BottleNet输出的特征图的通道数;drop_rate指失活率。def __init__(self, growth_rate, drop_rate):super(BottleNeck, self).__init__()self.bn1 = layers.BatchNormalization()self.conv1 = layers.Conv2D(filters=4 * growth_rate,  # 使用1*1卷积核将通道数降维到4*kkernel_size=(1, 1),strides=1,padding="same")self.bn2 = layers.BatchNormalization()self.conv2 = layers.Conv2D(filters=growth_rate,  # 使用3*3卷积核,使得输出维度(通道数)为kkernel_size=(3, 3),strides=1,padding="same")self.dropout = layers.Dropout(rate=drop_rate)# 将网络层存入一个列表中self.listLayers = [self.bn1,layers.Activation("relu"),self.conv1,self.bn2,layers.Activation("relu"),self.conv2,self.dropout]def call(self, x):y = xfor layer in self.listLayers.layers:y = layer(y)# 每经过一个BottleNet,将输入和输出按通道连结。作用是:将前l层的输入连结起来,作为下一个BottleNet的输入。y = layers.concatenate([x, y], axis=-1)return y# 稠密块,由若干个相同的瓶颈层构成
class DenseBlock(layers.Layer):# num_layers表示该稠密块存在BottleNet的个数,也就是一个稠密块的层数Ldef __init__(self, num_layers, growth_rate, drop_rate=0.5):super(DenseBlock, self).__init__()self.num_layers = num_layersself.growth_rate = growth_rateself.drop_rate = drop_rateself.listLayers = []# 一个DenseBlock由多个相同的BottleNeck构成,我们将它们放入一个列表中。for _ in range(num_layers):self.listLayers.append(BottleNeck(growth_rate=self.growth_rate, drop_rate=self.drop_rate))def call(self, x):for layer in self.listLayers.layers:x = layer(x)return x# 过渡层
class TransitionLayer(layers.Layer):# out_channels代表输出通道数def __init__(self, out_channels):super(TransitionLayer, self).__init__()self.bn = layers.BatchNormalization()self.conv = layers.Conv2D(filters=out_channels,kernel_size=(1, 1),strides=1,padding="same")self.pool = layers.MaxPool2D(pool_size=(2, 2),   # 2倍下采样strides=2,padding="same")def call(self, inputs):x = self.bn(inputs)x = tf.keras.activations.relu(x)x = self.conv(x)x = self.pool(x)return x# DenseNet整体网络结构
class DenseNet(tf.keras.Model):# num_init_features:代表初始的通道数,即输入稠密块时的通道数# growth_rate:对应的是论文中的增长率k,指经过一个BottleNet输出的特征图的通道数# block_layers:每个稠密块中的BottleNet的个数# compression_rate:压缩因子,其值在(0,1]范围内# drop_rate:失活率def __init__(self, num_init_features, growth_rate, block_layers, compression_rate, drop_rate):super(DenseNet, self).__init__()# 第一层,7*7的卷积层,2倍下采样。self.conv = layers.Conv2D(filters=num_init_features,kernel_size=(7, 7),strides=2,padding="same")self.bn = layers.BatchNormalization()# 最大池化层,3*3卷积核,2倍下采样self.pool = layers.MaxPool2D(pool_size=(3, 3), strides=2, padding="same")# 稠密块 Dense Block(1)self.num_channels = num_init_featuresself.dense_block_1 = DenseBlock(num_layers=block_layers[0], growth_rate=growth_rate, drop_rate=drop_rate)# 该稠密块总的输出的通道数self.num_channels += growth_rate * block_layers[0]# 对特征图的通道数进行压缩self.num_channels = compression_rate * self.num_channels# 过渡层1,过渡层进行下采样self.transition_1 = TransitionLayer(out_channels=int(self.num_channels))# 稠密块 Dense Block(2)self.dense_block_2 = DenseBlock(num_layers=block_layers[1], growth_rate=growth_rate, drop_rate=drop_rate)self.num_channels += growth_rate * block_layers[1]self.num_channels = compression_rate * self.num_channels# 过渡层2,2倍下采样,输出:14*14self.transition_2 = TransitionLayer(out_channels=int(self.num_channels))# 稠密块 Dense Block(3)self.dense_block_3 = DenseBlock(num_layers=block_layers[2], growth_rate=growth_rate, drop_rate=drop_rate)self.num_channels += growth_rate * block_layers[2]self.num_channels = compression_rate * self.num_channels# 过渡层3,2倍下采样self.transition_3 = TransitionLayer(out_channels=int(self.num_channels))# 稠密块 Dense Block(4)self.dense_block_4 = DenseBlock(num_layers=block_layers[3], growth_rate=growth_rate, drop_rate=drop_rate)# 全局平均池化,输出size:1*1self.avgpool = layers.GlobalAveragePooling2D()# 全连接层,进行10分类self.fc = layers.Dense(units=10, activation=tf.keras.activations.softmax)def call(self, inputs):x = self.conv(inputs)x = self.bn(x)x = tf.keras.activations.relu(x)x = self.pool(x)x = self.dense_block_1(x)x = self.transition_1(x)x = self.dense_block_2(x)x = self.transition_2(x)x = self.dense_block_3(x)x = self.transition_3(x,)x = self.dense_block_4(x)x = self.avgpool(x)x = self.fc(x)return xdef densenet():return DenseNet(num_init_features=64, growth_rate=32, block_layers=[2,2,2,2], compression_rate=0.5, drop_rate=0.5)# return DenseNet(num_init_features=64, growth_rate=32, block_layers=[4, 4, 4, 4], compression_rate=0.5, drop_rate=0.5)
mynet=densenet()

TRAIN

import tensorflow as tf
from model import mynet
import matplotlib.pyplot as plt# 数据集准备
# (x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
x_train = x_train.reshape((60000, 28, 28, 1)).astype('float32') / 255
x_test = x_test.reshape((10000, 28, 28, 1)).astype('float32') / 255mynet.compile(loss='sparse_categorical_crossentropy',optimizer=tf.keras.optimizers.SGD(),metrics=['accuracy'])history = mynet.fit(x_train, y_train,batch_size=64,epochs=5,validation_split=0.2)
# test_scores = mynet.evaluate(x_test, y_test, verbose=2)plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.legend(['training', 'validation'], loc='upper left')
plt.show()

这篇关于CV预测:快速使用DenseNet神经网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071800

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤