【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记

文章目录

    • 1. AlexNet
      • 1.1 AlexNet简介
      • 1.2 AlexNet结构
      • 1.3 Alexnet网络的特点
      • 1.4 ReLU Nonlinearity(Rectified Linear Unit)
      • 1.5 Local Response Normalization(局部响应归一化)
    • 2. VGG
      • 2.1 VGG简介
      • 2.2 VGG-16结构
      • 2.3 AlexNet、VGG16、VGG19三者结构对比
    • 3. GooLeNet
      • 3.1 GooLeNet简介
      • 3.2 GooLeNet结构
      • 3.3 比较
    • 4. ResNet
      • 4.1 ResNet简介
      • 4.2 ResNet结构


1. AlexNet

1.1 AlexNet简介

AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。

AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。

AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:

  1. 首次利用GPU进行网络加速训练。
  2. 使用了ReLU激活函数,而不是传统的Sigmoid激活函数以及Tanh激活函数。(smoid求导比较麻烦而且当网路比较深的时候会出现梯度消失)
  3. 使用了LRN局部响应归一化。
  4. 在全连接层的前两层中使用了Dropout随机失活神经元操作,以减少过拟合。

dropout解释: 使用dropout后,在每一层中随机失活一些神经元——减少训练参数从而减少over fitting

1.2 AlexNet结构

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第1张图片
Alexnet网络是由五个卷积层和三个全连接层构成,其中最后的输出被送到1000维的softmax函数。在卷积层的第一、第二和第五层使用了最大池化函数,并且在卷积层的第一和第二层使用了标准化 LRN函数。在全连接层的前两层使用了Dropout函数,来解决神经网络的过拟合问题。Relu激活函数应用在每个卷积层和全连接层。

AlexNet网络的计算的过程如下

layer kernel_size kernel_num padding stride output_width output_shape
conv1 11 48x2=96 (1,2) 4 (224-11+1+2)/4+1=55 55x55x96
Maxpool1 3 - 0 2 (55-3+0)/2+1=27 27x27x96
conv2 5 128x2=256 (2,2) 1 (27-5+2+2)/1+1=27 27x27x256
Maxpool2 3 - 0 2 (27-3+0)/2+1=13 13x13x256
conv3 3 192x2=384 (1,1) 1 (13-3+1+1)/1+1=13 13x13x384
conv4 3 192x2=384 (1,1) 1 (13-3+1+1)/1+1=13 13x13x384
conv5 3 128x2=256 (1,1) 1 (13-3+1+1)/1+1=13 13x13x256
Maxpool3 3 - 0 2 (13-3+0)/2+1=6 6x6x256
FC1 2048 - - - - -
FC2 2048 - - - - -
FC3 1000 - - - - -

说明:

输入 → 输出的大小计算过程为:(W - K + 2P) / S + 1,

  1. W: 输入图片尺寸 width
  2. K:卷积核大小 kernel_size
  3. P: 填充的边距 padding
  4. S: 步长 stride

关于AlexNet每层的详解可参考:Alexnet详解以及tesnsorflow实现alexnet;什么是alexnet alexnet能做什么;alexnet教程


1.3 Alexnet网络的特点

  1. 使用了两个GPU 。由于数据量较大,将网络分配给两个GPU,GPU之间交换数据只会在某些层上发生,不会在所有层上发生第三层从第二层获取数据时会跨GPU,而第四层从第三层获取数据时,只会在同一GPU上进行;
  2. 在数据预处理阶段,将图片随机截取227*227大小,以及他们的水平翻转形成 的图片作为总的样本。在测试时,截取5个227×227的图像块以及它们的水平映射作为样本;
  3. 使用了Relu非线性激活函数,训练时间更快;
  4. 在Relu后使用了LRN作为归一化的方法,局部响应归一化;
  5. 使用了最大池化函数,并且重叠池化,池化核为3*3,步长为2,训练效果更好,传统的池化核在平移过程中,区域不会重合;
  6. 在全连接层的前两层使用Dropout,用来解决过拟合问题,减少隐藏层之间的相互作用,以概率p将某些神经元的值变为0,这些神经元不会参加正向和反向传播;
  7. 但是对于不同的输入,构建的不同的网络模型使用相同的权重;测试时使用全部的神经元,但是神经元的值会减半。

https://blog.csdn.net/weixin_44428467/article/details/100572774?spm=1001.2014.3001.5506
https://blog.csdn.net/luoluonuoyasuolong/article/details/81750190?spm=1001.2014.3001.5506


1.4 ReLU Nonlinearity(Rectified Linear Unit)

标准的L-P神经元的输出一般使用tanh或 sigmoid作为激活函数,但是这些饱和的非线性函数在计算梯度的时候都要比非饱和的线行函数慢很多,在这里称为 Rectified Linear Units(ReLUs)。在深度学习中使用ReLUs要比等价的tanh快很多。
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第2张图片
上图是使用ReLUs和tanh作为激活函数的典型四层网络的在数据集CIFAR-10s实验中,error rate收敛到0.25时的收敛曲线,可以很明显的看到收敛速度的差距。虚线为tanh,实线是ReLUs。


1.5 Local Response Normalization(局部响应归一化)

在神经网络中,我们用激活函数将神经元的输出做一个非线性映射,但是tanh和sigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化,也就是Local Response Normalization。

深度学习的局部响应归一化LRN(Local Response Normalization)理解


2. VGG

2.1 VGG简介

VGGNet是由⽜津⼤学计算机视觉组参加图像分类竞赛时提出的,VGG即Visual Geometry Group,VGGNet相对于AlexNet来说,其在深度上翻了⼀番,最深可达19层,所以叫做Very Deep。

VGG可以应用在人脸识别、图像分类等方面,分别从VGG16~VGG19。

VGG研究卷积网络深度的初衷是想搞清楚卷积网络深度是如何影响大规模图像分类与识别的精度和准确率的,最初是VGG-16号称非常深的卷积网络全称为(GG-Very-Deep-16 CNN),VGG在加深网络层数同时为了避免参数过多,在所有层都采用3x3的小卷积核,卷积层步长被设置为1。

VGG的输入被设置为224x244大小的RGB图像,在训练集图像上对所有图像计算RGB均值,然后把图像作为输入传入VGG卷积网络,使用3x3或者1x1的filter,卷积步长被固定1。

VGG全连接层有3层,根据卷积层+全连接层总数目的不同可以从VGG11 ~ VGG19,最少的VGG11有8个卷积层与3个全连接层,最多的VGG19有16个卷积层+3个全连接层.

此外VGG网络并不是在每个卷积层后面跟上一个池化层,还是总数5个池化层,分布在不同的卷积层之下,下图是VGG11 ~GVV19的结构图:

https://blog.51cto.com/gloomyfish/2105427

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第3张图片


2.2 VGG-16结构

conv1^2 64) -> pool1 -> conv2^2 (128) -> pool2 -> conv3^3 (256) -> pool3 -> conv4^3 (512) -> pool4 -> conv5^3 (512) -> pool5 -> fc6 (4096) -> fc7 (4096) -> fc8 (1000) -> softmax。 ^3代表重复3次。

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第4张图片

上图中的网络共2(卷积层)+2(卷积层)+3(卷积层)+3(卷积层)+3(卷积层)+1(全连接层)+1(全连接层)+1(全连接层)=16层,因此是一个VGG16网络。


2.3 AlexNet、VGG16、VGG19三者结构对比

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第5张图片
与AlexNet相比,VGG网络的评估结果更好,损失更低,精确度更高,但是VGG网络运行时间更久,由于网络更深,参数更多,耗费了更多的资源,占据了更多的内存。


VGG网络的特点

  1. 结构简单,作者将卷积核全部替换为3×3(极少用了1×1);相比于AlexNet 的池化核,VGG全部使用2×2的池化核。
  2. 参数量大,而且大部分的参数集中在全连接层中。网络名称中有16表示它有16层conv/fc层。
  3. 合适的网络初始化和使用批量归一(batch normalization)层对训练深层网络很重要。
  4. VGG-19结构类似于VGG-16,有略好于VGG-16的性能,但VGG-19需要消耗更大的资源,因此实际中VGG-16使用得更多。
  5. 由于VGG-16网络结构十分简单,并且很适合迁移学习,因此至今VGG-16仍在广泛使用。

https://blog.csdn.net/plSong_CSDN/article/details/88584205

说明:

VGGNet结构所有卷积层的kernel都只有3 x 3。VGGNet中连续使用3组3 x 3kernel(stride为1)的原因是它和使用1个7 x 7kernel产生的效果相同(下图以一维卷积为例解释效果相同的原理),然而更深的网络结构会学习到更复杂的非线性关系使得模型效果更好。该操作带来的另一个好处是参数数量的减少,因为对于一个有C个kernel的卷积层来说,原来的参数个数为7 x 7 x C,而新的参数个数为3 x(3 x 3 x C)
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第6张图片

https://zhuanlan.zhihu.com/p/52529082

除此之外,3个串联的3x3卷积层的参数数量要比一个7x7卷积层的参数数量小得多,即3*3*3*C2/7*7C2 = 55%,更少的参数意味着减少过拟合,而且更重要的是3个3x3卷积层拥有比1个7x7的卷积层更少的非线性变换(前者拥有3次而后者只有一次),使得CNN对特征的学习能力更强。
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第7张图片

https://www.jianshu.com/p/15e413985f25


3. GooLeNet

3.1 GooLeNet简介

GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量来提升网络性能。但这种方式存在以下问题:

  • 参数太多,如果训练数据集有限,很容易产生过拟合;
  • 网络越大、参数越多,计算复杂度越大,难以应用;
  • 网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。

但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。

那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

https://www.guyuehome.com/34487


3.2 GooLeNet结构

Inception模块的基本机构如下图,整个Inception结构就是由多个这样的Inception模块串联起来的。

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第8张图片

Inceptionv1

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第9张图片

Inceptionv2

1x1的卷积核如何发挥作用?

1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。

举个例子:

比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,padding=2),输出数据为100x100x256

其中,卷积层的参数为128x5x5x256= 819200

而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍


基于Inception构建了GoogLeNet的网络结构如下(共22层):
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第10张图片


另一种表示

对上图说明如下:

  1. GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
  2. 网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
  3. 虽然移除了全连接,但是网络中依然使用了Dropout ;
  4. 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。

GoogLeNet的网络结构图细节如下:
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第11张图片
注:上表中的#3x3 reduce#5x5 reduce表示在3x35x5卷积操作之前使用了1x1卷积的数量。

GoogLeNet网络结构明细表解析如下:

  1. 输入
    原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。

  2. 第一层(卷积层)
    使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作
    经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作

  3. 第二层(卷积层)
    使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作
    经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作

  4. 第三层(Inception 3a层)
    分为四个分支,采用不同尺度的卷积核来进行处理

    1. 64个1x1的卷积核,然后RuLU,输出28x28x64
    2. 96个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x96,然后进行ReLU计算,再进行128个3x3的卷积(padding为1),输出28x28x128
    3. 16个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x16,进行ReLU计算后,再进行32个5x5的卷积(padding为2),输出28x28x32
    4. pool层,使用3x3的核(padding为1),输出28x28x192,然后进行32个1x1的卷积,输出28x28x32。
      将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256
  5. 第三层(Inception 3b层)

    1. 128个1x1的卷积核,然后RuLU,输出28x28x128
    2. 128个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x128,进行ReLU,再进行192个3x3的卷积(padding为1),输出28x28x192
    3. 32个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x32,进行ReLU计算后,再进行96个5x5的卷积(padding为2),输出28x28x96
    4. pool层,使用3x3的核(padding为1),输出28x28x256,然后进行64个1x1的卷积,输出28x28x64。
      将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480
  6. 第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。

https://my.oschina.net/u/876354/blog/1637819

Inception结构的主要贡献有两个:

  1. 一是使用1x1的卷积来进行升降维;
  2. 二是在多个尺寸上同时进行卷积再聚合。

深度笔记|1x1卷积核的作用


3.3 比较

VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。


4. ResNet

4.1 ResNet简介

ResNet是一种残差网络,是由来自Microsoft Research的4位学者提出的卷积神经网络,在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。


网络的深度为什么重要?

增加网络的宽度和深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,比如说一个深的网络A和一个浅的网络B,那A的性能至少都能跟B一样,为什么呢?因为就算我们把B的网络参数全部迁移到A的前面几层,而A后面的层只是做一个等价的映射,就达到了B网络的一样的效果。一个比较好的例子就是VGG,该网络就是在AlexNet的基础上通过增加网络深度大幅度提高了网络性能。

https://baike.baidu.com/item/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C/22701838?fr=aladdin

因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

为什么不能简单地增加网络层数?

对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。
对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。

虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfit,因为overfit应该表现为在训练集上表现更好才对。

退化问题说明了深度网络不能很简单地被很好地优化。

作者通过实验:通过浅层网络 + y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。

https://www.cnblogs.com/alanma/p/6877166.html

深度网络的退化问题

网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果,从下图中也可以看出网络越深而效果越好的一个实践证据。

实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。这个现象可以在图中直观看出来:56层的网络比20层网络效果还要差。

这不会是过拟合问题,因为56层网络的训练误差同样高。我们知道深层网络存在着梯度消失或者爆炸的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。

【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第12张图片

https://zhuanlan.zhihu.com/p/31852747

怎么解决退化问题?

这就要利用深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第13张图片

残差:观测值与估计值之间的差。
这里H(x)就是观测值,x就是估计值(也就是上一层ResNet输出的特征映射)。
我们一般称x为identity Function,它是一个跳跃连接;称F(x)为ResNet Function。

假设F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化。

https://blog.csdn.net/sunny_yeah_/article/details/89430124
https://www.cnblogs.com/alanma/p/6877166.html


4.2 ResNet结构

作者由VGG19设计出了plain 网络和残差网络,如下图中部和右侧网络。然后利用这两种网络进行实验对比。

通过短路机制加入了残差单元,如图所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。

从图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变。下图展示的34-layer的ResNet,还可以构建更深的网络如表所示。从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的feature map数量是比较小的,并且是输出feature map数量的1/4。
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第14张图片
【深度学习】AlexNet、VGG、GooLeNet、ResNet整理笔记_第15张图片

不同深度的ResNet

设计网络的规则:

  1. 对于输出feature map大小相同的层,有相同数量的filters,即channel数相同;
  2. 当feature map大小减半时(池化),filters数量翻倍,这保持了网络层的复杂度。

对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。维度不匹配时,同等映射有两种可选方案:

  1. 直接通过zero-padding 来增加维度(channel)。
  2. 乘以W矩阵投影到新的空间。实现是用1x1卷积实现的,直接改变1x1卷积的filters数目。这种会增加参数。

注:本博客内容来教材和自网络整理,仅作为学习笔记记录,不用做其他用途。

你可能感兴趣的:(深度学习,深度学习)