主要参考: https://www.cnblogs.com/yifdu25/p/8542740.html
1. inception v1
paper: Going Deeper with convolutions
(*) code: https://github.com/loveplay1983/inception/blob/master/inception.py (keras) 现在这个版本用的很少了
inception v1 最关键的就是inception模块。
这样的结构主要有以下改进:
- 一层block就包含1x1卷积,3x3卷积,5x5卷积,3x3池化(使用这样的尺寸不是必需的,可以根据需要进行调整)。这样,网络中每一层都能学习到“稀疏”(3x3、5x5)或“不稀疏”(1x1)的特征,既增加了网络的宽度,也增加了网络对尺度的适应性;
- 通过deep concat在每个block后合成特征,获得非线性属性
虽然这样提高了性能,但是网络的计算量实在是太大了,因此GoogLeNet借鉴了Network-in-Network的思想,使用1x1的卷积核实现降维操作,以此来减小网络的参数量,如图所示。
参数量为:1x1x192x64+1x1x192x96+1x1x192x16+3x3x96x128+5x5x16x32+1x1x192x32=163328
如果不加1x1,输入28x28x192,输出28x28x416:1x1x192x64+3x3x192x128+5x5x192x32=387072
由此可见,降低了weights,同时降低了dimension。将这个模块的优点概括如下:
(1)实现了通道降维和增维,1x1卷积用于降维,减小参数量和feature map的维度;
(2)由于1x1只有一个参数,相当于对原始feature map做scale,且训练效果较好;
(3)增加了网络深度和宽度;
(4)同时使用了1x1,3x3,5x5,具有多尺度的特点
另外,它为了保证网络收敛,构建了三个额外的loss;也可以将全连接层替换成gloabal average pooling。
2. inception v2
paper: Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift
其实inception v2主要做的改进就是加入了batch normalization,BN在CNN中是非常重要的一个概念,因而这边一起回顾一下。它在网络结构上其实也做了一些改动,我将其和inception v3一起介绍,这里重点就将BN。
主要解决的问题:Internal Covariate Shift
机器学习中有一个经典假设,源空间和目标空间的数据分布是一致的。Covariate Shift 是其中的一个分支:源空间和目标空间的条件概率是一致的,但边缘概率不同。
对于神经网络的各层输出,在经历了层内操作之后,各层输出分布会与对应的输入信号分布不同,而且差异会随网络深度增大而增加了,但每一层所指的label仍然不变。
动机:参考了白化操作
在传统的机器学习中,对图像提取特征之前,都会对图像做白化操作,输入数据变换成0均值,单位方差的正态分布。
对于深度网络,每个隐藏层的输出都是下一个隐藏层的输入,因而均可做白化。
在一个mini-batch中,BN算法如下:
其中,测试时,其使用的方差是方差的无偏估计。无偏估计是指估计量的数学期望等于被估计参数。
下面是整个网络中训练时的算法,包括了训练和测试的过程。
理解:
(1)归一化作用:经过BN后,大部分**值落入非线性函数的线性区,对应倒数远离饱和区,防止梯度小时,加速训练收敛过程。
(2)增加shift和scale:往非线性区移动,避免完全变为线性,降低网络性能,因而希望找一个线性和非线性的平衡点。
优点:
(1)有效遏制了梯度爆炸和消失
(2)解决了ICS问题
其他的优点包括训练更快,可以有更大的学习率,权重更易初始化,支持更多的**函数。
3. inception v3
paper: Rethinking the Inception Architecture for Computer Vision
code: https://github.com/ColeMurray/keras-inception-v3-tutorial (keras)
解决的主要问题:
(1)减少特征的表征性瓶颈。直观上来说,当卷积不会大幅度改变输入维度时,神经网络可能会执行地更好。过多地减少维度可能会造成信息的损失,这也称为「表征性瓶颈」。
(2)使用更优秀的因子分解方法,卷积才能在计算复杂度上更加高效。
主要做法:
(1)分解卷积核尺寸:
分解成对称小核:使用2个3x3的卷积代替梯度(特征图,下同)为35x35中的5x5的卷积,这样既可以获得相同的视野(经过2个3x3卷积得到的特征图大小等于1个5x5卷积得到的特征图),还具有更少的参数,还间接增加了网络的深度,如下图。
figure 5
分解成不对称小核:3x3的卷积核表现的不错,那更小的卷积核是不是会更好呢?比如2x2。对此,v2在17x17的梯度中使用1*n和n*1这种非对称的卷积来代替n*n的对称卷积,既降低网络的参数,又增加了网络的深度(实验证明,该结构放于网络中部,取n=7,准确率更高),如下。
figure 6
模块中的滤波器组被扩展(即变得更宽而不是更深)。在梯度为8x8时使用可以增加滤波器输出的模块(如下图),以此来产生高维的稀疏特征。
figure 7
(2)避免使用瓶颈层
inception模块之间特征图的缩小,主要有下面两种方式:
右图是先进行inception操作,再进行池化来下采样,但是这样参数量明显多于左图(比较方式同前文的降维后inception模块),因此v2采用的是左图的方式,即在不同的inception之间(35/17/8的梯度)采用池化来进行下采样。
但是,左图这种操作会造成表达瓶颈问题,也就是说特征图的大小不应该出现急剧的衰减(只经过一层就骤降)。如果出现急剧缩减,将会丢失大量的信息,对模型的训练造成困难。
因而inceptionv3采用一种并行的降维结构,如下图:
具体来说,就是在35/17/8之间分别采用下面这两种方式来实现特征图尺寸的缩小,如下图:
figure 5' 35/17之间的特征图尺寸减小
figure 6' 17/8之间的特征图尺寸缩小
这样就得到Inception v3的网络结构,如表所示。
(3)使用额外的分类器
训练早期不推荐使用额外的分类器。额外的分类器可以将梯度有效传递回去,不会有梯度消失的问题,加快了训练;中间层空间特征比较丰富,利于提高模型判别力。
4. inception v4
paper: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
code: https://github.com/titu1994/Inception-v4
由于残差连接的优越性,这里考虑将inception 和 残差连接在一起。这篇文章介绍了三个网络,inception v4无残差,inceotion resnet v1/v2均加入了残差连接。
接下来对比一下三个网络的区别:
整体架构:
inception v4 inception-resnet-v1/v2
stem 模块:
inception v4/ inception- resnet -v2 inception-resnet-v1
inception 模块:
inception v4:
inception A inception B inception C
inception resnet v1:
inception A inception B inception C
inception-resnet-v2
inception A inception B inception C
reduction 模块:
reduction A:
reduction B:
inception v4 inception resnet v1 inception resnet v2
几点说明:
(1)参数量:Inception-ResNet v1 的计算成本和 Inception v3 的接近。Inception-ResNetv2 的计算成本和 Inception v4 的接近。它们有不同的 stem,正如 Inception v4 部分所展示的。
(2)inception-residual中 1x1卷积作用:为了使残差加运算可行,卷积之后的输入和输出必须有相同的维度。因此,我们在初始卷积之后使用 1x1 卷积来匹配深度(深度在卷积之后会增加)。
(3)reduction block: Inception v4 引入了专用的「缩减块」(reduction block),它被用于改变网格的宽度和高度。
(4)如果卷积核的数量超过 1000,则网络架构更深层的残差单元将导致网络崩溃。因此,为了增加稳定性,作者通过 0.1 到 0.3 的比例缩放残差**值。
(5)研究发现 Inception-ResNet 模型可以在更少的 epoch 内达到更高的准确率,结合残差连接可以显著加速 Inception 的训练。inception-resnet有v1和v2两个版本,v2表现更好且更复杂。