Bootstrap

论文精读之--GoogLeNet

论文精读之–GoogLeNet

1.GooLeNet概述以及意义

 GoogLeNet是2014年Google团队提出的,其中L为大写,目的是为了致敬LeNet。
 论文的多处命名来自于电影盗梦空间。GoogLeNet主要的模型是Inception(中文翻译为盗梦空间)。论文题目为《Going deeper with convolutions》,来自于该图片:
在这里插入图片描述

 GoogLNet当年取得了ILSVRC 2014年分类冠军,检测冠军以及定位亚军。开启了多尺度,1*1卷积时代,以及衍生了GooLeNet v2 v3 v4系列。

2.过去模型痛点以及相关研究的启发

2.1 模型发展痛点

 从LeNet-5开始,卷积神经网络通常具有标准的结构—堆叠的卷积层,和一个或者多个完全连接层。对于较大的数据集,网络设计的趋势就是增加层数和每层大小,同时使用了dropout来解决过拟合问题。
  虽然增加网络的层数和每层的大小是训练更高级模型的一种简单而安全的方式。但是这种方案通常会有很多缺点。首先是更深层次的网络模型会带来大量的的参数,这会导致网络中产生过拟合问题。并且参数过多导致计算量过大,计算成本高昂,难以实现。

2.2 相关研究的启发

 在Network in NetWork(NIN)中首次提出采用1 × \times × 1卷积的卷积神经网络,并且舍弃了全连接层。使用1 × \times × 1卷积网络后会显著减少参数的数量。比如上一层输入是100 × \times × 100 × \times × 128,经过256个5 × \times × 5的卷积层(stride=1,padding=2)后,参数量为5 × \times × 5 × \times × 128 × \times × 256=819200。但如果先经过一个32个1 × \times × 1卷积核,再经过256个5 × \times × 5卷积核后。参数为1 × \times × 1 × \times × 128 × \times × 32+5 × \times × 5 × \times × 32 × \times × 256=204800.。减少了4倍。
 总结一下1 × \times × 1卷积的作用:

  • 降维或者升维
  • 跨通道信息交融
  • 减少参数量
  • 增加模型深度提高非线性的表达能力

 Global Average Pooling(GAP)的使用是为了舍弃全连阶层。传统的CNN最后会将所有的feature map展平后放入全连接层,最后通过softmat得到输出分类信息,全连阶层中的参数往往会占据卷积网络中参数的一大部分。因此采用GAP可以减少网络中参数的数目。
 GAP放到最后一层,将卷积层设为和类别数目一致,对于每一层的feature map取平均值作为一个chananel的代表。最终输出分类结果。
  解决由于网络层数的加深带来的参数过大问题的根本方法是从完全连接到稀疏矩阵的架构。一方面现实生物神经系统的连接也是稀疏的,另一方面有文献也表明:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。而且这一说法与众所周知的Hebbian原理(neurons that fire together, wire together)产生了共鸣。赫布认为“两个神经元或者神经元系统,如果总是同时兴奋,就会形成一种‘组合’,其中一个神经元的兴奋会促进另一个的兴奋”。
 所以,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,据此论文提出了名为Inception 的结构来实现此目的。在inception结构中就是要把相关性强的特征汇聚到一起。

3.Inception模型结构特点

Inception架构的主要思想是怎样用密集成分来近似最优的局部稀疏结构。inception的原始版本如下:

从图中可以看出它采用的是多尺度并行卷积、池化,分别用了1 × \times × 1的卷积核,3 × \times × 3的卷积核,5 × \times × 5的卷积核。卷积核的大小没有什么具体要求,这样设置只是为了更好的对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了。同时在最右侧加了一个3 × \times × 3的最大池化。池化层能够保留特征图的数量,相比与卷积操作,用少量的运算就能提取出每个通道的特征。卷积池化后形成的。
 此外多尺度融合,直观上,多个尺度上同时卷积可以提取到不同尺度的特征。而这也意味着最后分类判断更加准确。
 然而网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。这就会导致随着网络深度加深会导致大量的计算。而且由于pooling层不改变其通道数,通道特征图会很多。
 因此有了改进版本
在这里插入图片描述
受到Network in NetWork(NIN)的启发,采用1 × \times × 1的卷积来进行降维,使得计算量大大减少。
在这里插入图片描述
而且两个卷积串联,能组合出更多的非线性特征。NIN的结构和传统的神经网络中多层的结构有些类似,后者的多层是跨越了不同尺寸的感受野(通过层与层中间加pool层),从而在更高尺度上提取出特征;NIN结构是在同一个尺度上的多层(中间没有pool层),从而在相同的感受野范围能提取更强的非线性。

4.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类似,在此就不再重复。
GoogleNet的结构就是3+3+3总共九个inception模块组成的,每个Inception有两层,加上开头的3个卷积层和输出前的FC层,总共22层!然后每3层的inception之后都会有一个输出结果,这个网络一共有三个输出结果,

5.其他细节

在这里插入图片描述 (1)虽然移除了全连接,但是网络中依然使用了Dropout ,以70%比例失活神经元。
 (2)网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune。
 (3)稀疏结构:

 下图左侧是个稀疏矩阵(很多元素都为0,不均匀分布在矩阵中),和一个2x2的矩阵进行卷积,需要对稀疏矩阵中的每一个元素进行计算;如果像右图那样把稀疏矩阵分解成2个子密集矩阵,再和2x2矩阵进行卷积,稀疏矩阵中0较多的区域就可以不用计算,计算量就大大降低。这个原理应用到inception上就是要在特征维度上进行分解!
在这里插入图片描述
 而inception模块在多个尺度上提取特征(比如1x1,3x3,5x5),输出的256个特征就不再是均匀分布,而是相关性强的特征聚集在一起(比如1x1的的96个特征聚集在一起,3x3的96个特征聚集在一起,5x5的64个特征聚集在一起),这可以理解成多个密集分布的子特征集。这样的特征集中因为相关性较强的特征聚集在了一起,不相关的非关键特征就被弱化,同样是输出256个特征,inception方法输出的特征“冗余”的信息较少。用这样的“纯”的特征集层层传递最后作为反向计算的输入,自然收敛的速度更快。

6.训练技巧

(1)辅助损失
 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。在Inception4b和Inception4e中增加了两个辅助分类层,用于计算辅助损失,增加loss回传。还可以充当正则约束,迫使中间层特征也具备分类能力。此外,实际测试的时候,这两个额外的softmax会被去掉。
(2)学习率下降策略
没8个epoch下降4%,800个epochs才下降不到100倍
(3)数据增强

  • 图像尺寸均匀分布在8%-100%之间
  • 长宽比在[3/4-4/3]之间
  • 在亮度、饱和度和对比度会减轻过拟合

7.测试技巧

Multi crop
1张变成144张

  • 等比例缩放短边到256,288,320,352,四种尺寸
  • 在长边上裁剪出3个正方形,左中右或者上中下,三个位置。
  • 左上,右上,左下,右下,中心,全局resize六个位置
  • 水平镜像
    4 × \times × 3 × \times × 6 × \times × 2=144

8.论文创新点总结

  • 使用了1*1的卷积,降低维度, 减少参数量,减少计算量,增加模型深度跨深度信息交融,提高非线性的表达能力。
  • 采用并行的多尺度卷积核,实现了多尺度的信息提取
  • 添加了辅助损失层,增加梯度回传,增加正则项,减轻过拟合

9.其他一些

  • 虽然增加深度和宽度可以提高性能,但是容易过拟合而且计算量过大,当前算力不够
  • 使用inception module时候 要先利用传统的卷积池化卷积池化进行处理,将分辨率降低,节省内存
  • 虽然采用了GAP代替全连接层 ,但是在输出的时候还是用了一个全连接层,是为了方便迁移学习。
  • 数据增强技巧:尺寸在8%-100%,长宽比在【3/4-4/3】之间,光照畸变有效
;