[深度学习-总结]Deep learning中8大模型介绍与比较(LeNet5,AlexNet,VGG,Inception,MobileNets,ResNet,DenseNet,Senet)

[深度学习-总结]Deep learning中8大模型介绍与比较(LeNet5,AlexNet,VGG,Inception,MobileNets,ResNet,DenseNet,Senet)LeNet5LeNet5不是CNN的起点,但却是它的helloworld,让大家看到了卷积神经网络商用的前景

0. CNN 结构演化

在这里插入图片描述
上图所示是刘昕博士总结的CNN结构演化的历史,起点是神经认知机模型,此时已经出现了卷积结构,经典的LeNet诞生于1998年。然而之后CNN的锋芒开始被SVM等手工设计的特征盖过。随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史突破–AlexNet.

1. LeNet5

LeNet5不是CNN的起点,但却是它的hello world,让大家看到了卷积神经网络商用的前景。
一共2层 (2个卷积层+2个全连接层+1个softmax层)
在这里插入图片描述[深度学习-总结]Deep learning中8大模型介绍与比较(LeNet5,AlexNet,VGG,Inception,MobileNets,ResNet,DenseNet,Senet)
在这里插入图片描述
在这里插入图片描述

2. AlexNet

AlexNet是CNN向大规模商用打响的第一枪,夺得ImageNet 2012年分类冠军,宣告神经网络的王者归来。也是在那年之后,更多的更深的神经网路被提出,比如优秀的vgg,GoogleLeNet.

它们都有着简单而又优雅的结构,同出一门。诠释了增加深度是如何提高了深度学习模型的性能。详细解读如下:
在这里插入图片描述
如上图所示,上图采用是两台GPU服务器,所有会看到两个流程图
输入Input的图像规格: 224x224x3(RGB图像),实际上会经过预处理变为227x227x3

计算Feature Map的公式
O u t p u t S i z e = ( I n p u t S i z e + P a d ∗ 2 − K e r n a l S i z e ) S t r i d e + 1 OutputSize=\frac{(InputSize + Pad * 2 – KernalSize)} {Stride} + 1 OutputSize=Stride(InputSize+Pad2KernalSize)+1

在这里插入图片描述
在这里插入图片描述
相比于Lenet5, AlexNet 优势在于

  1. 网络增大(5个卷积层+3个全连接层+1个softmax层)
  2. 同时解决过拟合(dropout,data augmentation,LRN),
  3. 并且利用多GPU加速计算

LRN: Local Responce Normalization – 本质上,这个层也是为了防止激活函数的饱和的。

参考资料
ImageNet https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

3. VGG

本篇将介绍VGG16网络的基本结构。VGG16网络是14年牛津大学计算机视觉组和Google DeepMind公司研究员一起研发的深度网络模型。该网络一共有16个训练参数的网络,它的兄弟版本如下图所示,清晰的展示了每一级别的参数量,从11层的网络一直到19层的网络。VGG16网络取得了ILSVRC 2014比赛分类项目的第2名,定位项目的第1名。VGGNet网络结构简洁,迁移到其他图片数据上的泛化性能非常好。VGGNet现在依然经常被用来提取图像特征,该网络训练后的模型参数在其官网上开源了,可以用来在图像分类任务上进行在训练,即:提供了非常好的初始化权重,使用较为广泛。贴出论文地址 论文:
在这里插入图片描述

  • VGG16包含了16个隐藏层(13个卷积层和3个全连接层),如上图中的D列所示
  • VGG19包含了19个隐藏层(16个卷积层和3个全连接层),如上图中的E列所示
    VGG网络的结构非常一致,从头到尾全部使用的是3×3的卷积和2×2的max pooling。

从表一可知:VGGNet有5段卷积层,每一段内有2个或3个卷积层,每段结尾连接一个最大池化层用于缩小图片尺寸;各段内部的卷积核数量一样,越靠近全连接层卷积核数量越多。表二可知:每段卷积核数量一样,越靠近全连接层卷积核数量越多,相应的图片尺寸越小。
在这里插入图片描述
在这里插入图片描述

VGG优缺点
VGG优点
VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3×3)和最大池化尺寸(2×2)。
几个小滤波器(3×3)卷积层的组合比一个大滤波器(5×5或7×7)卷积层好:
验证了通过不断加深网络结构可以提升性能。

VGG缺点
VGG耗费更多计算资源,并且使用了更多的参数(这里不是3×3卷积的锅),导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。VGG可是有3个全连接层啊!

简单来说,在VGG中,使用了3个3×3卷积核来代替7×7卷积核,使用了2个3×3卷积核来代替5*5卷积核,这样做的主要目的是在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。

为什么使用2个3×3卷积核可以来代替5*5卷积核

5×5卷积看做一个小的全连接网络在5×5区域滑动,我们可以先用一个3×3的卷积滤波器卷积,然后再用一个全连接层连接这个3×3卷积输出,这个全连接层我们也可以看做一个3×3卷积层。这样我们就可以用两个3×3卷积级联(叠加)起来代替一个 5×5卷积。

具体如下图所示:

2个3×3和5×5
至于为什么使用3个3×3卷积核可以来代替7*7卷积核,推导过程与上述类似,大家可以自行绘图理解。
在这里插入图片描述
同样的, 3个步长为1的3×3卷积核的一层层叠加作用可看成一个大小为7的感受野(其实就表示3个3×3连续卷积相当于一个7×7卷积)
3个3X3的卷积的参数为 3x3x3=27
而7X7的卷积的参数和是7×7=49
即减少了参数;而且3×3卷积核有利于更好地保持图像性质。

4. 1*1卷积

11卷积本身只是NN卷积的卷积核大小退化为1时的特例,但是由于它以较小的计算代价增强了网络的非线性表达能力,给网络结构在横向和纵向拓展提供了非常好的工具,常用于升维和降维操作,尤其是在深层网络和对计算效率有较高要求的网络中广泛使用。

在这里插入图片描述

5. Inception – GoogLeNet

GoogLeNet夺得ImageNet2014年分类冠军,也被称为Inception V1。Inception V1有22层深,参数量为5M。

与VGG不同的是,GoogLeNet做了更大胆的网络上的尝试,为了获得高质量的模型,它也从增加模型的深度(层数)或者是其宽度(层核或者神经元数)这两方面考虑了,但是在这种思路下会出现两个缺陷(1.参数太多,容易过拟合,若训练数据集有限;2.网络越大计算复杂度越大,难以应用;3.网络越深,梯度越往后穿越容易消失,难以优化模型)。而GoogLeNet通过新的结构设计,在增加深度和宽度的同时避免了以上问题:

1.深度

GoogLeNet采用了22层网络,为了避免上述提到的梯度消失问题,GoogLeNet巧妙的在不同深度处增加了两个loss来保证梯度回传消失的现象。结构如图1所示:

在这里插入图片描述
在这里插入图片描述
论文中提到这两个辅助 softmax 分类器的损失函数(Loss Function)在计算总的损失是需要添加一个衰减系数,文中给出的是 0.3 。在进行实际推断( inference)时,需要把这两个辅助 softmax 分类器丢弃

2.宽度

问题的提出

图像中突出部分的大小差别很大。例如,狗的图像可以是以下任意情况。每张图像中狗所占区域都是不同的。
在这里插入图片描述
从左到右:狗占据图像的区域依次减小

  • 由于信息位置的巨大差异,为卷积操作选择合适的卷积核大小就比较困难。信息分布更全局性的图像偏好较大的卷积核,信息分布比较局部的图像偏好较小的卷积核。
  • 非常深的网络更容易过拟合。将梯度更新传输到整个网络是很困难的。
  • 简单地堆叠较大的卷积层非常消耗计算资源。
解决方案

为什么不在同一层级上运行具备多个尺寸的滤波器呢?网络本质上会变得稍微「宽一些」

Inception的网络,由11卷积,33卷积,55卷积,33最大池化四个并行通道运算结果进行融合 ,一方面增加了网络的width,另一方面增加了网络对尺度的适应性,但是如果简单的将这些应用到feature map上的话,concat起来的feature map厚度将会很大,所以为了避免这一现象提出的inception具有如下结构,在3×3前,5×5前,max pooling后分别加上了1×1的卷积核起到了降低feature map厚度的作用,这也使得虽然googlenet有22层但是参数个数要少于alexnet和vgg。inception的具体结构如图2所示。

在这里插入图片描述

总结

综上所述,vgg网络更简单粗暴,在Alexnet的基础上不停地加卷基层,扩展神经网络的深度,并且取得了较好的效果,也让人们认识到加深网络是提高模型质量的一个有效途径。但它同时也面临着参数太多,训练较慢,梯度消失等问题。而GoogLeNet则通过增加在不同层算loss和提出inception结构两种方式,不仅加深了网络,同时也加宽了网络,并且减少了参数个数

参考资料
一文概览Inception家族的「奋斗史」
https://arxiv.org/pdf/1409.4842v1.pdf

6. MobileNets

脱胎于Xception的网络结构MobileNets使用Depthwise Separable Convolution(深度可分离卷积)构建了轻量级的28层神经网络,成为了移动端上的高性能优秀基准模型。
一个depthwise convolution,专注于该通道内的空间信息,一个pointwise convolution,专注于跨通道的信息融合,两者共同努力,然后强大,在此基础上的一系列模型如shufflenet等都是后话。
在这里插入图片描述
在这里插入图片描述
我们可以看到它由33的通道分组卷积(depthwise separable convolution)加11的普通卷积(point wise convolution)组成。它的组成结构本质上就是Xception结构,如下图。

7. ResNet

ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升。同时ResNet的推广性非常好甚至可以直接用到InceptionNet网络中。

在这里插入图片描述

ResNet的主要思想是在网络中增加了直连通道,即Highway Network的思想。此前的网络结构是性能输入做一个非线性变换,而Highway Network则允许保留之前网络层的一定比例的输出。ResNet的思想和Highway Network的思想也非常类似,允许原始输入信息直接传到后面的层中,如下图所示。
在这里插入图片描述

创新点

提出残差学习的思想。传统的卷积网络或者全连接网络在信息传递的时候或多或少会存在信息丢失,损耗等问题,同时还有导致梯度消失或者梯度爆炸,导致很深的网络无法训练。ResNet在一定程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。VGGNet和ResNet的对比如下图所示。ResNet最大的区别在于有很多的旁路将输入直接连接到后面的层,这种结构也被称为shortcut或者skip connections。

网络结构

在ResNet网络结构中会用到两种残差模块,一种是以两个33的卷积网络串接在一起作为一个残差模块,另外一种是11、33、11的3个卷积网络串接在一起作为一个残差模块。他们如下图所示。

在这里插入图片描述
主要代码实现

def block1(x, filters, kernel_size=3, stride=1, conv_shortcut=True, name=None): bn_axis = 3 if conv_shortcut is True: shortcut = layers.Conv2D(4 * filters, 1, strides=stride, name=name + '_0_conv')(x) shortcut = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + '_0_bn')(shortcut) else: shortcut = x x = layers.Conv2D(filters, 1, strides=stride, name=name + '_1_conv')(x) x = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + '_1_bn')(x) x = layers.Activation('relu', name=name + '_1_relu')(x) x = layers.Conv2D(filters, kernel_size, padding='SAME', name=name + '_2_conv')(x) x = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + '_2_bn')(x) x = layers.Activation('relu', name=name + '_2_relu')(x) x = layers.Conv2D(4 * filters, 1, name=name + '_3_conv')(x) x = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name=name + '_3_bn')(x) x = layers.Add(name=name + '_add')([shortcut, x]) x = layers.Activation('relu', name=name + '_out')(x) return x 

参考资料
https://arxiv.org/pdf/1512.03385v1.pdf

8. DenseNet(密集连接卷积神经网络)

进一步利用快捷连接,将所有层直接连接在一起。在这种新型架构中,每层的输入由所有之前层的特征映射组成,其输出将传输给每个后续层。这些特征映射通过深度级联聚合。

DenseNet和ResNet的一个明显区别是,ResNet是求和,而DenseNet是做一个拼接,每一层网络的输入包括前面所有层网络的输出。第L层的输入等于K x (L-1) + k0,其中k是生长率,表示每一层的通道数,比如下图网络的通道数为4。

DenseNet提升了信息和梯度在网络中的传输效率,每层都能直接从损失函数拿到梯度,并且直接得到输入信号,这样就能训练更深的网络,这种网络结构还有正则化的效果。其他网络致力于从深度和宽度来提升网络性能,
DenseNet致力于从特征重用的角度来提升网络性能
在这里插入图片描述
在这里插入图片描述
上面图中的结构是一个dense block,下图的结构是一个完整的dense net,包括3个dense block。可以发现在block之间没有dense连接,因为在pooling操作之后,改变了feature maps的大小,这时候就没法做dense 连接了。在两个block之间的是transition layer ,包括了conv ,pool,在实验中使用的是BN,(1×1 conv),(2×2 avg pool)。

这种结构的好处是可以缓解梯度消失,省参数省计算,特征重用可以起到抗过拟合的作用。达到相同的精度,dense net只需要res net一半的参数和一半的计算量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关键代码
Con_block 对应与图中的Dense block.
Transition_bock 对应与图中连接两Dense Block 网络

def transition_block(x, reduction, name): x = layers.BatchNormalization(axis=3, epsilon=1.001e-5,name=name + '_bn')(x) x = layers.Activation('relu', name=name + '_relu')(x) filter = x.shape[3] x = layers.Conv2D(int(filter*reduction), 1,use_bias=False,name=name + '_conv')(x) x = layers.AveragePooling2D(2, strides=2, name=name + '_pool')(x) return x def conv_block(x, growth_rate, name): x1 = layers.BatchNormalization(axis=3, epsilon=1.001e-5)(x) x1 = layers.Activation('relu')(x1) x1 = layers.Conv2D(2 * growth_rate, 1,use_bias=False, name=name + '_1_conv')(x1) x1 = layers.BatchNormalization(axis=3, epsilon=1.001e-5)(x1) x1 = layers.Activation('relu', name=name + '_1_relu')(x1) x1 = layers.Conv2D(growth_rate, 3 ,padding='same',use_bias=False, name=name + '_2_conv')(x1) x = layers.Concatenate( name=name + '_concat')([x, x1]) return x 

优点

  • 由于密集连接方式,DenseNet提升了梯度的反向传播,使得网络更容易训练。由于每层可以直达最后的误差信号,实现了隐式的“deep
    supervision”;
  • 参数更小且计算更高效,这有点违反直觉,由于DenseNet是通过concat特征来实现短路连接,实现了特征重用,并且采用较小的growth
    rate,每个层所独有的特征图是比较小的;
  • 由于特征复用,最后的分类器使用了低级特征。

参考资料
https://arxiv.org/pdf/1608.06993.pdf

9. Senet – (Squeeze-Excitation )

学习每一层的通道之间的关系

首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

最后是一个 Reweight 的操作,我们将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
在这里插入图片描述
代码实现

def senet_block(inputs, ratio): shape = inputs.shape channel_out = shape[-1] # (2, 28, 28, 32) , [1,28,28,1], [1,28,28,1] squeeze = layers.GlobalAveragePooling2D()(inputs) # [2, 1, 1, 32] # 第二层,全连接层 # [2,32] shape_result = layers.Flatten()(squeeze) # [32,2] shape_result = layers.Dense(int(channel_out / ratio), activation='relu', use_bias=False)(shape_result) # [2,32] shape_result = layers.Dense(channel_out, activation='sigmoid', use_bias=False)(shape_result) # 第四层,点乘 excitation_output = tf.reshape(shape_result, [-1, 1, 1, channel_out]) scale = inputs* excitation_output return scale 

参考资料
https://arxiv.org/pdf/1709.01507.pdf

今天的文章
[深度学习-总结]Deep learning中8大模型介绍与比较(LeNet5,AlexNet,VGG,Inception,MobileNets,ResNet,DenseNet,Senet)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81334.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注