Going deeper with convolutions
2014年,GoogLeNet和VGG获得了当年(ILSVRC14)的前两名。VGG主要是在AlexNet的基础上对网络进行改进,而GoogLeNet则是尝试了新的网络结构,深度只有22层,参数也少了很多。
相比与之前看过的论文不同的是Going deeper with convolutions不仅考虑了准确率之类的数据评估尺度,更考虑到了整个算法的效率和内存的使用(因为在嵌入式设备和手机上要考虑这些)。
Inception的主要优点也就是提高了网络中计算资源的利用率。
提升网络性能的最直接的方法就是增加网络的尺寸(宽度+深度,宽度指神经元数量,深度指层次数量),但是简单粗暴的增加尺寸有两个显著缺点
- 参数过多,如果训练的数据集有限,容易造成过拟合
- 网络越大,参数越多,计算复杂度越大,需要消耗更多计算资源
解决这两个缺点的方法是增加网路尺寸的同时减少参数。而要减少参数就考虑将全连接结构变成稀疏连接结构。但是目前而言,将全连接变成稀疏连接并没有太多意义。因为大多数硬件是基于密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
那么,有没有什么办法可以保持网络机构的稀疏性,又能利用密集矩阵提高计算性能。大量文献表示可以将稀疏矩阵聚类成相对密集的自矩阵来提高计算性能。因此GooLeNet团队提出Inception网路结构。
Inception
Inception是一个稀疏网络结构,但是能产生稠密数据。即能增加神经网络表现,又能保证计算资源的使用效率。
该结构将CNN中常用的卷积,池化堆叠在一起,最后将通道相加。
所有的卷积都将上一层的输出当作输入,那么对于5*5
的卷积计算量太大了。所以为了避免这种情况,在卷积之前加上了1*1
的卷积核,以起到降低特征图厚度的作用。
1*1
的卷积核主要为了减少维度。例如上一层输出为100*100*128
,经过256个通道的5*5
卷积之后(stride=1,pad=2),输出为100*100*256
。卷积层参数128*5*5*256=819200
。而假如上一层输出先经过32个通道的1*1
卷积,再经过256个通道5*5
的卷积之后,输出仍然为100*100*256
。但是卷积层参数减少之128*1*1*32+32*5*5*256=204800
,大约减少4倍。
Inception的优点在于增加了结点的数量,但是又没有把计算复杂度无限的增大。并且和人的直觉类似,即视觉信息应该以各种比例处理然后聚合,以便下一阶段能从不同尺寸抽象特征。
GoogLeNet
对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
GoogLeNet网络结构图
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类似,在此就不再重复。
参考
paper地址:https://arxiv.org/abs/1409.4842
https://my.oschina.net/u/876354/blog/1637819