Going deeper with convolutions
GoogleNet首次出现在ILSVRC 2014比赛中(和VGG同年),获得了当时比赛的第一名。使用了Inception的结构,当时比赛的版本叫做Inception V1。inception结构现在已经更新了4个版本。Going deeper with convolutions这篇论文就是指的Inception V1版本。
一. Abstract
1. 该深度网络的代号为“inception”,在ImageNet大规模视觉识别挑战赛2014上,在分类和检测上都获得了好的结果。
2. 控制了计算量和参数量的同时,获得了很好的分类性能。500万的参数量只有AlexNet的1/12(6000万)。
Inception V1(或者说深度网络)为什么以降低参数量为目的?
- 参数越多,计算压力更大,需要的计算资源越多。
- 参数越多,模型越大,越容易过拟合。(鼓励简单模型)
- 参数越多,模型越大,就需要更多的数据来学习,但是高质量的训练数据很宝贵。
Inception V1如何降低参数量的?
- 用全局平均池化层代替了全连接(VGG中全连接层的参数占据了90%的参数量)
- 大量1×1的卷积核的使用
3. Inception Net整体结构受Hebbian原理的启发,并且充满了multi-scale的思想。
二. Motivation and High Level Considerations
Inception Net设计的思考是什么?(好的深度网络有哪些设计原则)
逐层构造网络:如果数据集的概率分布能够被一个神经网络所表达,那么构造这个网络的最佳方法是逐层构筑网络,即将上一层高度相关的节点连接在一起。几乎所有效果好的深度网络都具有这一点,不管AlexNet VGG堆叠多个卷积,googleNet堆叠多个inception模块,还是ResNet堆叠多个resblock。
稀疏的结构:人脑的神经元连接就是稀疏的,因此大型神经网络的合理连接方式也应该是稀疏的。稀疏的结构对于大型神经网络至关重要,可以减轻计算量并减少过拟合。 卷积操作(局部连接,权值共享)本身就是一种稀疏的结构,相比于全连接网络结构是很稀疏的。
符合Hebbian原理: Cells that fire together, wire together. 一起发射的神经元会连在一起。 相关性高的节点应该被连接而在一起。
inception中 1×1的卷积恰好可以融合三者。我们一层可能会有多个卷积核,在同一个位置但在不同通道的卷积核输出结果相关性极高。一个1×1的卷积核可以很自然的把这些相关性很高,在同一个空间位置,但不同通道的特征结合起来。而其它尺寸的卷积核(3×3,5×5)可以保证特征的多样性,因此也可以适量使用。于是,这就完成了inception module下图的设计初衷:4个分支:
New Version比Old version是如何减少参数量的?
- 1×1的卷积核和正常的滤波器完全是一样的,只不过它不再感受一个局部区域,不考虑像素与像素之间的关系。1×1的卷积本身就是不同feature channel的线性叠加。1×1的卷积最早出现在Network in Network这篇文章中,在Google的inception结构中也采用了大量1×1的卷积。
- NIN论文中解释1×1的卷积实现了多个feature map的结合,从而整合了不同通道间的信息。(个人认为这个作用并不是特点,因为其它大小的卷积核也可以实现)
-
1×1的卷积可以实现通道数量的升维和降维。并且是低成本的特征变换(计算量比3×3小很多)。是一个性价比很高的聚合操作。怎么理解1×1是性价比很高的升降通道数的操作呢?
(以google inception为例)
原始结构:
参数:(1×1×192×64) + (3×3×192×128) + (5×5×192×32) = 153600
最终输出的feature map:64+128+32+192 = 416
加入不同channel的1×1卷积后:
参数:1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)=15872
最终输出的feature map: 64+128+32+32=256
所以加入1×1的卷积后,在降低大量运算的前提下,降低了维度。
降低维度也是inception module一个非常明智的举措。
三. GoogleNet
- 在inception module中,通常1×1的卷积比例(输出通道占比)最高,3×3和5×5的卷积稍低。
- 在整个网络中,会有多个堆叠的inception module,希望靠后的inception module可以捕捉更高阶的抽象特征,因此靠后的inception module中,大的卷积应该占比变多。
GoogleNet有22层深,比同年的VGG19还深。包含了9个inception module,下面是具体的结构。我试图将表格和结构图结合起来,解释整个的网络结构。
DepthConcat:聚合操作,在输出通道这个维度上聚合(一个inception module每个分支通道数可能不一样,但是feature map大小应该是一样的。strides=1,padding=same)
inception 3a
输入:28×28×192
输出:由于每个分支strides=1,padding=same,所以只是通道数在变化,feature map大小不变。最终输出 28×28×256(只增加了少量通道数)
其它的inception module也是这种形式,可自己推算。
辅助分类器
Google net除了最后一层输出进行分类外,其中间节点的分类效果也很好。于是,Googlenet也会将中间的某一层的输出用于分类,并按一个较小的权重(0.3)加到最终的分类结果中。
个人原创作品,转载需征求本人同意