《Going deeper with convolutions》
论文地址:http://arxiv.org/abs/1409.4842.
GoogLeNet该网络是在ILSVRC2014比赛分类项目获得第一名。GoogLeNet是一个具有22层网络的深度学习架构,当然这22层指的是拥有权重的层。
按照之前的思路,提升网络性能最直接的办法就是增加网络深度和宽度,但一味地增加,会带来问题:
1)参数太多,如果训练数据集有限,很容易产生过拟合;
2)网络越深,容易出现梯度弥散问题。
为了减少参数,一开始会想到将全连接变成稀疏连接。但实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。因此Google研究人员提出了Inception的方法。
1 . 采用不同大小的卷积核最后拼接意味着不同尺度特征的融合;
2 . 卷积核采用1、3和5,主要是为了方便对齐。设定卷积stride=1后,只要分别设定pad=0、1、2,那么卷积之后便得到相同维度的特征,就可直接拼接在一起;
3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。但是文中也说max-pooling layers result in loss of accurate spatial information,最大池化会导致某些精确的空间信息丢失。
但是,使用5x5的卷积核仍然会带来巨大的计算量。 为此,采用1x1卷积核来进行降维(减少通道数量)。
下面给出一个使用1X1卷积降低参数量的例子:
其次,增加的1X1卷积后面也会跟着有非线性激励,这样同时也能够提升网络的表达能力。
虽网络的复杂程度加大了,但利用1X1卷积总的运算次数减小到之前的1/3。Inception网络是一个由上述类型的模块互相堆叠组成的网络,从而形成了GoogLeNet。如图所示GoogLeNet的整体架构。
可以看见当时还有辅助的分类器,除了最终的分类结果外,其实中间节点的分类效果还是不错的,所以GoogLeNet干脆从中间拉了两条分类器出来,然他们按一个较小的权重加到最终的分类结果中,这样做好处:
1)相当于做了模型整合
2)给网络增加了反向传播的梯度信号,一定程度解决了深网络带来的梯度消失的问题而且还提供了额外的正则化
当然辅助分类器只用于训练阶段,在测试阶段是要去掉的。
下图可以更清楚每层的具体结构:
延续VGGNet的设计思路,GoogLeNet也采用了模块化的结构,方便增添和修改。网络最后采用了average pooling来代替全连接层,参数量进一步减少。虽然移除了全连接,但是网络中依然使用了Dropout。
多裁剪图像评估和模型融合依旧对错误率的降低很有成效。对比起来看,模型融合功效更大,当然两着是互补的,可以同时使用。
Inception module带来了空间维度上的多尺度注意力机制。此外,还可以理解为让网络自己学习所需要的卷积核尺寸。以前的网络都需要人工的去设计卷积核的大小,而Inception网络不需要人为决定使用多大的卷积核,或者是否需要池化,让网络自行学习。
《Rethinking the Inception Architecture for Computer Vision》
论文地址:https://arxiv.org/abs/1512.00567.
2015年,Google团队又对其进行了进一步发掘改进,推出了Incepetion V2和V3。Inception v2与Inception v3被作者放在了一篇paper里面。
在Incepetion V1基础上进一步考虑减少参数,让新模型在使用更少训练参数的情况下达到更高的性能。
算法科学家们根据对卷积网络的各种架构选择的大规模实验,描述一些设计原则。 以下原则的效用是推测性的,未来需要更多的实验证据来评估其准确性和有效性领域。但对这些原则的严重偏离往往会导致网络质量的恶化,使用这些准则,通常会导致架构的改善。
通用设计准则:
1)避免特征表达瓶颈,尤其是在网络的浅层。避免信息极度压缩带来的瓶颈。一般而言,从输入层到输出层特征维度大小应该缓慢下降。
2)高维度特征表达在网络的局部中处理起来更加容易。增加CNN每个神经元的激活值会更多地解耦合特征,会使得网络训练更快。(在高层的Inception结构中3x3拆分成了1x3和3x1的卷积核,以增强信息表征)。
3)空间信息聚集可以通过低维度嵌入来完成,而且在几乎不损失特征表达能力的情况下。网络后面可以使用像bottleneck的模块,可以在卷积之前先用1*1的卷积核实现降维(作者认为网络后面的feature maps通道内的信息相关性高,所以在通道层次降维并没有太多不利影响,同时还加快了训练)。
4)平衡网络宽度和深度。瘦高或矮胖的CNN网络都不如一个身材匀称的网络的效果好。
下面是一些具体改进:
吸取同时期VGGNet里面的思路,将大卷积核替换成连续的小卷积核(同样的,卷积之后都接ReLu,多一些非线性,增加网络的特征表达能力)。进一步探索是否可以更小,使用非对称卷积,nxn的卷积可通过1xn卷积后接nx1卷积来替代,同样的输出大小,参数个数少了。在网络的前期使用这种分解效果并不好,在中等大小的特征图上使用效果才会更好(对于mxm大小的特征图,建议m在12~20)。
辅助分类器在训练早期并不会推动收敛:在训练中在到达很高准确率之前,有没有辅助分类器的存在似乎并不影响。在训练末期,带有辅助分类器的网络就会超过没有辅助分类器的网络。
将浅层的辅助分类器移走对于网络最后的结果没有任何作用,也就是这个分类器没用。说明这些辅助分类器能不够帮助低层特征训练。(文中认为辅助分类器其实是起到了泛化的作用,是一个正则化方法。因为,网络的主分类器能够取得更好的结果如果辅助分类器采用batch-normalized或者引入dropout。)
传统的卷积网络会使用一些pooling操作来减少特征图的大小。为了避免特征表达瓶颈bottleneck,减少信息的过度丢失,会在加入池化层减少特征图大小的同时都会同比例扩大它的通道数目。VGGNet
两种较为传统的做法:
1.先做Pooling减少特征图尺寸,然后再使用1x1 conv对其通道数目放大,不过显然首先使用Pooling的话会造成信息硬性丢失的不可避免,在此之后再使用1x1 conv去增加通道数目的做法已经有亡羊补牢之嫌了。
2.先将通道数目扩大(一般使用1x1 conv),然后再使用Pooling来减少特征图尺寸,不过显然会有非常大的计算开销。
作者提出同时做pooling和conv,stride为2,减少特征图尺寸,之后再将两者算出的特征图contact起来。在减少计算量的同时也避免了表达瓶颈,符合上面提出的准则1(避免特征表达瓶颈)。即有效的特征图降维将卷积和池化的串行变为并行进一步减少计算量。
*只有模块交接处会进行Efficient Grid Size Reduction。
只要遵守第二个准则,网络的质量对于变化是相对稳定的。虽然网络有42层深度,但计算成本只比GoogLeNet高2.5左右,仍然比VGGNet的效率高得多。
此外可以看见,非对称卷积只在中等大小的特征图上使用。
每一个conv都是 卷积+batch norm+ReLu
pytorch的代码和论文中给出的结构有细微差别,感兴趣的可以查看源码。
辅助分类器如下图,加在3×Inception的后面:
Inception-v3比Inception-v2增加了几种处理:
1)RMSProp优化器
2)使用了LabelSmoothing(label-smoothing regularization,或者LSR)
3)第一个figure6结构(inception_b)的7x7卷积分解为3个3x3卷积(其他的figure6结构inception_c有非对称卷积,可以去看源码)
4)辅助分类器使用了 BatchNorm。 同时输入图像大小变成299x299。
一个典型情况是目标检测后的分类。这就需要对包含了一个单独目标以及一些背景的一个相对比较小的图片patch进行分析。这个任务就是决定图片patch中心是否对应了某个目标并且决定这个目标属于哪一类。这个任务的挑战在于往往这些目标都是较小的而且图片patch也是低像素的。
如何恰当地处理低像素的输入?
如果仅仅只改变输入的像素而不调整模型的话,我们会使用一个计算开销小的模型去处理一个困难的问题。显然这样是不行的。当计算开销不变的时候,到底多高的输入像素会帮助更大呢?一个简单的方法来保证计算开销不变就是降低前两层的步长,或者直接取消网络的第一个pooling层(计算开销改变不大)。于是做了如下实验:
79x79的感受野,在第一层(步长1)之后不跟最大池化。
151x151的感受野,在第一层(步长1)之后跟上最大池化。
299x299的感受野,在第一层(步长2)之后跟上最大池化。
那么这三个网络计算开销基本差不多。单纯根据输入的像素来降低网络大小,网络的效果就会非常差。从上表的结果,我们可以发现,对于小物体的识别,还是需要考虑使用精心设计的高计算开销低分辨率网络。
提出了有效扩大网络的四个准则以及很多新观点:非对称卷积进一步减小参数(只对中等大小的特征图有效12-20),辅助分类器的有效应用是一种泛化手段,有效的特征图降维将卷积和池化的串行变为并行进一步减少计算量,Label Smoothing,以及对于低像素图片分类的实验。
上一篇:CNN卷积神经网络之VGGNet.
下一篇:CNN卷积神经网络之ResNet.