GoogleNet Inception
在作者的原始论文中《Going deeper with convolutions》中,提出了一种新的深度神经网络-Inception,目的在于用稀疏、分散的网络来取代庞大、密集、臃肿的网络。Inception模块参考Network-in-Network也采用了1X1卷积,
Inception 模块思想来源
改善深度神经网络性能的最直接方法是通过增加
他们的大小。 这包括增加网络及其层次的深度(级别数)
宽度:每个级别的单位数。 这是一种简单而安全的培训更高质量的方法
模型,尤其是考虑到有大量标记训练数据的可用性。 但是这个
简单的解决方案有两个主要缺点:
- 参数越多,越容易过拟合
- 计算效率问题,两个相连卷积核,两层同步增加卷积核,计算量将成平方增加,如果很多训练权重的值训练后等于0,这部分就浪费了
解决的方式就是去掉全连接层而在神经网络结构和卷积层内部采用稀疏结构,那么如何既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,据此论文提出了名为Inception 的结构来实现此目的。
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
首先对图(a)进行说明:
3. 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
4. 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
5. 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
6. 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,空间信息容易丢失,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
原生的Inception存在问题,通道数越来越多,5x5卷积带来的计算量爆炸。因此对其进行了改进,如图(b),在3x3和5x5卷积之前加入了1X1卷积, :
- 作用如下
- 降维
- 减少参数量和运算量
- 增加模型深度,提高非线性表达能力
GoogleNet网络结构
因此最终GoogleNet采用了底层仍是不同卷积层,而在高层采用了Inception模块的方法,这样做的主要好处有:
- 在堆叠模块时不会产生计算量爆炸
- 视觉信息多尺度并行处理和融合汇总,增加了模型宽度和深度
最终精心调整之后可以实现比相同精度普通网络快2~3倍的效果。
下面我们来看下GoogleNet的网络结构:
- 对上面图做如下说明:
- 显然GoogLeNet采用了模块化的结构,方便增添和修改;
- 网络最后采用了全局average pooling来代替全连接层,每一个Chanel去一个参数,能够减小参数量,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
- 虽然移除了全连接,但是网络中依然使用了Dropout ;
- 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。
以下为更加清晰的结构:
总结
GoogleNet在ImageNet竞赛中的成功表明通过密集子块来优化稀疏结构在计算机视觉领域十分有用。Inception能够达到提高性能而又不大量增加计算量的目的。