背景
该篇主要介绍Inception系列,主要包含Inception V1、Inception V2、Inception V3、Inception V4、Inception-Resnet。
Google家的Inception系列模型提出的初衷主要为了解决CNN分类模型的两个问题,其一是如何使得网络深度增加的同时能使得模型的分类性能随着增加,而非像简单的VGG网络那样达到一定深度后就陷入了性能饱和的困境(Resnet针对的也是此一问题);其二则是如何在保证分类网络分类准确率提升或保持不降的同时使得模型的计算开销与内存开销充分地降低。
Inception V1-2014年
卷积网络为了提取高维特征,一般方式进行更深层卷积,但是随之带来网络变大的问题。Inception V1模块(借鉴network in network论文中mlpconv思想)提出可以使网络变宽,在保证模型质量的前提下,减少参数个数,提取高维特征。
下面先抽象说明一下Inception V1的基本思想:
Inception结构,首先通过1x1卷积来降低通道数把信息聚集一下,再进行不同尺度的特征提取以及池化,得到多个尺度的信息,最后将特征进行叠加输出(官方说法:可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能)。
主要过程:
- 相应的在3x3卷积和5x5卷积前面、3x3池化后面添加1x1卷积,将信息聚集且可以有效减少参数量(称为瓶颈层);
- 下一层block就包含1x1卷积,3x3卷积,5x5卷积,3x3池化(使用这样的尺寸不是必需的,可以根据需要进行调整)。这样,网络中每一层都能学习到“稀疏”(3x3、5x5)或“不稀疏”(1x1)的特征,既增加了网络的宽度,也增加了网络对尺度的适应性;
- 通过按深度叠加(deep concat)在每个block后合成特征,获得非线性属性。
注:在进行卷积之后都需要进行ReLU激活,这里默认未注明。
利用Inception V1模块叠加形成GoogLeNet网络,结构图如下:
注:其使用了两个辅助分类器,权重为0.3,但存在“第一个loss对网络无作用的说法”。
Inception V2、Inception-V3 -2015年
网络设计准则:
- 减少特征的表征性瓶颈。直观上来说,当卷积不会大幅度改变输入维度时,神经网络可能会执行地更好。过多地减少维度可能会造成信息的损失,这也称为「表征性瓶颈」。防止特征描述的表征性瓶颈(也就是在早期尽量少使用1x1卷积核):会造成某层对空间维度压缩时,导致很多特征丢失;
- 特征内部相关性越高,子特征之间越独立,网络收敛越快;
- 压缩特征维度数,达到减少计算量的目的;对于整个网络结构,尽量保持深度和宽度平衡。
设计方法:
- 针对第一种和第三种设计准则,采用将“1x1卷积—maxpolling”改变为“并行卷积和池化,然后将两者依据深度进行拼接”,如下图示例:
- 分解卷积核尺寸,包括:改用多个小尺寸卷积核替换大尺寸卷积核;使用非对称卷积核(主要用于网络中间,特征在12-20的层作用明显),如下图示例:
- 加入BN层,尤其是在额外的辅助分类器上添加BN层。
- V3版本使用了RMSProp 优化器。
- 使用label smoothing对网络loss进行规则化处理(不懂)。
下图是其网络图:
Xception
是在inception v3基础上结合mobilenet和resnet提出的改进。传统的模块如下:
添加mobilenet中的思想,改进如下:
也就是先进行1x1卷积,然后对每一个通道的feature map分别采取3x3卷积,最后进行concat。
在此模块基础上,添加resnet结构,故Xception网络结构图如下:
Inception V4-2016年
改进点在:使模块更加一致。作者还注意到某些模块有不必要的复杂性。这允许我们通过添加更多一致的模块来提高性能。对不同尺度的网格都采用统一的inception模块(不懂)。下图是Inception-v4的整体结构,其中的stem部分,用于对进入Inception模块前的数据进行预处理。stem部分其实就是多次卷积+2次pooling,pooling采用了Inception-v3论文里提到的卷积+pooling并行的结构,来防止bottleneck问题。stem后用了3种共4个Inception模块,三种Inception模块具体是怎么取舍参数的论文没有过多解释,估计还是靠经验判断吧。三种Inception模块间的Reduction模块起到pooling作用,同样使用了并行的结构来防止bottleneck问题。
在下面的网络结构图中:所有后面不带V的卷积,用的都是same-padded,也就是输出的网格大小等于输入网格的大小(如vgg的卷积一样);带V的使用的是valid-padded,表示输出的网格尺寸是会逐步减小的(如lenet5的卷积一样)。
下面是Inception
V4的网络图:
具体细节如下:
注:其中Reduction模块(亦称为缩减块)主要用于改变网络的宽度和深度。
Inception-resnet-v1 & Inception-resnet-v2 -2016年
随着何凯明等人提出的ResNet v1,google这边坐不住了,基于inception的基础上,引入了残差结构,提出了inception-resnet结构。论文主要论述了inception-resnet-v1 (在Inception-v3上加入ResNet)和Inception-ResNet-v2(在Inception-v4上加入ResNet)。相应的添加残差网络,网络收敛速度更快。两者网络基本相同,其中参数设置有些许变化。网络图如下:
对于Inception-resnet-v1的具体细节如下
对于Inception-resnet-v2的具体细节如下
注:其中缩减块用于控制层的宽度和深度;为了使残差加运算可行,卷积之后的输入和输出必须有相同的维度。因此,我们在初始卷积之后使用 1x1 卷积来匹配深度。
模型训练
如果卷积核的数量超过
1000,则网络架构更深层的残差单元将导致网络崩溃。因此,为了增加稳定性,在将残差与其上一层的激活值相加之前,将残差缩放,这样可以使训练过程稳定。通常采用0.1至0.3之间的缩放因子来缩放残差层,然后再将其添加到累加层的激活层,如图:(不懂)
作者:莫一丞元
文章来源:CSDN
推荐阅读
更多芯擎AI开发板干货请关注芯擎AI开发板专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。