概述
Google Inception Net最大的特点是控制计算量和参数量的同时,获得了较好的性能。它的参数量仅为AlexNet的1/12,Inception V1有22层深。Inception Net参数少但效果好的原因,除了网络模型层数较深,还有2点:
(1)去除了全连接层,用平均池化层来代替;去除全连接层后模型训练更快并且减轻了过拟合。用平均池化层取代全连接层的做法借鉴了Network In Network(NIN)论文。
(2)Inception Net设计的Inception Module提高了参数的利用效率。
Inception V1为什么以降低参数量为目的:
参数越多,计算压力更大,需要的计算资源越多。
参数越多,模型越容易过拟合。
参数越多,模型就需要更多的数据来学习,但是高质量的训练数据很宝贵。
参数越多,模型训练越慢。
Inception V1如何降低参数量:
用全局平均池化层代替了全连接。
大量1x1的卷积核的使用。
Inception Net设计的思路是什么?(好的深度网络有哪些设计原则):
(1)逐层构造网络:如果数据集的概率分布能够被一个神经网络所表达,那么构造这个网络的最佳方法是逐层构造网络--即将上一层高度相关的节点连接在一起。几乎所有效果好的深度网络都具有这一点,不管AlexNet,VGGNet堆叠多个卷积层,GoogleNet堆叠多个Inception Module,还是ResNet堆叠多个resblock;并且模块化方便网络的修改。
(2)稀疏的结构:人脑的神经元连接就是稀疏的,因此大型神经网络的合理连接方式也应该是稀疏的。稀疏的结构对于大型神经网络至关重要,可以减轻计算量并减少过拟合。 卷积操作(局部连接,权值共享)本身就是一种稀疏的结构(相比于全连接网络结构是很稀疏的)。
(3)符合Hebbian原理: 一起发射的神经元会连在一起。 相关性高的节点应该被连接而在一起。
Inception中 1×1的卷积恰好可以融合三者。我们一层可能会有多个卷积核,在同一个位置但在不同通道的卷积核输出结果相关性极高。一个1×1的卷积核可以很自然的把这些相关性很高,在同一个空间位置,但不同通道的特征结合起来。而其它尺寸的卷积核(3×3,5×5)可以保证特征的多样性,因此也可以适量使用。于是,这就完成了Inception module下图的设计初衷:4个分支:
New Version比Old Version是如何减少参数量的:
原始结构:
参数:(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)+
1x1x192x32=22016
最终输出的feature map: 64+128+32+32=256
New Version引入1×1的卷积后的效果:
(1)减少了模型参数
(2)减少了计算量
(3)减低了输出特征图的维度
1×1的卷积能减少参数和计算量的原理是:把通道变换的任务分成几步,其中1步让它来完成。在Old Version中,输入特征图的通道太多,3x3和5x5的卷积核所需的计算量就太大,为了避免这种情况,在3x3和5x5的卷积操作前分别加上了1x1的卷积核,以起到减少输入特征图通道数的作用(减少卷积的计算量)。
GoogleNet有22层深,比同年的VGG-19还深。包含了9个Inception Module,其结构如下图所示:
对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN,事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的Softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的Softmax会被去掉。