目录
三 Inception v4、Inception-Resnet-v1、Inception-Resnet-v2
论文地址:
Going deeper with convolutions
Batch Normalization
Rethinking the Inception Architecture for Computer Vision
Inception-v4, Inception-ResNet
一 Inception v1
1 网络性能优化
网络提升性能的一般方法:增加网路结构的深度和宽度。(深度:网络层数;宽度:神经元数)。
但存在的问题:
- 参数的增多,更容易过拟合
- 网络增大,计算量变大,需要更多的计算资源
- 网络变深,容易梯度消失,优化困难(此时还没有提出BN)
所以我们想要,在增加深度和宽度的同时,降低参数的使用。
- 解决办法:把全连接改成系数连接(卷积层就是稀疏连接),但是不对称的稀疏连接数值计算效率低下(硬件基本上是针对密集矩阵优化)。稀疏矩阵虽然参数量少,但计算时间却很难减少。所以需要既能保持网络结构的稀疏性,又能利用密集矩阵的高性能。有论文表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,GoogLeNet团队提出了Inception网络结构
2 inception结构
通过设计一个稀疏网络结构,同时能产生稠密的数据。(既能增加神经网络表现,又能保证计算资源的使用效率)
- 该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化(3x3)并联在一起,输出进行concat。一方面增加了网络的宽度,另一方面,使用不同大小的卷积核,增加了网络对尺度的适应性。
- 下图使用了1*1的卷积:
- 降低特征图的channel,减小参数,解决计算瓶颈
- 增加非线性,增强表达能力
3 inception 模块参数
(上图红色数字为举例的channel数)
左图:
参数:(1*1*192*64) + (3*3*192*128) + (5*5*192*32) = 387072
feature map 的channel:64+128+32+192 = 416
右图:
参数:(1*1*192*64) + (1*1*192*96 + 3*3*96*128) + (1*1*192*16 + 5*5*16*32) + (1*1*192*32) = 163328
feature map 的channel:64+128+32+32 = 256
另外: AlexNet(60M)、VGG(144M ),GoogLeNet(5M)
4 googLenet 优点和网络特点
优点
- 此网络架构的主要特点就是提升了对网络内部计算资源的利用。
- 增加了网络的深度和宽度,网络深度达到22层(不包括池化层和输入层),但没有增加计算代价。
- 参数比2012年冠军队的网络少了12倍,但是更加准确。
网络特点
- 在低层仍然使用传统他的方式,高层用inception块叠加(论文中表述原因:训练阶段的内存效率问题)
- 网络最后采用了average pooling来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整
- 虽然移除了全连接,但是网络中依然使用了Dropout
- 为了解决梯度弥散的问题,在4a和4d的后面添加辅助loss(相当于中继监督),该loss仅在训练的时候以一定的weight(0.3)参与梯度传递。而在test的时候不使用。
5 googLenet 网络结构
1.在inception模块中,通常1*1的卷积比例(输出通道占比)最高,3*3和5*5的卷积占比稍低
2.在整个网络中,存在多个叠加的inception模块,希望后面的网络可以捕获更高阶的抽象特征,因此靠后的inception中,打卷机的占比应增多
3.网络输入的大小为224*224*3,图片做了归一化预处理(除以256)
注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷积操作之前使用了1x1卷积的数量
6 GoogLeNet数据预处理
训练数据
- 采样时,样本尺寸缩放从8%到100%,宽高比随机选取3/4或4/3(多尺度)
- 数据增强:随机更改图像的对比度,亮度和颜色。这样可以增加网络对这些属性的不变性
- 使用随机插值方法重置图像尺寸(因为网络输入层的大小是固定的),使用到的随机插值方法:双线性插值,区域插值,最近邻插值,三次方插值,这些插值方法等概率的被选择使用。图像放大时,像素也相应地增加 ,增加的过程就是“插值”程序自动选择信息较好的像素作为增加的像素,而并非只使用临近的像素,所以在放大图像时,图像看上去会比较平滑、干净
- 改变超参数(反向传播若干次之后改变超参数,或者误差达到某阈值时改变超参数)
预测数据
(实际应用中不必要这样操作)
- 将图片缩放到不同的4种尺寸(纵横比不变,GoogleLeNet使用的4种尺寸为:缩放后的最短边长度分别为:256,288,320和352)。
- 对于得到的每个尺寸的图像,取左、中、右三个位置的正方形图像(边长就是最短边的长度。对于纵向图像来说,则取上、中、下三个位置),因此每个尺寸的图像得到3个正方形图像;
- 然后再在每个正方形图像的4个crop顶点和中心位置处crop处224*224的图像,此外再加上将这个正方形图像缩放到224*224大小的图像,因此每个正方形图像得到6个224*224的图像;
- 最后,再将所有得到的224*224的图像水平翻转。因此,每个图像可以得到4*3*6*2=144个224*224大小的图像。
- 将这些图像分别输入神经网络进行分类,最后取平均,作为这个图像最终的分类结果。
二 Inception V2 v3
inception v2和inception v3出自同一篇论文Rethinking the Inception Architecture for Computer Vision。
从google的V2的源码,可以看出改进主要有:
(1)使用了batch normalization(深度学习之 Batch Normalization) (2)使用了两个conv3*3代替一个5*5
1 模型设计规则
(1) 防止出现特征描述的瓶颈
指输入输出维度差距较大的层,就像瓶颈一样。对特征在空间维度进行较大比例的压缩,导致很多特征丢失。
- bottleneck layer的使用。不要一下子使用1x1 conv缩减过多的feature maps的channels数目,尤其在低层。一定要用也要在靠后使用
- Pooling的使用。Pooling是CNN结构中必须的功能,但我们可以通过一些优化方法来减少Pooling造成的损失。
(2) 适当的宽度是必要的
相互独立的特征越多,输入的信息被分解的越彻底,分解的子特征间相关性低,子特征内部相关性高。这样信息更加丰富全面,更容易收敛。
(3) 更高成可以进行较大幅压缩
在网络的后端,可以使用bottleneck对其channels进行压缩,然后再进行3*3conv这样较大的计算。这种操作不仅不会影响模型精度,反而能加快收敛速度。论文猜想性解释,后期较小size的feature maps的相邻channels至今具有更多的相关性(更多的冗余信息),因此可以较大幅压缩channels。
(4) 平衡网络的深度和宽度
等比例的增大深度和维度才能最大限度的提升网络的性能。瘦高或矮胖的CNN网络都不如一个匀称的网络效果好。
2 优化方法
方法1:大尺度的卷积分解成多个小尺度的卷积。
- 比如:1*(5*5) conv === 2*(3*3) conv。两种方式具有相同的感受野。参数比(3*3+3*3) / (5*5) =18/25
方法2:使用非对称卷积。作者通过测试发现,非对称卷积在网络中靠中间的层级才有较好的效果(特别是feature map的大小再12*12~20*20之间时)
- n*n conv === 1*n conv + n*1 conv。例如如图n=3,分解后就能节省33%的计算量。
方法3:使用并行结构来优化Pooling。
深度神经网络中会使用Pool层来减少feature maps size。这意味着传递的信息不断丢失。一般为了减少信息过度丢失:
- 在传入Pool层减少feature maps size之前,同比扩大它的channels数目(之后的网络基本采用这种)。相当于提供了冗余信息然后再Pooling掉。不过其中1*1conv的计算会有非常大的计算开销。
- 先使用Pooling,然后再使用1*1conv增大channels。不过这种方式的conv只能补偿少量Pooling损失的信息。
所以针对上面的问题,作者提出了并行结构:一路卷积、一路Pooling,两路并行再concat。这种方式既有很好的效果,有没有增大计算量。
方法4:使用Label Smoothing来对网络输出进行正则化
softmax层的输出公式和交叉熵损失公式如图:
假设分类的标签是onehot形式。理想情况下从softmax的输出,正确类别的数值为1,其他为0。这样就会造成overfit(overfit:能对所有的输入进行理想的分类,鲁棒性很差)。所以为了克服overfit,防止最终出来的正确的分类p(k)=1, 在输出p(k)时加入个参数delta,生成新的q'(k)
3 网络结构
将上述的方法结合,构成下图结构Inception v2。如果在辅助分类器上添加BN,即Inception v3。
figure 5 figure 6 figure 7
三 Inception v4、Inception-Resnet-v1、Inception-Resnet-v2
题目三种结构皆出自一篇论文Inception-v4, inception-resnet and the impact of residual connections on learning,这里着重描述一下每个版本的网络结构。
再次说明下,在inception网络设计中,最开始的几层不建议使用inception等模块来获得特征节省计算.
1 Inception v4
Inception-A Inception-B Inception-C
Reduction-A 35->17 (V4、InReV1、InReV2都使用) Reduction-B 17->8
Inception V4 Stem (V4/InReV2都使用)
2 Inception-Resnet-v1
Inception-ResNet-A Inception-ResNet-B
Inception-ResNet-C Reduction-B 17->8
Stem Inception-Resnet-v1
3 Inception-Resnet-v2
整体的网络结构与 Inception-Resnet-v1一致,stem与Inception V4一致,其余内部模块有所变化。
Inception-ResNet-A Inception-ResNet-B
Inception-ResNet-C Reduction-B 17->8
4 实验结果
下图为inception v3/v4与inception-resnet v1/v2模型的收敛速度对比图。我们可以看到,有残差的模块,收敛的速度更快,但最终的精度基本相同。
Top-5 error Top-1 error
精度对比
补充
inception系列,预测效果表现优异,同时计算和训练参数占的内存开销都不算大。为什么后来的网络并没有大幅采用inception模块?
与VGG和resnet相比,inception的连接过于复杂,对于实际在低层做优化执行的工程师而言,过于复杂的网络结构意味着更多的工程设计与思考才能使运算得到优良的并行加速和执行。因此当下为止Resnet系列的分类网络还是主流所用的视觉分类网络。