2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet得到了第一名、VGG得到了第二名,这两类模型结构的共同特色是层次更深了。VGG继承了LeNet以及AlexNet的一些框架结构(详见 大话CNN经典模型:VGGNet),而GoogLeNet则作了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小不少,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,所以在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。算法
小知识:GoogLeNet是谷歌(Google)研究出来的深度网络结构,为何不叫“GoogleNet”,而叫“GoogLeNet”,听说是为了向“LeNet”致敬,所以取名为“GoogLeNet”网络
那么,GoogLeNet是如何进一步提高性能的呢?
通常来讲,提高网络性能最直接的办法就是增长网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在如下问题:
(1)参数太多,若是训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越日后穿越容易消失),难以优化模型。
因此,有人调侃“深度学习”实际上是“深度调参”。
解决这些问题的方法固然就是在增长网络深度和宽度的同时减小参数,为了减小参数,天然就想到将全链接变成稀疏链接。可是在实现上,全链接变成稀疏链接后实际计算量并不会有质的提高,由于大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,可是计算所消耗的时间却很难减小。框架
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献代表能够将稀疏矩阵聚类为较为密集的子矩阵来提升计算性能,就如人类的大脑是能够看作是神经元的重复堆积,所以,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。分布式
【问题来了】什么是Inception呢?
Inception历经了V一、V二、V三、V4等多个版本的发展,不断趋于完善,下面一一进行介绍ide
1、Inception V1
经过设计一个稀疏网络结构,可是可以产生稠密的数据,既能增长神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:
该结构将CNN中经常使用的卷积(1x1,3x3,5x5)、池化操做(3x3)堆叠在一块儿(卷积、池化后的尺寸相同,将通道相加),一方面增长了网络的宽度,另外一方面也增长了网络对尺度的适应性。
网络卷积层中的网络可以提取输入的每个细节信息,同时5x5的滤波器也可以覆盖大部分接受层的的输入。还能够进行一个池化操做,以减小空间大小,下降过分拟合。在这些层之上,在每个卷积层后都要作一个ReLU操做,以增长网络的非线性特征。
然而这个Inception原始版本,全部的卷积核都在上一层的全部输出上来作,而那个5x5的卷积核所需的计算量就太大了,形成了特征图的厚度很大,为了不这种状况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了下降特征图厚度的做用,这也就造成了Inception v1的网络结构,以下图所示:模块化
1x1的卷积核有什么用呢?
1x1卷积的主要目的是为了减小维度,还用于修正线性激活(ReLU)。好比,上一层的输出为100x100x128,通过具备256个通道的5x5卷积层以后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先通过具备32个通道的1x1卷积层,再通过具备256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减小为128x1x1x32 + 32x5x5x256= 204800,大约减小了4倍。oop
基于Inception构建了GoogLeNet的网络结构以下(共22层):性能
对上图说明以下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全链接层,该想法来自NIN(Network in Network),事实证实这样能够将准确率提升0.6%。可是,实际在最后仍是加了一个全链接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全链接,可是网络中依然使用了Dropout ;
(4)为了不梯度消失,网络额外增长了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用做分类,并按一个较小的权重(0.3)加到最终分类结果中,这样至关于作了模型融合,同时给网络增长了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练颇有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。学习
GoogLeNet的网络结构图细节以下:
注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操做以前使用了1x1卷积的数量。测试
GoogLeNet网络结构明细表解析以下:
0、输入
原始输入图像为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操做
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的实验结果来看,效果很明显,差错率比MSRA、VGG等模型都要低,对比结果以下表所示:
2、Inception V2
GoogLeNet凭借其优秀的表现,获得了不少研究人员的学习和使用,所以GoogLeNet团队又对其进行了进一步地发掘改进,产生了升级版本的GoogLeNet。
GoogLeNet设计的初衷就是要又准又快,而若是只是单纯的堆叠网络虽然能够提升准确率,可是会致使计算效率有明显的降低,因此如何在不增长过多计算量的同时提升网络的表达能力就成为了一个问题。
Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。
一、卷积分解(Factorizing Convolutions)
大尺寸的卷积核能够带来更大的感觉野,但也意味着会产生更多的参数,好比5x5卷积核的参数有25个,3x3卷积核的参数有9个,前者是后者的25/9=2.78倍。所以,GoogLeNet团队提出能够用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感觉野范围的同时又减小了参数量,以下图:
那么这种替代方案会形成表达能力的降低吗?经过大量实验代表,并不会形成表达缺失。
能够看出,大卷积核彻底能够由一系列的3x3卷积核来替代,那能不能再分解得更小一点呢?GoogLeNet团队考虑了nx1的卷积核,以下图所示,用3个3x1取代3x3卷积:
所以,任意nxn的卷积均可以经过1xn卷积后接nx1卷积来替代。GoogLeNet团队发如今网络的前期使用这种分解效果并很差,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。
二、下降特征图大小
通常状况下,若是想让图像缩小,能够有以下两种方式:
先池化再做Inception卷积,或者先做Inception卷积再做池化。可是方法一(左图)先做pooling(池化)会致使特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且下降计算量,将网络结构改成下图,使用两个并行化的模块来下降计算量(卷积、池化并行执行,再进行合并)
使用Inception V2做改进版的GoogLeNet,网络结构图以下:
注:上表中的Figure 5指没有进化的Inception,Figure 6是指小卷积版的Inception(用3x3卷积核代替5x5卷积核),Figure 7是指不对称版的Inception(用1xn、nx1卷积核代替nxn卷积核)。
经实验,模型结果与旧的GoogleNet相比有较大提高,以下表所示:
3、Inception V3
Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是同样(1x3,3x1),这样的好处,既能够加速计算,又能够将1个卷积拆成2个卷积,使得网络深度进一步增长,增长了网络的非线性(每增长一层都要进行ReLU)。
另外,网络输入从224x224变为了299x299。
4、Inception V4
Inception V4研究了Inception模块与残差链接的结合。ResNet结构大大地加深了网络深度,还极大地提高了训练速度,同时性能也有提高(ResNet的技术原理介绍见本博客以前的文章:大话深度残差网络ResNet)。
Inception V4主要利用残差链接(Residual Connection)来改进V3结构,获得Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。
ResNet的残差结构以下:
将该结构与Inception相结合,变成下图:
经过20个相似的模块组合,Inception-ResNet构建以下:
墙裂建议
2014至2016年,GoogLeNet团队发表了多篇关于GoogLeNet的经典论文《Going deeper with convolutions》、《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》、《Rethinking the Inception Architecture for Computer Vision》、《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》,在这些论文中对Inception v一、Inception v二、Inception v三、Inception v4 等思想和技术原理进行了详细的介绍,建议阅读这些论文以全面了解GoogLeNet。
关注本人公众号“大数据与人工智能Lab”(BigdataAILab),而后回复“论文”关键字可在线阅读这篇经典论文的内容。
推荐相关阅读