深度学习网络篇——GoogLeNet


我们按照 《Going Deeper with Convolutions》 论文来进行学习和分享。


作者:Christian Szegedy,现在Google就职
(看这背景是在蹦迪??)
再次安利一下这篇论文,逻辑通顺,思路清晰,比赛拿了第一还是很谦虚,该吹的吹该捧的捧,不如自己的也不踩,好感UP。

一样的套路,还是先说一下这篇论文的重点

  1. 提升网络性能 —— 使用更宽更深的网络;
  2. 减少计算资源需求—— 稀疏连接代替稠密连接(小卷积核的应用);
  3. 提升算法性能(提高计算资源利用率) 既利用稀疏性又使用稠密计算——1ⅹ1卷积的应用;
  4. Inception 模块的应用;

搞GoogLeNet的目的

究根结底当然就是要提升网络性能啦。自从有了1ⅹ1卷积(NIN)VGGNet以后,大家发现大网络对深度学习的性能提升好处简直太多啦,于是神经网络开始在变得更深以及更宽(胖)的路上一去不复返了,但是呢,网络变深变大有几个无法忽视的弱点
• 参数数量大幅增加,以及由此带来的过拟合问题
• 对计算资源需求很高

在之前的几个网络结构中,过拟合问题及计算资源问题很大程度限制了网络尺寸的增长,作者受生物学中Hebbian法则 “有些神经元响应基本一致,即同时兴奋或抑制” 的启示,想到了可以引入稀疏性并将全连接层替换成稀疏的全连接层

什么是稀疏性?

论文原话: “如果数据集的概率分布可以通过一个大型稀疏的深度神经网络表示,则最优的网络拓扑结构可以通过分析前一层激活的相关性统计和聚类高度相关的神经元来一层层的构建。”
先从稀疏矩阵的角度来理解一下稀疏性,稀疏矩阵的定义:矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵。由于稀疏矩阵的特殊性质,在对稀疏矩阵进行卷积运算时往往会产生很多不必要的计算(在0值密集的区域进行卷积),这时候为了提升运算效率就可以考虑忽略矩阵中0值聚集的区域而选取出非零值聚集的区域直接卷积。
联系稀疏矩阵的计算,作者自然而然有了想法:能不能设计个网络,既能引入稀疏性又能有效的使用密集计算呢?答案是:能!

架构搭建和理解

Inception 模块naïve版

正如前面说的,作者希望能在引入稀疏性的同时有效使用密集计算,也就是考虑怎样近似卷积视觉网络的最优稀疏结构并用容易获得的密集组件进行覆盖,这意味着网络将以卷积构建块为基础进行搭建。这个卷积构建块就是GoogLeNet里的Inception模块
下图所示就是原始版本的Inception模块:


问题来了,模块为什么要这样搭?
1. 从模块各分支选择来看:
1ⅹ1卷积:前文中说过,引入稀疏性的最优架构应该考虑来自上一层的信息的相关性,并把具有高相关性的信息进行聚集,考虑到在网络低层时,这些高相关性信息(特征)往往集中在局部区域,那么此时引入1ⅹ1卷积的作用就是对这些来自上一层的较小区域内的信息进行汇聚。
3ⅹ3卷积、5ⅹ5卷积:1ⅹ1卷积实现了对低级信息(低级特征,诸如轮廓、纹理等)的聚类后,我们发现随着网络的加深,也会出现数量较少的在更大空间上扩展的聚类,可以被更大的块上的卷积覆盖,这时候就可以使用3ⅹ3卷积、5ⅹ5卷积来获取较大块 内的高相关性信息(高级特征,更具分辨性的特征)。这一版Inception架构形式的滤波器的尺寸仅限于1×1、3×3、5×5,这个决定更多的是基于便易性而不是必要性。同时,由于较高层将会捕获更多抽象特征,且空间集中度会相应减少,因此在高层中3×3、5×5卷积将会应用的更多一些。
池化:引用论文原话:由于池化操作对于目前卷积网络的成功至关重要,因此建议在每个这样的阶段添加一个替代的并行池化路径应该也应该具有额外的有益效果。
2. 从引入稀疏性角度来看:
作者提出要用稀疏连接替代全连接方式。而前文说过,稀疏矩阵的运算可以用稠密运算来近似,实现方法可以从两个角度来理解。从卷积运算本身来说: 稀疏连接指的是每个卷积核在图像的局部(关键)区域进行卷积而忽略稀疏(背景环境)区域,这就是传统的CNN运算;从Feature map(特征)维数角度来说: 使用多分支多个尺寸卷积核对图像进行卷积,每个尺寸卷积核(分支)提取出对应的高相关性特征,而每个分支得到的结果在通道维度上进行拼接,这就相当于把各个分支提取出的高相关性特征在通道维度上进行了聚合,这样一来作者就 真正实现了使用稠密运算来近似稀疏连接的目的。


如此一来,原始版本的Inception模块就搭建完成了,不过既然称之为原始(naive)版本,就说明它还是比较naive,还是存在问题的。问题就是整个网络是通过大量堆叠这个模块来构建的,即使是适量的5×5卷积也会产生参数的爆炸式增长,再加上池化层对参数数量的影响,导致这个naïve的Inception模块效率非常低下。

Inception模块正式版1.0

针对naïve版本出现的参数爆炸问题,作者对之前NIN论文里面提出的1ⅹ1卷积有了想法,我们在之前的NIN论文分享的文章里提到过,1ⅹ1卷积还有一个buff加成:特征降维(后文将在具体应用中讲解降维以及减少参数是如何实现的)
作者想着既然3×3、5×5卷积和池化操作导致的维数灾难进一步导致了参数爆炸,那就干脆在这些分支上加一个1ⅹ1卷积把维数降下去,这么一想简直完美啊,不仅能进一步跨通道聚合信息,还顺手把参数爆炸问题解决了。(想起一个老师说过的话:我们就多努力一下,说不准就会有意外收获呢)
至于为什么要把1ⅹ1卷积加在3×3、5×5卷积前,论文里的解释是有时候低维卷积也可能包含大量较大图像块的信息,如果经过1ⅹ1卷积以密集、压缩的形式来表示信息将导致信息很难进行处理,所以应该在大多数地方保持稀疏,并且仅在它们必须汇总时才压缩信号。因此要把1ⅹ1卷积加在3×3、5×5卷积前。
我们来看看Inception模块正式版1.0:

GoogLeNet 整体架构

讲完了基础Inception模块的结构,接下来就可以来看看GoogLeNet的整体架构了。
GoogLeNet应该是我们学到目前为止最深的一个网络了,原论文里说如果只计算有参数的层整个网络的层数是22层,把池化层也算入的话是27层(不过按照代码里网络搭建部分来看,除去最后的GAP层、全连接层和softmax层,特征提取部分应该是25层),虽然说跟现在一些上千层的网络没法比,但是在当时也算是一个质的飞跃了。
在GoogLeNet v1中,所有的卷积都使用了Relu激活(包括Inception模块中的1ⅹ1卷积、3×3卷积和5×5卷积);分类器部分,先是将特征提取器输出的feature map经过一个GAP层,再进行输出维数为最终类别数的1ⅹ1卷积(线性层,带dropout),最后接一个softmax进行分类。
此外,GoogLeNet还有一个比较有特色的点是加上了辅助分类器。考虑到先前较浅网络同样具有的强大性能,作者认为在深度较大的网络里中部层的特征还是有比较强的识别力的,因此在Inception(4a)和Inception(4b)模块的输出上添加了辅助分类器。在训练期间,这些辅助分类器的损失以0.3的权重加到整个网络的输出上,在预测的时候,这些辅助分类器则被丢弃。
辅助分类器如图所示:

网络具体参数配置(如图):

在这里插入图片描述


Inception(3a) 为例讲解一下是如何利用1ⅹ1卷积来实现降维的:
在这里插入图片描述
可知,Inception(3a)来自上一层的输入数据尺寸为28ⅹ28ⅹ192,那么:

第一个分支(branch0): 1ⅹ1卷积,卷积核数量为64,因此branch0参数数量为:1ⅹ1ⅹ192ⅹ64,;输出尺寸为:28ⅹ28ⅹ64
第二个分支(branch1):1ⅹ1卷积(96个卷积核)+3ⅹ3卷积(128个卷积核),因此branch1参数数量为:1ⅹ1ⅹ192ⅹ96+3ⅹ3ⅹ96ⅹ128;输出尺寸为:28ⅹ28ⅹ128
第三个分支(branch2):1ⅹ1卷积(16个卷积核)+5ⅹ5卷积(32个卷积核),因此branch2参数数量为:1ⅹ1ⅹ192ⅹ16+5ⅹ5ⅹ16ⅹ32;输出尺寸为:28ⅹ28ⅹ32
第四个分支(branch3):maxpool+1ⅹ1卷积(32个卷积核),因此branch3输出尺寸为:28ⅹ28ⅹ32;

可以看出,四个branch的输出有相同的尺寸,仅深度(通道数)不同,最后经过通道维度上的拼接,得到改进版本
输出通道数: 64+128+32+32=256
参数数量: 1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)=15872
同理计算可知原始版本
输出通道数: 64+128+32+192=416
参数数量:(1×1×192×64) + (3×3×192×128) + (5×5×192×32) = 153600
由此看出,加入了1ⅹ1卷积后的改进版Inception模块,在大幅度减少了运算量的同时还降低了数据的维数。


训练方法

作者在论文中说他们是在单个CPU上训练的GoogLeNet(也是很自信了),不过讲道理在GPU上训练应该会来的更快。训练过程使用异步随机梯度下降,动量参数为0.9[17],固定的学习率计划(每8次遍历下降学习率4%)。此外在比赛后他们还发现了一个很有效的操作: 包括各种尺寸的图像块的采样,它的尺寸均匀分布在图像区域的8%——100%之间,方向角限制为[3/4, 4/3] 之间。以及:我们发现Andrew Howard[8]的光度扭曲对于克服训练数据成像条件的过拟合是有用的。


ILSVRC 2014分类挑战赛设置和结果

网络配置

前文介绍了GoogLeNet的一些配置细节,不过真正用到比赛里的方案当然没有这么简单,除了前文介绍的基本操作以外,还加了一些花里胡哨的东西:
• 独立训练了7个模型(包括前文介绍的基本版本)并进行整体预测,这些模型的训练具有相同的初始化(甚至具有相同的初始权重,由于监督)和学习率策略。它们仅在采样方法和随机输入图像顺序方面不同。
• 使用了更优秀的crop技术。这里就不多介绍了,直接引用原文:我们将图像归一化为四个尺度,其中较短维度(高度或宽度)分别为256,288,320和352,取这些归一化的图像的左,中,右方块(在肖像图片中,我们采用顶部,中心和底部方块)。对于每个方块,我们将采用4个角以及中心224×224裁剪图像以及方块尺寸归一化为224×224,以及它们的镜像版本。这导致每张图像会得到4×3×6×2 = 144的裁剪图像。
• softmax概率在多个裁剪图像上和所有单个分类器上进行平均,然后获得最终预测。

结果

使用前面说到的配置方法得到的结果:
在这里插入图片描述
此外,作者还测试了另外几种配置的结果:
在这里插入图片描述


ILSVRC 2014检测挑战赛设置和结果

这里借原文的描述来简单介绍一下ILSVRC检测任务:
ILSVRC检测任务是为了在200个可能的类别中生成图像中目标的边界框。如果检测到的对象匹配的它们实际类别并且它们的边界框重叠至少50%(使用Jaccard索引),则将检测到的对象记为正确。无关的检测记为假阳性且被惩罚。与分类任务相反,每张图像可能包含多个对象或没有对象,并且它们的尺度可能是变化的。报告的结果使用平均精度均值(mAP)。

网络配置

这里也比较简单,没什么好说的,直接放原文:
GoogLeNet检测采用的方法类似于R-CNN[6],但用Inception模块作为区域分类器进行了增强。此外,为了更高的目标边界框召回率,通过选择搜索[20]方法和多箱[5]预测相结合改进了区域生成步骤。为了减少假阳性的数量,超分辨率的尺寸增加了2倍。这将选择搜索算法的区域生成减少了一半。我们总共补充了200个来自多盒结果的区域生成,大约60%的区域生成用于[6],同时将覆盖率从92%提高到93%。减少区域生成的数量,增加覆盖率的整体影响是对于单个模型的情况平均精度均值增加了1%。最后,等分类单个区域时,我们使用了6个GoogLeNets的组合。这导致准确率从40%提高到43.9%。注意,与R-CNN相反,由于缺少时间我们没有使用边界框回归。

结果

使用前面介绍的配置跑出来的结果:
在这里插入图片描述
使用单个模型跑出来的结果对比:
在这里插入图片描述
这里提了一下,虽然单个GoogLeNet模型跑出来的结果不如Deep Insight,但是作者惊讶的发现三个Deep Insight集合的模型结果竟然只提升了0.3个点,而七个GoogLeNet模型集合时结果明显提升了很多。(强行挽回一下,面子还是要的)


总结

好啦,论文到这里就说完啦,最后还是简单做一下总结:
• 为了在使用更深更宽的网络的同时减少过拟合、降低参数量、提高计算资源利用率,本文提出了一种结合了稀疏性和密集计算的网络结构(Inception),巧妙地使用了1ⅹ1卷积来实现数据降维,并且在这基础上搭建了GoogLeNet的Inception v1版本
• 在训练阶段引入了辅助分类器,虽然后来实验表明作用并不大,不过也算是做了大胆的尝试。
• 通过GoogLeNet为搭建更宽更深的网络提供了一种新思路,也为之后更多版本的Inception结构打下了基础。

最后,目前这是我们分享的最长的网络和最长的文章啦,感谢小伙伴们一直以来的支持,大家下周见~么么啾!!!!

猜你喜欢

转载自blog.csdn.net/weixin_43624538/article/details/84863685