最近研一上,正在上《神经网络》这门课程,老师推荐我们去阅读关于GoogLeNet的文章,GoogLeNet是2014年ImageNet挑战赛(ILSVRC2014)的冠军,《Going Deeper with Convolutions》是GoogLeNet系列的第一篇(论文地址),本人最近刚好阅读完这篇论文,在此记录下自己的理解。
简介
GoogLeNet是一个包含22层隐含层的深度卷积神经网络,创新性地提出了“Inception module”,在扩展了网络的深度和宽度的情况下,反而使整个网络的参数相较于ILSVRC2012冠军AlexNet减少了12倍,保证了计算资源(cpu,内存)和计算时间消耗不变,GoogLeNet可以用于目标分类和目标检测。
动机与思想
自从LeNet-5提出以来,堆叠多个卷积层然后经过一个全连接层成为了卷积神经网络的标准结构。因此提高卷积神经网络性能最直接的想法就是
⟹
\Longrightarrow
⟹增加网络的深度—网络的层数和网络的宽度—每一层的单元数。
⟹
\Longrightarrow
⟹网络将会有更多的参数,不仅需要大量的计算资源,特别是在带标签训练数据有限的情况下,网络很有可能过拟合。
⟹
\Longrightarrow
⟹将全连接甚至是卷积操作转换为稀疏连接。一方面是在模仿生物神经系统的稀疏连接,另一方面,Arora等人的文献也给予了充分的理论基础:如果数据集的概率分布能够用一个大规模的,非常稀疏的深度神经网络表示,那么可以通过分析前一层的激活值间统计相关性和对高度相关的输出进行聚类来逐层构建最优的网络拓扑结构。
⟹
\Longrightarrow
⟹现如今的计算机体系结构对非均匀的稀疏矩阵计算效率不高。
⟹
\Longrightarrow
⟹将多个稀疏矩阵合并成相关的稠密矩阵。
Inception架构细节
在简介中提到了,GoogLeNet创新性的提出了“Inception module”。Inception的主要思想是找出已有的稠密组件来近似与覆盖卷积视觉网络中的最佳局部稀疏结构。 因此作者首先提出了如下朴素的思想:
上图有以下几点需要说明:
1、与传统的卷积神经网络在网络的某一层中只使用固定大小的卷积核不同,Inception中采用了不同大小的卷积核,意味着不同大小的感受野,最后进行拼接,意味着不同尺度的特征的融合。
2、为了保证不同大小的卷积核能够方便对齐,Inception限制采用1X1,3X3,5X5大小的卷积核。统一设定卷积核扫描步长(stride)为1,再分别设定padding=0,1,2,这样经过不同卷积核后得到的特征维度也是相等的,因此可以直接拼接在一起。
3、因为当前比较成功的卷积网络都表明池化(pooling)操作非常重要,所以在Inception中也加入了可选的池化操作。
4、网络层次越高,捕获的特征也越抽象,它们的空间集中度也会相应降低,因此随着网络层数的加深,3X3和5X5的卷积核的比例也应该增加。
上诉朴素的Inception模块存在一个很大的问题:在网络的顶端由于卷积核的数量太多,即使是5X5的卷积带来的计算开销都非常昂贵。即使这个架构可能包含了最优的稀疏结构,但还是会非常低效,导致没计算几步就会计算爆炸。
这促成了Inception的第二个想法:在计算需求会增加很多的地方明智的采用维度缩减。 即在计算昂贵的3X3和5X5卷积前面用一个1X1的卷积减少计算,同时用于修正线性激活。
举一个例子:假设上一层输出的特征图是100100192,经过具有256个输出的3X3的卷积层(stride=1,pad=1)之后,输出数据为100100256,参数个数为:33192256=442368个。如果先经过96个1X1的卷积操作,再经过256个3X3的卷积操作,最终的输出仍为100100256,但此时的参数个数降低为:1119296 + 3396*256=239616个,减少了接近一半。
GoogLeNet
完整的GoogleNet结构如下图所示:
有如下需要指出的:
1、输入的感受野是224X224的RGB彩色通道,因此输入是224X224X3大小,并且经过了零均值化处理。
2、网络最后采用average pooling替代了全连接层,并且将top-1准确度提高了0.6%。(为了方便网络适应不同的标签数据集,还是加了一个全连接层)。
3、即使不使用全连接层,dropout依旧十分重要。
4、为了避免梯度消失,网络在(4a)和(4d)处加入了2个辅助的softmax用于反向传播梯度。
具体各层的参数细节如下表所示:
解释如下:
1、表中第一列中的(3a),(3b)分别对应上面结构图中的红色方框,(4a),(4b),(4c),(4d)分别对应上面结构图中的蓝色方框,(5a),(5b)分别对应上面结构图中的绿色方框。
2、# 3X3 reduce和# 5X5 reduce分别表示3X3和5X5卷积层前的1X1卷积操作的个数。pool proj表示经过max-pooling之后的1X1卷积操作的个数。
3、表中output size中每个特征图大小计算公式如下
1
s
t
r
i
d
e
(
i
n
p
u
t
s
i
z
e
+
2
∗
p
a
d
d
i
n
g
−
p
a
t
c
h
s
i
z
e
+
1
)
\frac{1}{stride}(input size + 2*padding - patch size + 1)
stride1(inputsize+2∗padding−patchsize+1);在Inception中特征图个数个数为#1X1、#3X3、#5X5、pool proj之和。
总结
网络的训练方法和用到的技巧以及最终的结果就不在此赘述,感兴趣的朋友可以去原论文中了解。总之GoogLeNet是谷歌团队为了ImageNet比赛精心准备的,非常具有开创性,后面的升级版我会再慢慢阅读和大家分享。