本篇主要介绍GoogLeNet,其被改进并应用在了YOLOV1目标检测算法中。
GoogLeNet是google推出的基于Inception模块的深度神经网络模型,在2014年的ImageNet竞赛中夺得了冠军,在随后的两年中一直在改进,形成了Inception V2、Inception V3、Inception V4等版本。
在了解GoogleNet之前,我们首先需要了解一下Inception
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,但一味地增加,会带来诸多问题:
1)参数太多,如果训练数据集有限,很容易产生过拟合;
2)网络越大、参数越多,计算复杂度越大,难以应用;
3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
我们希望在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。在这种需求和形势下,Google研究人员提出了Inception的方法。
当然之后出现了ResNet,Inception也在后来的改进中应用到了ResNet
Inception就是把多个卷积或池化操作,放在一起组装成一个网络模块,设计神经网络时以模块为单位去组装整个网络结构。模块如下图所示:
在未使用这种方式的网络里,我们一层往往只使用一种操作,比如卷积或者池化,而且卷积操作的卷积核尺寸也是固定大小的。但是,在实际情况下,在不同尺度的图片里,需要不同大小的卷积核,这样才能使性能最好,或者说,对于同一张图片,不同尺寸的卷积核的表现效果是不一样的,因为他们的感受野不同。所以,我们希望让网络自己去选择,Inception便能够满足这样的需求,一个Inception模块中并列提供多种卷积核的操作,网络在训练的过程中通过调节参数自己去选择使用,同时,由于网络中都需要池化操作,所以此处也把池化层并列加入网络中。
读到这里,有没有发觉和SPP(Spatial Pyramid Pooling 空间金字塔池化)很像,它们同样都可以得到不同尺度的特征图,只不过此处的Inception是通过卷积来实现,而SPP则是通过池化实现罢了,那么两者还有什么联系与区别呢?
池化层输出的感受野由其输入的感受野和特征步长, 以及池化层的 核尺寸 共同决定.
卷积层输出的感受野由其输入的感受野和特征步长, 以及卷积层的 核尺寸 和 膨胀系数 共同决定.
所以一个输入要想得到多尺度 (多感受野尺寸) 的输出, 方法可能有 :
1.经过不同 核尺寸 (和相应的 填充尺寸) 的 池化层, 融合它们的输出特征, 此对应于 SPP (Spatial Pyramid Pooling).
2.经过不同 膨胀系数 (和相应的 填充尺寸) 的 卷积层, 融合它们的输出特征, 此对应于 ASPP (Atrous Spatial Pyramid Pooling).
3.经过不同 核尺寸 (和相应的 填充尺寸) 的 卷积层, 融合它们的输出特征, 此对应于简化版的 Inception Module.
4.先经过不同 步长 的卷积层或池化层, 再归一化到相同的尺寸进行融合 (可联想到 FPN, PANet 等 cross-scale feature fusion 方案).
5.上述方法的组合.
我们在上面提供了一种Inception的结构,但是这个结构存在很多问题,是不能够直接使用的。首要问题就是参数太多,导致特征图厚度太大。为了解决这个问题,作者在其中加入了1X1的卷积核,改进后的Inception结构如下图
这样做有两个好处,首先是大大减少了参数量,其次,增加的1X1卷积后面也会跟着有非线性激励,这样同时也能够提升网络的表达能力。
了解到 Inception 我们就可以理解GoogleNet了。
GoogLeNet的整体网络结构如下图所示:
对上图说明如下:
1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。
3)虽然移除了全连接,但是网络中依然使用了Dropout ;
4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)
对于前三点都很好理解,下面我们重点看一下第4点。这里的辅助分类器只是在训练时使用,在正常预测时会被去掉。辅助分类器促进了更稳定的学习和更好的收敛,往往在接近训练结束时,辅助分支网络开始超越没有任何分支的网络的准确性,达到了更高的水平。
至此,整个GoogLeNet网络便介绍完毕了。