GoogLeNet笔记

GoogLeNet 笔记

论文:《Going deeper with convolutions》
《 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error 》
《Rethinking the Inception Architecture for Computer Vision, 3.5% test error 》
《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error 》
参考:大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
Batch Normalization论文解读与Inception V2代码简析
googleNet Inception v1 - v4 papers 发展历程
GoogLeNet 和 VGG在2014年的ImageNet比赛中分别获得第一名和第二名,这两个网络相较于AlexNet网络层次更深。GoogLeNet层数达到了22层,比AlexNet和VGG(15-18层)更深,但相较于他们参数更少只有500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此GoogLeNet相较于他们占用资源更小,速度更快,并且从最终的结果来看,它的性能也更好。
在这里插入图片描述

Motivation

一般来说提高网络的性能。我们一般通过提高网络的深度和宽度来实现,而一般深度和宽度的增加会导致参数的增加,这就会产生一些问题。
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
所以如何在增加网络宽度和深度的情况下减少或是参数不至于增加太多成为了问题的关键。通常卷积神经网络的主要有卷积层和全连接层构成,而网络的参数往往主要集中在全连接层,所以有人就想通过将全连接变为稀疏连接,但是这样做虽然可以引起参数的减少,但是由于大多数硬件都是针对密集矩阵进行优化的,所以这样计算消耗的时间依然很难减少。
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

Inception-V1

为了设计一个既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能的结构,Google提出了Inception结构(如下图):
图 1
在这个网络结构中,Filter concatenation的作用是将通道数相加,这种结构一方面可以增加网络的宽度,另一方面可以增加网络对不同尺度特征的适应性。
池化操作可以减小空间大小,降低过拟合。每一个卷积层后都做一个ReLU操作,增加网络的非线性特征。
但是,如果直接在上层输出的特征图上做卷积,所需的计算量会很大,。为了降低计算量,我们在卷积层之前和池化层之后加一个1*1的卷积核,降低特征图的维度(通道数),来降低计算量,这样就形成了Inception-V1结构(如下图):
图 2
1 *1卷积除了可以减少维度,还用于修正线性激活ReLU。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=SAME),输出数据100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。
基于Inception构建了GoogLeNet的网络结构如下(共22层):
在这里插入图片描述
(1)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(2) 虽然移除了全连接,但是网络中依然使用了Dropout ;
(3)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
(4)s表示SAME,v表示VALID。
GoogLeNet网络结构图细节如下:
在这里插入图片描述
注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量。
GoogLeNet网络结构明细表解析如下:
0、输入
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
1、第一层(卷积层)
使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作
2、第二层(卷积层)
使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作
经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作
3a、第三层(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
3b、第三层(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

第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。
最终的卷积层之后采用Global Average Pooling层,而不是全连接层,这有助于减少参数量,最近的分类网络也基本上是类似的思路。另外值得注意的一点是网络中间层有两个附属的loss,这是一种“深度监督”策略,文中说是为了避免梯度消失问题,也是一种正则化手段。

在这里插入图片描述
从GoogLeNet的实验结果来看,效果很明显,差错率比MSRA、VGG等模型都要低,对比结果如下表所示:
在这里插入图片描述

Inception-V2

Inception-V2是inception系列的中间产物,它的思想来源于《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》和《Rethinking the Inception Architecture for Computer Vision》这两篇论文。它根据第一篇论文加入了BN层。根据第二篇论文用一系列更小的卷积核(3x3)替代了原来的大卷积核(5x5,7x7)。

Batch Normalization

在训练神经网络的过程中,因为前一层的参数变化而导致每层的输入分布都在不断变化,作者把这种现象叫做internal covariate shift。这种现象会导致我们需要设置更小的learning rate,需要很小心设置参数的初始值,否则网络可能训练变慢难以收敛。

如果训练集和测试集的分布不同,即样本之间存在covariate shift,这种情况会影响训练的精度。而internal covariate shift是指数据通过一层一层网络传播的过程中,由于参数的变化,而引起激活值分布发生变化。而且如果网络非常深,每一层的激活值可能越来越分散,如果用sigmoid激活函数,越来越大的x值可能导致导数接近0,这就是梯度消失的原因,梯度消失会导致训练越来越缓慢而难以收敛。而使用Relu激活并且合适的参数初始化和较小的学习率可以改善这个现象,但是数据仍有发散的可能性。

而当加入BN后,internal covariate 现象可以得到缓解,并且还可以加速训练,如果加大学习效率,依然可以收敛,即使使用sigmoid激活依然不会产生梯度消失的后果,BN也具有轻度的正则化的效果。
在这里插入图片描述
上图就是batch normalization的公式。第一行是求minibatch的均值,第二行是求minibatch的方差,第三行就是BN的操作,为了防止方差为0而导致除数为0,增加了一个很小的。第四行增加了和进行缩放和偏移是为了让隐藏层之间有稍微不同的分布,也增加了非线性效果。另外BN的运算需要在激活函数之前,如果在之后,BN运算可能会抵消了激活函数的效果。
在这里插入图片描述
上图是求导公式。

进行BN操作的好处是:
(1)对每一层的输入做了类似标准化处理,能够预防梯度消失和梯度爆炸,加快训练的速度。
(2)减少了前面一层参数的变化对后面一层输入值的影响,每一层独立训练,有轻微正则化效果

卷积分解

使用大的卷积可以带来更大的感受野,但也同时需要更多的擦参数,比如5 * 5的卷积要比3 * 3多25/9=2.78倍。所以Google提出使用两个3 * 3的卷积代替一个5 * 5卷积的方法,降低了网络的参数,如下图所示:
在这里插入图片描述
但是这样做会降低网络的表达能力吗?通过大量实验表面,这样做并不会造成表达能力的下降,所以我们可以把大的卷积核用3 * 3的卷积核来代替。
3x3卷积之后还要再加激活吗? 作者也做了对比试验,表明添加非线性激活会提高性能。

上图为Inception-V2结构。
在这里插入图片描述
上图为通过google开源的代码画出的inception-V2的总体网络结构。

Inception-V3

在inception-V2中我们用33的卷积核代替55的卷积核,那么能否继续缩小呢,如下图所示我们用13和31 的卷积核来代替3*3的卷积核。
在这里插入图片描述

所以,任意大小的n * n卷积核都可以用1 * n接 n * n 的卷积核来代替(那么直接将5 * 5的核用1 * 5接5 * 1还是先分解为3 * 3在分解为1 * 3接3 * 1?), 但是GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。
在这里插入图片描述
对于抽样降维,传统的方法有先池化在卷积或先卷积再池化,即如下图所示。
在这里插入图片描述
上图左边先池化会导致特征缺失,上图右边计算会比较大,为了保证特征表示和计算量,将结构改为下图,卷积核池化并行然后进行合并:
在这里插入图片描述
使用Inception V3作改进版的GoogLeNet,网络结构图如下:
在这里插入图片描述
注:上表中的Figure 5指没有进化的Inception,Figure 6是指小卷积版的Inception(用3x3卷积核代替5x5卷积核),Figure 7是指不对称版的Inception(用1xn、nx1卷积核代替nxn卷积核)。作者在论文中将上图结构说成inceptionV2结构但是根据谷歌开源的代码可以看出该结构为V3结构,我们已代码为准。
经实验,模型结果与旧的GoogleNet相比有较大提升,如下表所示:在这里插入图片描述

Inception-V4

Inception-V4研究了Inception模块与残差连接的结合。ResNet结构大大地加深了网络深度,还极大地提升了训练速度,同时性能也有提升。
Inception-V4主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。
ResNet的残差结构如下:
在这里插入图片描述
将该结构与Inception相结合,变成下图:
在这里插入图片描述
通过20个类似的模块组合,Inception-ResNet构建如下:
在这里插入图片描述

总结

(1) Inception v1的网络,将1x1,3x3,5x5的conv和3x3的pooling,stack在一起,一方面增加了网络的width,另一方面增加了网络对尺度的适应性;
(2) v2的网络在v1的基础上,进行了改进,一方面了加入了BN层,减少了Internal Covariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯,另外一方面学习VGG用2个3x3的conv替代inception模块中的5x5,既降低了参数数量,也加速计算;
(3) v3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块;
(4)v4研究了Inception模块结合Residual Connection能不能有改进?发现ResNet的结构可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet v2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet v2相媲美的性能。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值