AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。
AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。
AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:
dropout解释: 使用dropout后,在每一层中随机失活一些神经元——减少训练参数从而减少over fitting
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
,
关于AlexNet每层的详解可参考:Alexnet详解以及tesnsorflow实现alexnet;什么是alexnet alexnet能做什么;alexnet教程
227*227
大小,以及他们的水平翻转形成 的图片作为总的样本。在测试时,截取5个227×227的图像块以及它们的水平映射作为样本;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
标准的L-P神经元的输出一般使用tanh或 sigmoid作为激活函数,但是这些饱和的非线性函数在计算梯度的时候都要比非饱和的线行函数慢很多,在这里称为 Rectified Linear Units(ReLUs)。在深度学习中使用ReLUs要比等价的tanh快很多。
上图是使用ReLUs和tanh作为激活函数的典型四层网络的在数据集CIFAR-10s实验中,error rate收敛到0.25时的收敛曲线,可以很明显的看到收敛速度的差距。虚线为tanh,实线是ReLUs。
在神经网络中,我们用激活函数将神经元的输出做一个非线性映射,但是tanh和sigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化,也就是Local Response Normalization。
深度学习的局部响应归一化LRN(Local Response Normalization)理解
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
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次。
上图中的网络共2(卷积层)+2(卷积层)+3(卷积层)+3(卷积层)+3(卷积层)+1(全连接层)+1(全连接层)+1(全连接层)=16
层,因此是一个VGG16网络。
与AlexNet相比,VGG网络的评估结果更好,损失更低,精确度更高,但是VGG网络运行时间更久,由于网络更深,参数更多,耗费了更多的资源,占据了更多的内存。
VGG网络的特点
https://blog.csdn.net/plSong_CSDN/article/details/88584205
说明:
VGGNet结构所有卷积层的kernel都只有3 x 3
。VGGNet中连续使用3组3 x 3
kernel(stride为1)的原因是它和使用1个7 x 7
kernel产生的效果相同(下图以一维卷积为例解释效果相同的原理),然而更深的网络结构会学习到更复杂的非线性关系使得模型效果更好。该操作带来的另一个好处是参数数量的减少,因为对于一个有C个kernel的卷积层来说,原来的参数个数为7 x 7 x C
,而新的参数个数为3 x(3 x 3 x C)
。
https://zhuanlan.zhihu.com/p/52529082
除此之外,3个串联的3x3卷积层的参数数量要比一个7x7卷积层的参数数量小得多,即3*3*3*C2/7*7C2 = 55%
,更少的参数意味着减少过拟合,而且更重要的是3个3x3卷积层拥有比1个7x7的卷积层更少的非线性变换(前者拥有3次而后者只有一次),使得CNN对特征的学习能力更强。
https://www.jianshu.com/p/15e413985f25
GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量来提升网络性能。但这种方式存在以下问题:
解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。
但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。
https://www.guyuehome.com/34487
Inception模块的基本机构如下图,整个Inception结构就是由多个这样的Inception模块串联起来的。
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层):
另一种表示
对上图说明如下:
GoogLeNet的网络结构图细节如下:
注:上表中的#3x3 reduce
,#5x5 reduce
表示在3x3
,5x5
卷积操作之前使用了1x1卷积的数量。
GoogLeNet网络结构明细表解析如下:
输入
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
第一层(卷积层)
使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作
第二层(卷积层)
使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作
第三层(Inception 3a层)
分为四个分支,采用不同尺度的卷积核来进行处理
第三层(Inception 3b层)
第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。
https://my.oschina.net/u/876354/blog/1637819
Inception结构的主要贡献有两个:
深度笔记|1x1卷积核的作用
VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。
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来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。
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)。
残差:观测值与估计值之间的差。
这里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
作者由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。
不同深度的ResNet
设计网络的规则:
对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。维度不匹配时,同等映射有两种可选方案:
注:本博客内容来教材和自网络整理,仅作为学习笔记记录,不用做其他用途。