作者: 18届 CYL
日期: 2020-7-25
标签: Inception GoogleNet 网络结构
论文期刊:2014年CVPR
一、写在前面的话:若有差错,欢迎指正
闲话区:
1、2014年GoogLeNet获得ImageNet挑战赛分类项目的第一名。(同年另一个大牛VGG网络获得第二,但是由于参数过多,计算量太大导致VGG的光环相对来说要暗淡一些,由于后续优化较少,应用有限,后续我不再讲解,其中的VGG的一个重要改进会应用在inception v2)
2、神经网络深度与正确率呈正相关(注意:正相关是指对正确率有效,并不是只要深度深正确率就会更高),在增加深度的时候要有数学依据:优化网络结构,层与层之间传递的有效性,卷积核的大小,正则化选择,归一化选择等等等等,如果可以解决过拟合和梯度弥散,参数爆炸等问题同时也有一个较好的网络结构,确实是层数越多正确率越好,如2015年的ResNet残差神经网络解决了过深(上百层)带来的一些问题,也取得了不错的效果。(GoogLeNet为22层)
3、深度越深计算量一般会爆炸性增长如VGG,虽然可能正确率会相对较好(VGG正确率大于AlexNet),但是计算量过大会影响实时分析性,需要更多的训练数据集还可能会有梯度弥散的问题,增加成本,从而深刻影响这个模型的实际应用。笨重的模型中绝对是有大量的无效参数,完全可以通过改善网络结构来提高层与层之间数据传输的有效性,实现在提高层数的同时顺便还降低了计算量(VGG虽然参数量为GoogLeNet的36倍,但正确率却不如GoogLeNet)。
4、在设计神经网络模型时不仅要考虑正确率也要考虑计算量,在没有好方法去消除过深的网络带来的梯度弥散问题时还要控制网络深度。本模型就是一个提出新的模型结构然后获得巨大成功的典型例子。
5、相比于学习与了解整个GoogLeNet的网络架构,个人认为学习构建inception结构的思想更为重要。 GoogLeNet一开始为inception思想上的一种参数组合v1,后续陆续进行少量优化提出了inception v2、v3、v4网络结构。Inception与ResNet结合为inception-ResNet。Inception v3保留网络结构,更改网络组成形成xception,让参数数量减少,计算效率提高。
6、本论文叙述了一个重要的待解决问题:提高神经网络的最直接方式是增加他的深度和宽度,而增加深度和宽度又会带来参数爆炸,为了减少参数而引入稀疏性,即让全连接层变为稀疏的全连接甚至是卷积层(本模型中就将原来网络中总存在在最后几层的全连接层砍掉,只留了一个全连接层方便用于分类),这一操作的理论来源是:由Arora等人已经证明了最优的神经网络结构是一个稀疏的大型结构,也就是说全连接层中很多参数都没有必要,最优的网络结构可以通过分析前一层的激活情况来构建后一层的网络结构。而稀疏的矩阵计算速度是非常慢的,这就又带来了计算速度问题,而同时解决这两个问题的方向是:一个可以结合卷积层水平的稀疏性,又能利用密集矩阵计算来利用硬件的方法是将稀疏矩阵聚类为相对密集的子矩阵会有更加好的性能。在不久的将来可能可以自动构建非均匀的深度学习架构。
7、不同模型的正确率和参数大小(2017年统计图)
8、彩蛋:GoogLeNet的名字中L大写是为了向LeNet致敬,论文题目来源是盗梦空间小李子的一句台词,GoogLeNet的另一个名字是inception(v1)名称与盗梦空间英文名一致。
9、注1:以2014年论文going deeper with convolutions 介绍的inception网络结构为开端,并以inception中的一个特例GoogLeNet(inception v1)为基础介绍其中在前两次讲解中没出现过的重点技术和策略,然后陆续展开inception的优化方案V2、V3、V4.这时时间线已经到2017年。
二、Inception 的策略:(建议深度理解上述6,来逐步消化策略的)
1、大量应用11卷积层bottleneck(这部分主要知道11卷积操作是什么,下面会用)
-
目的1:作为降维模块来移除卷积瓶颈,提高网络深度,否则会限制网络大小
-
目的2:大大降低计算量
-
目的3:增加模型非线性表达能力
-
目的4:增加跨通道交流的作用
-
问题1:什么是1*1卷积层
用一个与输入的深度相同的11depth的卷积核进行卷积操作,让卷积后的特征图变为与输入中的一层的大小相同。
-
问题2:为什么11卷积层可以降维,提高网络深度
经过卷积核操作从原来的6464192变为了6464*1显然降维了 -
问题3:为什么1*1卷积层可以减少计算量,增加模型非线性表达能力,增加跨通道交流的作用
直观的看,也很好理解。过!
思考:
提高网络性能的直接方式是增加他们的尺寸。这不仅包括增加深度(网络层次的数目)也包括他的宽度(每一层的单元数目)。但是更大的尺寸意味着更多的参数,是增大的网络容易过拟合,尤其是在训练集的标注样本有限的情况下。另一个缺点是计算资源使用的显著增加。那么如何适量增加网络深度而解决这两个问题呢?(注:参数的绝大部分集中在全连接层)
2、 Inception 的基本结构是
核心思想:近似实现卷积神经网络的最优稀疏结构并用密集组件进行覆盖,在设计网络的时候简化为以卷积构建块为基础。然后找到最优局部结构来重复搭建。在设计局部结构时假设较早层的每个单元对应输入层的某些区域,并且这些单元被分成滤波器组。(我的理解是:不同大小的滤波器组相当于对稀疏矩阵有了一定的聚类效果)。在较低的层相关单元集中在局部区域,那么通过1*1卷积覆盖,就相当于将稀疏矩阵转变为稠密矩阵。卷积核的大小1 3 5 是基于方便性,而并没有其他特殊的原因。(上述思想是期望该结构会有效果,inception也取得了正确性的巨大成功,但是否是由于网络结构而导致的正确率飙升,需要进一步的观察。)
贴图的小问题:这张图上展示的卷积核大小不一样导致卷积过后的模型不一样,这点图像其实错误的,卷积过后的大小都一样才可以进行下一次的卷积。
解释:假如上图输入是11113图像。第一种卷积核为553的,padding = 2 strip = 1那么卷积过后的图像大小为(11+22-5)/1+1 = 11 所以为11111的特征图像 第二种卷积核为333的,padding = 1,strip = 1 那么卷积过后的图像大小为(11+12-3)/1 +1=11 所以为11111的特征图像,第三种卷积核为113的卷积核,padding = 0 strip = 1那么为11111的特征图像。(卷积核的厚度默认与输入一致)
我的不同理解:ZFNet对AlexNet的改进是将第一层1111的大卷积核改成77来达到提升网络性能的目的,但是每一张图片的第一层都用77这件事直观的想,合理吗?有的照片里面人脸大,有的照片人脸小,同一张照片也有大特征也有小特征,但是每一层都用固定大小的卷积核合适吗?显然不合适,那么是不是可以每一层设置不同大小的卷积核。这样做会有什么问题,又怎么样解决?
问题:如果采用这种结构,会让网络中的每一层越来越厚,参数爆炸——max pooling的厚度与原模型大小一样,再加上不定量的11,33,55 别提有多大了。解决方式如下:
3、 大量应用NIN(Network in Network)
- 好处1:控制网络中每一层的厚度,防止每一层的厚度爆炸。即:降维 具体解释如:上述1
- 好处2:起初NIN是为了增加神经网络表现能力而提出的一种方法。在他们的模型中,网络中添加了额外的1*1卷积层,增加网络的深度。
4、额外的并行池化层
整个网络是由上述的inception module堆叠形成的,其输出滤波器组连接成单个输出向量形成了下一阶段的输入。另外,由于池化操作对于目前卷积网络的成功至关重要,,因此建议在每个这样的阶段添加一个替代的并行池化路径,这个操作应该有额外的有益效果(此部分为论文翻译)
5、整体网络结构
整个inception v1(GoogLeNet)是有上述模块相互堆叠组成的网络,偶尔会有步长为2的最大池化层将网络的分辨率减半。
由于这些inception模块在彼此的顶部堆叠,其输出相关统计必然有变化:由于较高层会捕获较高的抽象特征,其空间集中度预计会减少,这就意味着在更高层的时候33与55的比例应该会增加。
33reduce是在33卷积之前降维层使用的1*1滤波器的数量
6、辅助分类器的使用
由于深度较大的网络,让梯度下降反向传播有效的通过所有层是一个问题。在这个任务上,通过在中间层引入辅助分类器来在一定程度上消除此问题。
- 问题1:辅助分类器是什么?
实质是增加了正则化项(与L2正则化项相似,对误差进行一定的修改) - 问题2:如何操作?
使用inception(4a)与inception(4b)模块的输出,进行分类操作,然后将误差乘上0.3加到整个网络的损失之上。(在推断时,把这部分去掉就好)
具体结构如下:
一个卷积层55,步长为3的平均池化层
具有128个滤波器的11卷积,用于降维和修正线性激活
一个全连接层,具有1024个单元
Softmax的线性层作为分类器