GoogLeNet

完整代码:GoogLeNet实现完整代码

GoogLeNet

GoogLeNet中的Le据说是为了致敬前辈LeNet。
GoogLeNet在2014的ImageNet分类任务上击败了VGGNet夺得冠军。GoogLeNet在加深网络的同时(22层),也在网络结构上做了创新,引入Inception结构代替了单纯的卷积+激活的传统操作。GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择,从模型结果来看,GoogLeNet的性能更加优越。
相关论文
2014至2016年,GoogLeNet团队发表了多篇关于GoogLeNet的经典论文:
Inception V1:《Going deeper with convolutions》
Inception V2:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
Inception V3:《Rethinking the Inception Architecture for Computer Vision》
Inception V4:《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》
在这里插入图片描述

Inception V1

动机

提高深层神经网络性能最直接的方法是增加它们的大小,这包括增加网络深度(层数)和宽度(每层神经元数)。然而这意味着网络拥有更多的参数量,并且网络过大,在有限的数据集下训练时,更易导致过拟合。另外,网络大意味着需要更多的计算资源。
为解决这两个问题谷歌设计了一个稀疏网络结构,但是能够产生稠密的数据,这样既能增加神经网络表现,又能保证计算资源的使用效率。这就是最原始的Inception基本结构,如下图:
在这里插入图片描述
上图结构将CNN中常用的卷积( 1 1 1x 1 1 1 3 3 3x 3 3 3 5 5 5x 5 5 5)、池化操作( 3 3 3x 3 3 3)堆叠在一起(卷积、池化后的尺寸相同,将通道合并)。这样一方面增加了网络的宽度,另一方面增加了网络对尺度的适应性。
网络卷积层能够提取输入的每个细节信息。同时, 5 5 5x 5 5 5 的卷积核能够覆盖大部分接受层的输入。池化操作用以减少空间大小,降低过度拟合。每个卷积层后都有ReLu激活函数,以增加网络的非线性特征。
然而,原始版本的Inception有个很大的缺点就是参数量和计算量会很大。将三个卷积层和一个池化层的输出拼接后的feature map数量会变得很大,随着网络层数的增加,模型会变得很复杂,变得难以训练。为了避免这种情况,在 3 3 3x 3 3 3 前、 5 5 5x 5 5 5 前、池化后分别加上了 1 1 1x 1 1 1 的卷积核,以起到了降低特征图数量的作用,这也就形成了Inception v1的网络结构,如下图所示:
在这里插入图片描述

1 1 1x 1 1 1 卷积核的作用

1 1 1x 1 1 1 卷积核最早现在 Lin et al. 的 Network in Network 中,以增加网络深度,提高网络表征能力。
GoogLeNet 中大量使用 1 1 1x 1 1 1 卷积核,主要用作降维模块来消除计算瓶颈,否则会限制网络的规模。不仅可以增加网络的深度,还可以增加网络的宽度,而不会显著影响网络性能。
举个例子:假设上一层的输出为(100,100,128),经过(5,5,256)的卷积层之后(same填充),输出数据为(100,100,256),其中,卷积层的参数为 128x5x5x256= 819200。而假如上一层输出先经过(1,1,32)的卷积层,再经过(5,5,256)的卷积层,输出数据仍为为(100,100,256),但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,约减少4倍。

GoogLeNet网络结构

基于Inception构建了GoogLeNet的网络结构如下(共22层):
在这里插入图片描述
上图解释:

  1. GoogLeNet采用模块化的结构Inception,方便增添和修改,
  2. 网络最后采用了AVG(平均池化)来代替全连接层,该想法来自Network in Network,事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整,
  3. 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
网络参数细节

GoogLeNet参数细节如下表:
在这里插入图片描述
注:上表中的“# 3 3 3x 3 3 3 reduce”,“# 5 5 5x 5 5 5 reduce”表示在 3 3 3x 3 3 3 5 5 5x 5 5 5 卷积操作之前使用了1x1卷积操作。

GoogLeNet网络结构明细表解析如下:
0、输入层
原始输入图像为224x224x3,且都进行了零均值化的预处理操作
1、第一层(卷积层)
使用(7,7,64)的卷积核(滑动步长为2,padding为3),输出为(112,112,64),卷积后进行ReLu激活操作
经过(3,3)的Max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即(56,56,64),再进行ReLu激活操作
2、第二层(卷积层)
使用(3,3,193)的卷积核(滑动步长为1,padding为1),输出为(56,56,192),卷积后进行ReLU操作
经过(3,3)的Max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即(28,28,192),再进行ReLU操作
Inception 3a、第三层

  1. 使用(1,1,64)的卷积核,然后RuLu激活,输出(28,28,64)
  2. 使用(1,1,96)的卷积核,输出(28,28,96),然后进行ReLu激活,再进行(3,3,128)的卷积(padding为1),输出(28,28,128)
  3. 使用(1,1,64)的卷积核,输出(28,28,16),进行ReLu激活,再进行(5,5,32)的卷积(padding为2),输出(28,28,32)
  4. pooling层,使用(3,3)的核(padding为1),输出(28,28,192),然后进行(1,1,32)的卷积,输出(28,28,32)。
    将四个结果按照最后一个维度进行拼接,即64+128+32+32=256,最终输出(28,28,256)。

Inception 3b、第三层

  1. 使用(1,1,128)卷积核,然后RuLu激活,输出(28,28,128)
  2. 使用(1,1,128)的卷积核,输出(28,28,128),进行ReLu激活,再进行(3,3,192)的卷积(padding为1),输出(28,28,192)
  3. 32个1x1的卷积核,输出(28,28,32),进行ReLu激活,再进行(5,5,96)的卷积(padding为2),输出(28,28,96)
  4. pool层,使用(3,3)的核(padding为1),输出(28,28,256),然后进行(1,1,64)的卷积,输出(28,28,64)。
    将四个结果按照最后一个维度进行拼接,即128+192+96+64=480,最终输出输出为(28,28,480)。

第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似

Inception V2

Inception V2 最重要的一个贡献就是提出了Batch Normalization。

Inception V3

GoogLeNet设计的初衷就是要又准又快,而如果只是单纯的堆叠网络虽然可以提高准确率,但是会导致计算效率有明显的下降,所以如何在不增加过多计算量的同时提高网络的表达能力就成为了一个问题。
Inception V2 版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。

卷积分解 (Factorizing Convolutions)

大尺寸卷积核能带来更大的感受野,但也意味着会产生更多的参数,比如(5,5)卷积核参数有25个,(3,3)卷积核参数有9个,前者是后者的25/9=2.8倍。因此,GoogLeNet团队提出可以用2个(3,3)卷积层代替单个(5,5)卷积层,即在保持感受野范围的同时又减少了参数量,如下左图(Figure.1)。图中看出,大卷积核完全可以由一系列的(3,3)卷积核来替代。

不对称卷积分解

卷积核能不能再分解得更小一点呢?GoogLeNet团队考虑了nx1的卷积核,如下右图(Figure.2),用(3,1)取代(3,3)卷积。因此,任意(n,n)的卷积都可以通过(1,n)卷积后接(n,1)卷积来替代。GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
降低特征图大小

一般情况下,如果想让图像缩小,可以有如下两种方式:

在这里插入图片描述在这里插入图片描述

方法一 :Figure.9(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失)
方法二: Figure.9(右图)是正常的缩小,但计算量很大。
为了同时保持特征表示且降低计算量,将网络结构改为Figure.10,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)

Inception V2网络结构

在这里插入图片描述

Inception V4

在论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中,介绍了Inception-ResNet-v1Inception-ResNet-v2Inception-v4网络。Inception V4研究了Inception模块与残差连接的结合。

残差网络
在这里插入图片描述在这里插入图片描述
Inception V4构件
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

Figure.9说明了Inception V4的组成。
Figure.15说明了Inception-ResNet-v1Inception-ResNet-v2的组成。

残差缩放

如果卷积核数量突破1000,残差的各种变体开始变得不稳定和网络过早”死亡”, 这意味着平均池化之前的最后一层在经过数万次迭代后才开始产生零。即使使用低学习率或者BN,也无法避免这种情况的出现。
我们发现,在将残差添加到上一层激活之前,缩小残差,似乎可以稳定训练。 一般来说,我们选择了0.1到0.3之间的一些缩放因子来缩放残差,然后将它们添加到累积层激活中。见Figure.20。
He(ResNet作者)等人观察到类似的不稳定性。 ResNet论文中,在非常深的剩余网络的情况下,He建议进行两阶段的训练,其中第一个“warm-up”阶段使用非常低的学习率,然后是第二阶段使用高学习率。 我们发现,如果卷积核的数量很大,那么即使是很低的(0.00001)学习率也不足以应对不稳定性,而高学习率的训练有几率破坏这种影响。
即使在没有必要严格进行缩放的情况下,它似乎从未损害最终的准确性,但它有助于稳定训练。

keras实现代码

Inception V1
Inception V3
Inception V4
Inception-Resnet-v1
Inception-Resnet-v2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值