企业自有网站,天津做网站价格,化妆品网站设计方案,餐饮网站开发毕业设计模板本文为为#x1f517;365天深度学习训练营内部文章 原作者#xff1a;K同学啊 一 回顾DenseNet算法 DenseNet#xff08;Densely Connected Convolutional Networks#xff09;是一种深度卷积神经网络架构#xff0c;提出的核心思想是通过在每一层与前面所有层进行直接连接… 本文为为365天深度学习训练营内部文章 原作者K同学啊 一 回顾DenseNet算法 DenseNetDensely Connected Convolutional Networks是一种深度卷积神经网络架构提出的核心思想是通过在每一层与前面所有层进行直接连接极大地增强了信息和梯度的流动。传统的卷积神经网络CNN结构中每一层的输入仅来自前一层而DenseNet通过让每一层的输入包含所有前面层的输出形成了更密集的连接。这样的设计能够减少梯度消失的问题促进特征复用提高模型的表现力和学习效率。 DenseNet的优势主要体现在两个方面。首先由于密集连接的特点它在同等参数量下比传统的卷积网络能够学习到更丰富的特征提升了网络的性能。其次由于每层都接收前面层的特征图DenseNet有效缓解了深度神经网络中训练难度较大的问题特别是在处理深层网络时可以显著提高梯度的传递效率减少了对大规模数据集的需求。通过这些优点DenseNet在图像分类、目标检测等任务中表现出色。 通道注意力机制上文提及不再叙述。以下是DenseNetSE-Net代码 SE模块实现import tensorflow as tf
from keras.models import Model
from keras import layers
from keras import backendclass Squeeze_excitation_layer(tf.keras.Model):def __init__(self, filter_sq):super().__init__()self.filter_sq filter_sqself.avepool tf.keras.layers.GlobalAveragePooling2D()def build(self, input_shape):self.dense1 tf.keras.layers.Dense(self.filter_sq, activationrelu)self.dense2 tf.keras.layers.Dense(input_shape[-1], activationsigmoid)def call(self, inputs):squeeze self.avepool(inputs)excitation self.dense1(squeeze)excitation self.dense2(excitation)excitation tf.keras.layers.Reshape((1, 1, inputs.shape[-1]))(excitation)scale inputs * excitationreturn scaledef dense_block(x,blocks,name):for i in range(blocks):x conv_block(x,32,namename_blockstr(i1))return xdef conv_block(x,growth_rate,name):bn_axis 3x1 layers.BatchNormalization(axisbn_axis,epsilon1.001e-5,namename_0_bn)(x)x1 layers.Activation(relu,namename_0_relu)(x1)x1 layers.Conv2D(4*growth_rate,1,use_biasFalse,namename_1_conv)(x1)x1 layers.BatchNormalization(axisbn_axis,epsilon1.001e-5,namename _1_bn)(x1)x1 layers.Activation(relu, namename _1_relu)(x1)x1 layers.Conv2D(growth_rate, 3, paddingsame,use_biasFalse, namename _2_conv)(x1)x layers.Concatenate(axisbn_axis,namename_concat)([x,x1])return xdef transition_block(x,reduction,name):bn_axis 3x layers.BatchNormalization(axisbn_axis,epsilon1.001e-5,namename_bn)(x)x layers.Activation(relu,namename_relu)(x)x layers.Conv2D(int(backend.int_shape(x)[bn_axis] * reduction),1,use_biasFalse,namename_conv)(x)x layers.AveragePooling2D(2,strides2,namename_pool)(x)return xdef DenseNet(blocks,input_shapeNone,classes1000,**kwargs):img_input layers.Input(shapeinput_shape)bn_axis 3# 224,224,3 - 112,112,64x layers.ZeroPadding2D(padding((3,3),(3,3)))(img_input)x layers.Conv2D(64,7,strides2,use_biasFalse,nameconv1/conv)(x)x layers.BatchNormalization(axisbn_axis,epsilon1.001e-5,nameconv1/bn)(x)x layers.Activation(relu,nameconv1/relu)(x)# 112,112,64 - 56,56,64x layers.ZeroPadding2D(padding((1,1),(1,1)))(x)x layers.MaxPooling2D(3,strides2,namepool1)(x)# 56,56,64 - 56,56,6432*block[0]# DenseNet121 56,56,64 - 56,56,6432*6 56,56,256x dense_block(x,blocks[0],nameconv2)# 56,56,6432*block[0] - 28,28,3216*block[0]# DenseNet121 56,56,256 - 28,28,3216*6 28,28,128x transition_block(x,0.5,namepool2)# 28,28,3216*block[0] - 28,28,3216*block[0]32*block[1]# DenseNet121 28,28,128 - 28,28,12832*12 28,28,512x dense_block(x,blocks[1],nameconv3)# DenseNet121 28,28,512 - 14,14,256x transition_block(x,0.5,namepool3)# DenseNet121 14,14,256 - 14,14,25632*block[2] 14,14,1024x dense_block(x,blocks[2],nameconv4)# DenseNet121 14,14,1024 - 7,7,512x transition_block(x,0.5,namepool4)# DenseNet121 7,7,512 - 7,7,25632*block[3] 7,7,1024x dense_block(x,blocks[3],nameconv5)# 加SE注意力机制x Squeeze_excitation_layer(16)(x)x layers.BatchNormalization(axisbn_axis,epsilon1.001e-5,namebn)(x)x layers.Activation(relu,namerelu)(x)x layers.GlobalAveragePooling2D(nameavg_pool)(x)x layers.Dense(classes,activationsoftmax,namefc1000)(x)inputs img_inputif blocks [6,12,24,16]:model Model(inputs,x,namedensenet121)elif blocks [6,12,32,32]:model Model(inputs,x,namedensenet169)elif blocks [6,12,48,32]:model Model(inputs,x,namedensenet201)else:model Model(inputs,x,namedensenet)return modeldef DenseNet121(input_shape[224,224,3],classes3,**kwargs):return DenseNet([6,12,24,16],input_shape,classes,**kwargs)def DenseNet169(input_shape[224,224,3],classes3,**kwargs):return DenseNet([6,12,32,32],input_shape,classes,**kwargs)def DenseNet201(input_shape[224,224,3],classes3,**kwargs):return DenseNet([6,12,48,32],input_shape,classes,**kwargs)from tensorflow.keras.optimizers import Adam# 实例化模型指定输入形状和类别数
model DenseNet201(input_shape[224,224,3], classes2)
model.summary()
# 设置优化器
opt tf.keras.optimizers.Adam(learning_rate1e-7)model.compile(optimizeradam,losssparse_categorical_crossentropy,metrics[accuracy])epochs 25history model.fit(train_ds,validation_dataval_ds,epochsepochs,
)# 获取实际训练轮数
actual_epochs len(history.history[accuracy])acc history.history[accuracy]
val_acc history.history[val_accuracy]loss history.history[loss]
val_loss history.history[val_loss]epochs_range range(actual_epochs)plt.figure(figsize(12, 4))# 绘制准确率
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, labelTraining Accuracy)
plt.plot(epochs_range, val_acc, labelValidation Accuracy)
plt.legend(loclower right)
plt.title(Training and Validation Accuracy)# 绘制损失
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, labelTraining Loss)
plt.plot(epochs_range, val_loss, labelValidation Loss)
plt.legend(locupper right)
plt.title(Training and Validation Loss)plt.show() 总结DenseNet与SE-NetSqueeze-and-Excitation Networks结合后能够进一步增强模型的表现力和效率。DenseNet通过密集连接每一层促进了特征的复用和梯度的流动而SE-Net通过引入通道注意力机制能够自动学习每个特征通道的重要性调整通道的权重。将这两者结合起来DenseNet负责加强特征之间的关联性和信息流动而SE-Net则提升了特征通道的自适应能力使得网络能够在不同任务中更加精准地利用最有用的特征。这样的结合使得模型在保持高效的同时能够更加聚焦于有价值的特征从而提升了性能尤其在处理复杂的视觉任务时表现尤为出色。