Fork me on GitHub

经典卷积神经网络算法(4):GoogLeNet

 

1 引言

 

GoogLeNet是在2014年由Google团队在论文《Going deeper with convolutions》中提出的一个卷积神经网络算法,并成功斩获当年的ImageNet大赛的冠军(上篇博客中的VGG网络获得第二名)。与VGG网络相比,GoogLeNet对网络结构做出了根据创新性的大胆改变,这些改变主要表现在以下几个方面:

(1)引入了Inception结构(融合不同尺度的特征信息)

(2)使用了1*1的卷积核进行降维以及映射处理

(3)添加两个辅助分类器帮助训练

(4)对全连接层,使用平均池化层(大大减少模型参数)

 

2 Inception v1

2.1 原始版的Inception网络结构

 

在卷积网络结构中,提升网络性能最直接的方法就是提升网络的深度和宽度,但是,网络结构深度和宽度的提升也将带来一些问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。

那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。如下图所示就是最原始的Inception网络结构:

 

 

这种网络结构对同一特征图使用不同的尺寸的卷积核进行卷积和池化操作(在卷积和池化过程中,通过调节padding和步长是的所有卷积核池化操作输出尺寸一致),然后对所有操作输出的特征图在进行一次堆叠作为Inception网络的输出。然而,这种结构却仍然不够理想,因为计算量的问题依然没有得到很好的改善。

 

2.2 1*1的卷积核

 

对于Inception没有显著降低计算量的问题,Google团队的做法是在33和55的卷积操作前,先对特征图进行一次11卷积操作。
1
1的卷积实际上是对特征图中不同通道上相同位置的像素值惊喜线性组合,且保留了图片的原有平面结果,调整通道熟练IG,从而实现降维或升维的功能。
下左图显示了1×1卷积核用于降维。输入为4×4的平面,共3个通道。用两个1×1的卷积核(卷积层)作用之后,变为4×4的平面,共2通道。同理,下右图展示了升维的操作。

 

 

添加1*1卷积后,Inception网络结构如下图所示:

 

 

为什么在33和55卷积前添加一层11卷积能达到降低计算量的作用呢?
以5
5卷积为例,假设对100 100 128的特征图进行卷积,使用256个5 5卷积核进行卷积操作,参数量为(128 5 5+1)256=819456,如果在进行55卷积之前,使用32个11卷积核进行卷积,得到将是32 100 100的,然后在使用256个5 5的卷积核进行卷积,参数量为(128 1 1+1) 32+(32 5 5+1) * 256=209184。可见,参数量大大减少。

 

Inception V1 参数少但是效果好的原因除了模型层数更深,表达能力更强外,还有两点:一是去除最后的全连接层,用全局平均池化层(即将图片尺寸变为1*1)来取代它。全连接层几乎占据了 AlexNet 或者 VGGNet中90%的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。二是 Inception V1中精心设计的 Inception 网络结构 提高了参数的利用效率。GoogLeNet完整结构(22层)如下图所示。

 

 

3 Inception v2

在Inception v1的基础上Google团队进一步提出了Inception v2网络结构。Inception v2有两大创新:卷积核分解、Pooling与Inception操作并行。

3.1 卷积核分解

卷积核分解是指使用多个小卷积核替代一个大卷积核进行多次卷积操作,Google团队通过大量实验证明,两者是可以实现等效的。如下图所示,是使用两个33的卷积核代替一个55的卷积核,参数量从25减少到18.

 

 

进一步地,n n的卷积操作可以分解为两次卷积操作,分别是1 n和n 1的卷积操作。如下图所示为使用1 3和3 1的卷积核代替一个3 3的卷积核进行卷积操作。

 

 

由此,Inception v1结构可以做如下改变:

 

 

3.2 Inception与池化的顺序问题

Inception卷积与池化操作都可以使得特征图的尺寸缩小,那么,到底是应该先执行Inception卷积,还是先池化呢?如下图(左)所示,先作pooling(池化)很可能会丢失部分特征,导致特征表示遇到瓶颈(特征缺失),而右图是正常的缩小,但计算量很大。

 

 

为了同时保持特征表示且降低计算量,Google团队在Inception v2中将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)。

 

posted @ 2020-06-09 07:45  奥辰  阅读(1189)  评论(0编辑  收藏  举报