小组成员:
成员一:姓名:* 学号:2017*********
成员二:姓名:* 学号:2017**********
本文是UCAS模式识别与机器学习某一次调研作业,共分为3篇博客,此为其一,作业相关代码托管在GitHub上,如需查阅相关代码,可通过网址https://github.com/Blssel/TF-learing/tree/master/prml_course_assigment访问
Inception V1
Motivation
提升网络性能最直接的办法就是增加网络深度和宽度。但在实际操作中这并非一帆风顺,因为这会导致巨量的参数,同时过拟合的风险也会大大增加(我们通过ResNet的解读还知道网络过深还会导致优化难度的增加)。Google net想解决的问题是:1.通过使用较为密集的子矩阵来模拟CNN的稀疏连接,从而提升计算性能(因为大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能),这也就是inception模块所做的贡献之一。2.inception模块还可以帮助增加模型宽度,从而更好地兼顾不同大小的感受野和尺度。3.inception模块通过加入1×1的卷积核还能大幅减少参数量。
Inception 模块
Inception 结构的主要思路是怎样用多个密集成分来近似最优的局部稀疏结构,如图3所示。
采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了
文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了
网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加
![图](https://i-blog.csdnimg.cn/blog_migrate/beb4cdf9bfda415e11a0151224b62616.png)
当然,这并未inception模块的最终形态,因为使用5x5的卷积核仍然会带来巨大的计算量。 为此,文章借鉴NIN2,采用1x1卷积核来进行降维,如图4所示。
例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。总之,图4结构的inception模块在图3的基础上进一步减少了参数。
![图](https://i-blog.csdnimg.cn/blog_migrate/41613ebbf1bfe7aee75d2d08c70bd818.png)
Inception v1网络结构
网络结构如图5所示。
![图](https://i-blog.csdnimg.cn/blog_migrate/1676bc06888eadc91a0390376bf2acea.jpeg)
对图5做如下说明:
- 显然GoogLeNet采用了模块化的结构,方便增添和修改
- 网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune。
- 虽然移除了全连接,但是网络中依然使用了Dropout
- 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。
Inception V2
Motivation
本文可以说其实并没有理论上的创新,仅仅是想在v1的基础上进一步减少参数量,提供了扩展inception模块大小的可能性。本文,谷歌给出了许多实验上的经验与结论:
- 信息流前向传播过程中不能使用高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你上来就来个kernel = 7, stride = 5 ,这样显然不合适。 另外输出的维度channel,一般来说会逐渐增多(每层的num_output),否则网络会很难训练。(特征维度并不代表信息的多少,只是作为一种估计的手段)
- 高维特征更易处理。 高维特征更易区分,会加快训练
- 在进行小尺度卷积之前,可以对输入先进行降维而不会产生严重的后果。假设信息可以被简单压缩,那么训练就会加快
- 平衡网络的宽度与深度是比较合理的设计
Solution
首先,尝试是否能用两个3×3的卷积核代替5×5的卷积核,可以减少参数量,而且实验表明这样不会造成表达缺失,作者也做了对比试验,表明在3×3卷积核之后添加非线性激活会提高性能。
进一步的,文章考虑进一步缩减参数的方法。任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代,如图6所示。实际上,作者发现在网络的前期使用这种分解效果并不好,而在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间)
![图](https://i-blog.csdnimg.cn/blog_migrate/f3bae1ba9778f175d402812c11f045ad.png)
下面三幅图循序渐进地展现了文章的设计思路。
![图](https://i-blog.csdnimg.cn/blog_migrate/ab025a06a5992512c87b04af6e8a7a2d.png)
其中,
- 左图是GoogLeNet V1中使用的Inception结构
- 中间图8是用3x3卷积序列来代替大卷积核
- 右图是用nx1卷积来代替大卷积核,这里设定n=7来应对17x17大小的feature map。该结构被正式用在GoogLeNet V2中
Inception V3
v3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块。
Inception V4
v4研究了Inception模块结合Residual Connection能不能有改进?发现ResNet的结构可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet v2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet v2相媲美的性能。