GoogleNet详解

Inception(也称GoogLeNet)是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。Inception的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。

1. 核心思想

inception模块的基本机构如下图,整个inception结构就是由多个这样的inception模块串联起来的。inception结构的主要贡献有两个:

  • 一是使用1x1的卷积来进行升降维
  • 二是在多个尺寸上同时进行卷积再聚合

在这里插入图片描述
inception之所以可以多个尺寸的核分解然后再拼接的具体计算图:
在这里插入图片描述

1.1 1x1卷积的作用

  • 作用一:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。
    这个观点来自于Network in Network(NIN, https://arxiv.org/pdf/1312.4400.pdf),图1里三个1x1卷积都起到了该作用。
    在这里插入图片描述
    上图左侧是是传统的卷积层结构(线性卷积),在一个尺度上只有一次卷积;上图右侧是Network in Network结构(NIN结构),先进行一次普通的卷积(比如3x3),紧跟再进行一次1x1的卷积,对于某个像素点来说1x1卷积等效于该像素点在所有特征上进行一次全连接的计算,所以右侧图的1x1卷积画成了全连接层的形式,需要注意的是NIN结构中无论是第一个3x3卷积还是新增的1x1卷积,后面都紧跟着激活函数(比如relu)。将两个卷积串联,就能组合出更多的非线性特征。
    举个例子,假设第1个3x3卷积+激活函数近似于 f 1 ( x ) = a x 2 + b x + c f1(x)=ax2+bx+c f1(x)=ax2+bx+c,第二个1x1卷积+激活函数近似于 f 2 ( x ) = m x 2 + n x + q f2(x)=mx2+nx+q f2(x)=mx2+nx+q,那 f 1 ( x ) f1(x) f1(x) f 2 ( f 1 ( x ) ) f2(f1(x)) f2(f1(x))比哪个非线性更强,更能模拟非线性的特征?答案是显而易见的。NIN的结构和传统的神经网络中多层的结构有些类似,后者的多层是跨越了不同尺寸的感受野(通过层与层中间加pool层),从而在更高尺度上提取出特征;NIN结构是在同一个尺度上的多层(中间没有pool层),从而在相同的感受野范围能提取更强的非线性。

  • 作用二:使用1x1卷积进行降维,降低了计算复杂度。
    上图右侧中间3x3卷积和5x5卷积前的1x1卷积都起到了这个作用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。
    下图是优化前后两种方案的乘法次数比较,同样是输入一组有192个channel、32x32大小,输出256个channel的数据,第一张图直接用3x3卷积实现,需要192x256x3x3x32x32=452984832次乘法;第二张图先用1x1的卷积降到96个channel,再用3x3卷积恢复出256个channel,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法,使用1x1卷积降维的方法节省了一半的计算量。有人会问,用1x1卷积降到96个特征后特征数不就减少了么,会影响最后训练的效果么?答案是否定的,只要最后输出的channel数不变(256个),中间的降维类似于压缩的效果,并不影响最终训练的结果。
    在这里插入图片描述

2.2 多个尺寸上进行卷积再聚合

从inception模块中可以看到,对输入的操作一共有4个分支,分别用不同尺寸的filter进行卷积或池化,最后再concatenate到一起。这样做有什么作用呢?作者做如下解释:

  • 在直观感觉上在多个尺度上同时进行卷积,能提取到不同尺度的特征。特征更为丰富也意味着最后分类判断时更加准确。

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

  • Hebbin赫布原理。
    Hebbin原理是神经科学上的一个理论,解释了在学习的过程中脑中的神经元所发生的变化,用一句话概括就是fire togethter, wire together。赫布认为“两个神经元或者神经元系统,如果总是同时兴奋,就会形成一种‘组合’,其中一个神经元的兴奋会促进另一个的兴奋”。比如狗看到肉会流口水,反复刺激后,脑中识别肉的神经元会和掌管唾液分泌的神经元会相互促进,“缠绕”在一起,以后再看到肉就会更快流出口水。
    用在inception结构中就是要把相关性强的特征汇聚到一起。这有点类似上面的解释2,把1x1,3x3,5x5的特征分开。因为训练收敛的最终目的就是要提取出独立的特征,所以预先把相关性强的特征汇聚,就能起到加速收敛的作用。

在inception模块中有一个分支使用了max pooling,作者认为pooling也能起到提取特征的作用,所以也加入模块中。注意这个pooling的stride=1,pooling后没有减少数据的尺寸。

2. GoogleNet

GoogleNet结构在在某些层级上加了分支分类器,输出的loss乘以个系数再加到总的loss上,作者认为可以防止梯度消失问题(事实上在较低的层级上这样处理基本没作用,作者在后来的inception v3论文中做了澄清)。

GoogleNet一共有22层,22层是只算有参数的层,max-pooling那些没有参数的层就不算了。
在这里插入图片描述

对上图做如下说明:
(1)GoogLeNet采用了Inception模块化(9个)的结构,共22层,方便增添和修改;
(2)网络最后采用了average pooling来代替全连接层,想法来自NIN,参数量仅为AlexNet的1/12,性能优于AlexNet,
事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便finetune;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。
文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。
此外,实际测试的时候,这两个额外的softmax会被去掉

2.1 代码实现

具体代码讲解可以到这里看:
https://blog.youkuaiyun.com/stesha_chen/article/details/81259857。
不过tensorflow官方在github上已经公开了源码,在这里

3.说明

感觉这些基础模块还是知道个大概就好了。具体代码实现还得花很多心思去弄懂。接下来去看看了解一下ResNet和别的backbone了,了解一下思想就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zedjay_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值