inception-v1:Going deeper with convolutions原文链接:https://arxiv.org/abs/1409.4842
inception-v2,v3:Rethinking the Inception Architecture for Computer Vision原文链接:https://arxiv.org/abs/1512.00567v2
inception-v4:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning原文链接:https://arxiv.org/abs/1602.07261
注:本文中所用图片均来自该部分对应论文
GoogLeNet(inception-v1,v2,v3,v4)阅读笔记
一、inception-v1:Going deeper with convolutions
(一)解决问题
提高深度神经网络性能最直接的方式是增加它们的尺寸。包括增加深度(网络层数)和它的宽度(每一层的单元数目即卷积网络中的通道数)。这是一种训练更高质量模型容易且安全的方法,尤其是在可获得大量标注的训练数据的情况下。
但是这个简单方案有两个主要的缺点:1.更大的尺寸通常意味着更多的参数,这会使增大的网络更容易过拟合,尤其是在训练集的标注样本有限的情况下(这是一个主要的瓶颈,因为要获得强标注数据集费时费力且代价昂贵)。2.均匀增加网络尺寸导致计算资源使用的显著增加。
(二)解决方法
1.引入稀疏性
显然通过使用一种稀疏的层次结构而非使用像FC/Conv这样的全级联式的结构有助于计算开销的降低。遗憾的是,现在的计算架构对于稀疏数据结构进行数值计算时效率非常低下,那么我们要怎么办呢?
答案是构建密集的块结构来近似最优的稀疏结构,即可使用由密集计算子结构组合而成的稀疏模块来对特征进行提取及表达。
Inception架构的主要想法是在计算机视觉卷积网络中近似地设计一个局部稀疏的结构,并且这个结构使用的是现有的密集部件。
该结构采用了四个分支,每个分支分别由1x1卷积、3x3卷积、5x5卷积和3x3max pooling组成,既增加了网络的宽度,也增加了网络对不同尺度的适用性。四个分支输出后在通道维度上进行叠加,作为下一层的输入。四个分支输出的feature map的尺寸可由padding的大小进行控制,以保证它们的特征维度相同(不考虑通道数)。为什么这种结构就可以实现稀疏性呢?个人理解是四条并行的卷积核作为密集模块,而这种密集块组合在效果上就相当于稀疏模块。本质上是通过在多个尺度上卷积再聚合将相关性强的特征汇聚到一起,在特征维度上利用了稀疏性。设计的子结构如下图所示:
2.进一步降维
下一层所有的卷积核都在上一层的所有输出合并后的结果上来做,造成了特征图厚度很大,那5×5的卷积核所需的计算量就太大了(5×5卷积核本身的计算成本比较高,并且随着层数的加深5×5卷积核的比例也会增加)。
这导致了Inception架构的第二个想法:在计算要求会增加太多的地方,明智地减少维度。也就是说,在昂贵的3×3和5×5卷积之前,1×1卷积用来计算降维(在特征图深度的维度上进行卷积的分解)。除了用来降维之外,也使用了更多的激活函数来提升非线性并且加深了网络层数。GoogLeNet网络的大部分收益正是来源于大量地使用降维(Inception-v2中原文)。最终的结果如下图所示。
3.整体结构的小技巧
- 由于技术原因(训练过程中内存效率),只在更高层开始使用Inception模块而在更低层仍保持传统的卷积形式是有益的,并且GoogLeNet结构也正是这么做的。
- 为了避免梯度消失问题,GoogLeNet巧妙地在不同深度处增加了两个loss(添加辅助分类器)来保证梯度的顺利回传。
(三)效果、优点
- 参数少节省计算资源。(GoogLeNet的参数量只有Alexnet的1/12,而VGGNet的参数量却是Alexnet的3倍)
- 层数更深,使网络性能得以增加,提高了精度。
- 视觉信息在不同的尺度上处理然后聚合,使下一阶段可以从不同尺度同时抽象特征。
- 一定程度缓解了梯度消失问题。
二、inception-v2,v3
(一)解决问题
Inception架构的复杂性使得对网络进行改进变得困难。而inception-v1中并没有提供关于导致GoogLeNet架构的各种设计决策的贡献因素的明确描述。这使得它更难以在适应新用例的同时保持其效率。例如,如果认为有必要增加一些Inception模型的能力,将滤波器组大小的数量加倍的简单变换将导致计算成本和参数数量增加4倍。这在许多实际情况下可能会被证明是不可取的。
通俗来说,inception-v1虽然取得了很好的效果,但是由于结构上的复杂性,改进起来比较困难,所以在此提供了一些inception的通用设计原则(基于大规模实验的设计原则,inception在大规模数据的实验中能更好的发挥优势)来对inception-v1进行优化。
(二)改进原则
1.避免表征瓶颈
避免信息内容的极端压缩,应该从输入到输出缓慢减小(压缩)。理论上,信息内容不能仅通过特征的维度来评估,因为它丢弃了诸如相关结构的重要因素,但维度可以提供信息内容的粗略估计。所以粗略的说,特征图的尺寸应该逐渐地缓慢减小,避免突然减小,并且不要过早地减小。
2.增强高维表征
更高维度的表示在网络中更容易局部处理。在卷积网络中增加每个区块的激活允许更好地解耦特征。所产生的网络将训练更快。(在高层次Inception结构中33拆分成了13和3*1的卷积核并列,变得更宽,激活函数更多,以增强信息表征)
3.在低维度时进行空间聚合
在低维特征图处,可以在卷积之前先用1*1的卷积核实现降维(作者认为在低维特征处同一通道内的信息相关性高,所以在通道层次降维并没有太多不利影响,但却可以加快训练速度)。
4.平衡宽度和深度
增加网络的宽度和深度对网络的精确度提升都有帮助,但是如果同时增加宽度和深度,计算量会增大,因此在有限的计算资源下,将网络的宽度和深度设置在一个平衡的状态才能达到更好的性能。
(三)具体方法
1. 分解到更小的卷积
具有较大空间滤波器(例如5×5或7×7)的卷积在计算量上会成平方地增大(具有n个滤波器的5×5卷积在具有m个滤波器的网格上比具有相同数量的滤波器的3×3卷积的计算量高25/9=2.78倍)。与此同时较大空间滤波器可以捕获更远的单元激活之间、信号之间的依赖关系(更广阔的视野),因此若是直接减小滤波器的几何尺寸也会损失表现力。
如何平衡计算量和视野两个因素呢?答案是通过小卷积核的级联来代替大的卷积核。比如使用两层的3×3卷积就可以获得和5×5卷积同样的视野,如下图所示,但计算量仅仅增加了一倍,不再是成平方增长(25/(25-9×2)=0.28,产生了28%的相对增益)。与此同时加深了网络的深度和非线性。
应用到inception结构后,有下面两图的变化过程。
2. 分解为不对称卷积
上述结果表明,大于3×3的卷积滤波器可能通常是没有用的,因为它们总是可以简化为3×3卷积层序列。我们仍然可以问这个问题,是否应该把它们分解成更小的,例如2×2的卷积。然而,通过分解为不对称卷积(n×1接上1×n),可以做出比2×2更好的效果。例如使用3×1卷积后接一个1×3卷积表达效果与3×3卷积相同,如下图所示。不对称卷积方案节省了33%的计算量,而分解为两个2×2卷积表示仅节省了11%。
进一步可以推广到n×n卷积的情况,n*n卷积因式分解为1×n和n×1。但是实验证明这个方法在网络前面部分(特征图尺寸较大的层)似乎表现欠佳,在拥有中等尺寸( 12 ~ 20)特征图的层却可以起到很好的效果(由此可以看出inception结构非常注意对特征图尺寸的研究,并且针对不同尺寸的特征图也有对应着不同结构的inception块进行应对)。因此inception结构进一步改进如下图。
3.利用辅助分类器
inception-v1引入了辅助分类器的概念,用以改善非常深的网络的收敛。实验发现辅助分类器在训练早期并没有导致改善收敛,但接近训练结束,有辅助分类器的网络开始超越没有任何分支的网络的准确性,达到了更高的稳定水平。
4.有效减小特征图尺寸
原始的inception块是不具备减小特征图尺寸的功能的,想缩小特征图必须通过块外加池化层实现。假设有一个d×d×k的特征图,为了转换成d/2×d/2×2k大小,可以先用1×1卷积变成d×d×2k,再进行池化,这样的计算量很大(下图右半部分,也是v1中使用的方法)。而先池化再增加通道则会出现表征瓶颈的问题(下图左半部分)。
为了减少计算量且保留特征表达,作者提出一种双线结构,使用卷积部分和池化部分,二者步长都为2。通过将两个部分的步长提升为2的方式,赋予了改进后inception块缩减特征图尺寸的功能,直接将块外池化集成到了块内。平衡了信息量的保留和计算量缩小二者之间的关系。将两部分按深度合并起来如下图(左半部为从操作的角度,右半部分为从特征图尺寸的角度来看)。
(四)inception-v2,v3结构
1.inception-v2
使用上个部分中的四个方法对inception-v1进行改进形成了下图中的结构(再此之前出现了BN结构,而v2,v3都使用了此结构)。
2.inception-v3
在inception-v2基础上增加了几种处理:
- RMSProp优化器
- 使用了LabelSmoothing
- 77卷积变成了17和7*1的卷积核叠加
- 辅助分类器使用了 BatchNorm
三、inception-v4和Inception-ResNet
和Inception-ResNet
(一)inception-v4
1.目的
研究Inception本身通过变得更深更宽能否能变得更加高效。因为Tensorflow开始广泛使用,不再需要人为去特别优化内存的使用,在这样的前提下将模块规范统一。
2.结构
整体来看分为三个部分:1.Stem块 2.三个主要的 Inception 模块3.两个用于缩减特征图尺寸的过渡块。
(1)整体结构下图:
(2)stem块结构:
(3)三个主要的Inception块结构
(4)两个过渡块结构
(二)Inception-ResNet
1.目的
鉴于ResNet取得了非常好的表现,并且ResNet注重的化简优化问题从而加快收敛速度,而inception注重的是对特征图的处理,二者并不冲突。自然就想到将二者结合在一起来提升GoogleNet的收敛速度和精度。
2.结构
大致来说就是在原来inception块中将池化旁路替换为恒等映射(即不做任何操作)。并且要保证残差相加运算可行,卷积之后的输入和输出必须有相同的维度。因此,我们在原始卷积块操作之后使用 1x1 卷积来匹配深度(深度在卷积之后会增加)。
Inception-ResNet-v1,v2总体结构图:
(1)Inception-ResNet -v1结构
stem结构:
三个inception块结构:
两个过渡块
(2)Inception-ResNet -v2结构
stem结构图
3个inception块结构图
两个过渡块结构:
3.效果
Inception-ResNet v2、ResNet152和Inception v4模型规模差不多,v4略小,Inception-ResNet v1和Inception v3和ResNet50模型规模相当,精度也相似。
参考链接:
深入理解GoogLeNet结构(原创)Inception v1阅读论文的同时也参考了下列资料来完善和纠正自己的理解,在此表示感谢。
经典分类CNN模型系列其三:Inception v1
Going Deeper with Convolutions——GoogLeNet论文翻译
【深度学习】GoogLeNet系列解读 —— Inception v1
解读Inception (V1 V2 V3 V4)
Inception v1
深入理解GoogLeNet结构(原创)
Inception-V3论文翻译——中文版
增加加深加深结构结构结构。结构