卷积网络之14年双雄-GooleNet

先列出论文和作者表示尊敬
GooleNet的命名是为了表示对YannLe Cuns的LeNet-5 的尊敬,网络出自论文 Going deeper with convolutions 作者是:Christian Szegedy(Google Inc),Wei Liu(University of North Carolina, Chapel Hill),Yangqing Jia(Google Inc,caffe的创始人,现在在facebook),Pierre Sermanet(Google Inc),Scott Reed(University of Michigan),Dragomir Anguelov( Google Inc),Dumitru Erhan(Google Inc),Vincent Vanhoucke(Google Inc),Andrew Rabinovich(Google Inc)
slide2_n
论文提出了一个代号为Incepytion的深度神经网络框架,这个框架提高了网络内部计算资源的利用率,可以在计算预算不变的情况下增加网络的深度和宽度。
在网络中deep有两个意思,一是引入了一个“Inception module”,另一个是对网络的层次进行了加深。
在Related Work中提到了Network-in-Network 可以用来增加神经网络的代表性,用到了1x1的卷积核,主要作用是作为降维模块以消除计算瓶颈,这不能允许增加网络的深度,还允许网络的宽度没有显著的性能损失。
R-CNN将检测问题分为两个子问题:一是利用颜色和像素一致性等较为底层的信息提出可能存在的对象,然后用CNN分类器对这些潜在的对象进行识别。
传统上增加深度神经网络的性能最直接的方法是增加网络的深度(层数)和宽度(每一层神经元的个数),特别是当训练数据大的时候。但是方法有两个缺点:
1:更大的尺寸通常意味着更多的参数,这使得网络更加容易过拟合,特别是当训练集中标记的例子数量有限,创造高质量的训练集是非常棘手的,特别是遇到细粒度识别时,如遇到下面的西伯利亚雪橇犬,即哈士奇和爱斯摩基雪橇犬(反而我觉得图2更像哈士奇,眼睛是蓝色的)
_
2:增加网络的规模另一个缺点是计算资源的使用大大增加。如在卷积神经网络中,如果两个卷积连在一起,任何均匀增加的滤波器数目就会使计算数量二次增加。但当网络中参数的被低效地使用如当大多数的权重都接近于0时,大量的计算被浪费了。
解决这两个问题的根本办法是从完全连接转变为稀疏连接的体系结构,甚至是在卷积内部。Arora开创性工作的结果表明,如果数据集的概率分布代表一个巨大的非常稀疏的深度神经网络,然后通过分析最后一层激活的相关统计量和高度相关输出的聚类神经元,逐层构建最优网络拓扑结构。
计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet中又重新启用了全连接层,目的是为了更好地优化并行运算。
Architectural Details
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
_1x1
对上图做以下说明:
1 . 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2 . 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
4 . 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。

但是,使用5x5的卷积核仍然会带来巨大的计算量。 为此,文章借鉴NIN2,采用1x1卷积核来进行降维。
例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。
_1x1
具体改进后的Inception Module如下图:
_1x1
[来着博客http://blog.csdn.net/shuzfan/article/details/50738394#architectural-details]
这种架构的主要优点是,能显著增加每个阶段featuremap的数目,而不会过多地增加计算复杂度。先减小尺寸再用大尺寸的卷积,再将不同尺度上的信息汇总,更加符合视觉。
下表是GoogleNet的结构:
googlenet
所有的卷积包括Inception模块都用了线性激活。网络输入为224x224的RGB图像。"#3x3reduce"和"#5x5reduce"代表在3x3和5x5卷积之前先用1x1的卷积。
网络共有22层,如果算上pooling层则有27层。网络用average pooling代替了全连接层使得top-1的准确率提高了0.6%
GoogleNet网络结构可视化结果:
0007
包括辅助分类器在内的附加网络的确切结构如下:

  • 一个average pooling 层包含5x5的滤波器,步长为3,产生(4a)阶段输出为4x4x512和(4d)阶段输出为4x4x528
  • 具有128个1x1的卷积用来降维和线性激活。
  • 全连接层有1024个单元并用线性激活
  • dropout层dropout70%的输出
  • 一个有softmax loss的线性层作为分类器
    在训练时论文提到安德鲁·霍华德(Andrew Howard)提出的光度失真在某种程度上有助于对抗过度拟合。(先记下来之后再学习)

最后在ILSVRC 2014上结果:
_
相较13年有很大提升top-5的错误率只有6.67%
484d63600c338744a02435b55a0fd9f9d52aa0fb