不同版本Inception Network介绍

声明

  1. 参考A simple Guide to the Versions of the Inception Network,同时有一定的原创性。
  2. 现在网上有很多有关Inception的文章,但是都不如这篇英文文章介绍得好。
  3. 本文希望读者提前对神经网络、CNN有所了解。

Inception网络是卷积神经网络发展史上重要的里程碑,在Inception提出之前,卷积神经网络的发展仅仅是在不断的堆叠、加深。

另一方面,Inception网络比较复杂,复杂在网络结构和编程实现上。为了应用Inception,通常需要一些技巧(tricks)提升网络训练速度和网络学习效果。

Inception网络也是在不断发展,下面是最常见、最受欢迎的几个版本:

  • Inception v1
  • Inception v2 和 Inception v3
  • Inception v4 和 Inception-ResNet

Inception v1

论文:Going deeper with convolutions

引言

  1. 图像分类时,对分类影响大的部分被称为显著部分(salient parts),影响较小的部分被称为背景部分。显著部分在不同图像中的位置和大小不一,如下图所示。
    不同版本Inception Network介绍_第1张图片

上面三个图像的类别都是狗,但是左一显著部分占据全图,左二显著部分稍小且位于中间,左三的显著部分最小且在中间靠上。

  1. 图像分类任务中,我们通常用滑动窗口卷积的方式检测边缘,进而学习图像特征。
  2. 滑动窗口卷积可以cover显著部分在位置上的多样性
  3. 而显著部分在大小上的多样性,对超参数——卷积核大小——的选取造成很大的困扰。因为较大的卷积核擅长学习全局性的特征,较小的卷积核擅长学习局部性的特征。
  4. 当然,不同小卷积核堆叠形成更深的CNN也可以提取全局的特征。但这种方式计算量大,也容易引发梯度消失和过拟合。

解决方案

Inception v0

为了使网络既能学习全局性特征,又能学习局部性特征,做了如下改进:

  • 使用3个不同的卷积核 1 × 1 , 3 × 3 , 5 × 5 1\times1, 3\times3, 5\times5 1×1,3×3,5×5(论文中说也可以加上 7 × 7 , . . . 7\times7, ... 7×7,...但实验发现性价比不高)。
  • 在宽度上增加 3 × 3 3\times3 3×3最大池化 是为了增强图像的抗噪能力。
  • 以上4个模块的结果会在通道(channel)轴做拼接。
    不同版本Inception Network介绍_第2张图片

Inception v1

为了减少参数数目,降低计算量,做了如下改进:

  • 3 × 3 3\times3 3×3 5 × 5 5\times5 5×5之前加入了 1 × 1 1\times1 1×1用于压缩并学习通道特征
  • 3 × 3 3\times3 3×3最大池化 后加入 1 × 1 1\times1 1×1也是为了压缩并学习通道特征
    不同版本Inception Network介绍_第3张图片

读者可能会问,为什么有时候 1 × 1 1\times1 1×1加在前、有时候在后?
这里论文没有给出说明,但我认为,从降低计算量的角度来看, 1 × 1 1\times1 1×1应该加在前面。但是由于 3 × 3 3\times3 3×3最大池化 是无参操作,而且所以 1 × 1 1\times1 1×1放在后面也不会增加计算量(然后maybe实验表明放在后面更好)。

关于 1 × 1 1\times1 1×1卷积的作用,论文在第4章讲到:
1x1 convolutions are used to compute reductions before the expensive 3x3 and 5x5 convolutions. Besides being used as reductions, they also include the use of rectified linear activation making them dual-purpose.

GoogLeNet

运用Inception单元构造成GoogLeNet(PS: 通常说Inception网络就是指GoogLeNet),如下图所示:

  • 网络前端部分(红框所示)先用了几层普通的卷积模块过渡。
  • 网络主体部分是9个Inception单元。
  • 网络最后端是分类器单元(包括池化层和分类层)。
  • 网络附加部分(紫框所示)是又有两个分类器单元。

为什么多了两个分类器?影响美观( ̄へ ̄)
原因有二:一是网络太深了,误差反向传递的时候对网络前端影响有限,加入的两个分类器可以防止梯度消失。二是实验表明网络中间层特征已经足够用来进行分类了,即中间分类器的分类结果可信,中间损失对参数更新有一定的指导性。

网络前端部分不能替换成Inception吗?这样直接10个Inception,毕竟你前面一直说Inception大法好。
我也不清楚,可能是Inception的局限性?只隐约知道Inception单元不要在网络一开始就用。希望路过的朋友能在评论区留下您的见解~

Inception v2

论文:Rethinking the Inception Architecture for Computer Vision (PS: 这篇文章特别工程化,不值得细读)

引言

论文在一开始给出设计网络的4个原则:

  1. 避免过度降维(会导致representational bottlenecks),即不要让下一层网络的神经数目大幅减少。
  2. 神经网络非常善于处理高维数据。多加几层非线性网络可以是网络更好地解析复杂特征。
  3. 3 × 3 3\times 3 3×3 5 × 5 5\times 5 5×5前,用 1 × 1 1\times 1 1×1卷积压缩通道上的维度不会影响网络的性能。
  4. 网络的宽度和深度应该处于一个平衡的状态。

论文作者指出他们要在遵循以上4个原则的前提下,压缩网络的参数,以降低网络训练时的计算量。

解决方案

Inception v2提出了3中对卷积核进行因子分解(Factorization)的方法,用来减少卷积层的参数。

1. 用两个 3 × 3 3\times 3 3×3卷积替代 5 × 5 5\times 5 5×5

  • 减少了参数的数目,可以降低计算量。
  • 两个堆叠 3 × 3 3\times 3 3×3获得的感受野(receptive field)与 5 × 5 5\times 5 5×5是相同的。
    不同版本Inception Network介绍_第4张图片

2. 用 n × 1 n\times 1 n×1 1 × n 1\times n 1×n堆叠替代 n × n n\times n n×n

更进一步地减少参数的数目。
不同版本Inception Network介绍_第5张图片

3. 用 n × 1 n\times 1 n×1 1 × n 1\times n 1×n并联替代 n × n n\times n n×n

不同版本Inception Network介绍_第6张图片

Inception v2网络整体结构

不同版本Inception Network介绍_第7张图片

  • 上表中figure5、6、7分别对应上述的3种卷积核的因子分解方式1、2、3(PS: 你没看错,在一个网络中用了3中不同的Inception结构<\font>)。
  • 上表中红框所示部分是网络的前端部分,对应第一个版本GoogLeNet中的红框部分。

卷积核因子分解有效吗?
虽然论文中没有给出理论证明,但是从实验结果来看是有效的。

为什么用了3种Inception的结构?在其他的数据场景中,我们应该怎么用Inception v2呢?
只能说,论文就说是这样结果好,所以如果我们想在自己的场景中使用Inception,也免不了尝试不同的结构。

Inception v3

论文:Inception v2和v3是在同一篇论文中提出的

引言

  • Inception v1中有两个附加分类器,它们发挥的实际作用近似于正则化。
  • Inception v3主要从提高网络分类准确率的角度重新优化了Inception v2。

解决方案

  • 优化器从moment SGD换成了RMSProp。
  • 进一步改变了Inception的结构(具体怎么改变的下面会讲)。
  • 去掉了一个附加分类器,并在另一个附加分类器中加入了BatchNorm(关于BatchNorm技术,本文不作介绍)。
  • 在最后计算损失阶段使用了标签平滑正则化(Label Smoothing Regularization)。

进一步修改的Inception

深度学习中,卷积通常与池化堆叠(串联),池化操作通常都会造成特征维度的骤降,违反了“避免过度降维(会导致representational bottlenecks)”原则。

在Inception v2的结构表中,有input size从 35 × 35 × 288 35\times 35 \times 288 35×35×288 17 × 17 × 768 17\times 17 \times 768 17×17×768的变化,论文中说他们是这样做的(PS: 具体怎么个结构,论文这里说的不清不楚):
不同版本Inception Network介绍_第8张图片

  • 卷积(conv)的步长是2
  • 池化(pool)的步长是2

标签平滑正则化

在多分类中使用的损失函数是多分类交叉熵,其中 p ( k ∣ x ) = e x p ( z k ) ∑ i = 1 K e x p ( z i ) p(k|x)=\frac {exp(z_k)}{\sum_{i=1}^K exp(z_i)} p(kx)=i=1Kexp(zi)exp(zk)。由于指数计算的存在,使这种方式下损失函数过于尖锐,可以做一下平滑。平滑的方式举个例子如下:

  • 样本x的多分类标签是【 0 , 0 , 0 , 1 , 0 0,0, 0, 1, 0 00010
  • 平滑为【 ϵ 4 , ϵ 4 , ϵ 4 , 1 − ϵ , ϵ 4 \frac \epsilon 4, \frac \epsilon 4, \frac \epsilon 4, 1-\epsilon, \frac \epsilon 4 4ϵ,4ϵ,4ϵ,1ϵ,4ϵ

系统了解标签平滑正则化可以参考论文:Regularizing Neural Networks by penalizing Confident Output Distributions

Inception v4

论文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

引言

该文作者也意识到Inception v3结构中Inception模块过于多样,不利于迁移到其他问题上。因此,需要建立一个更具有一致性的Inception版本,同时增加更多的Inception模块构建更深的网络,进而获得更好的性能。

解决方案

  1. 修改了网络前端部分
  2. 增加了一个加Reduction Blocks的东西(PS:这个东西感觉没意思,论文也没有解释这个东西)

Inception v4并不重要,该论文的关键在于下一章介绍的Inception-ResNet。

Inception-ResNet v1 & v2

论文:Inception v4和Inception-ResNet是提出于同一篇论文

  • Inception-ResNet v1是Inception v3与Resnet的结合
  • Inception-ResNet v2是Inception v4与Resnet的结合

引言

借助ResNet实现更多的Inception堆叠,构建更深的网络

解决方案

对不同的Inception单元的形成残差结构的方式是一样的,如下:
不同版本Inception Network介绍_第9张图片
其他还有一些细节方面的改变,没有什么技术性的创新或者经验指导,就不再详述。

总结

谷歌关于Inception的3篇论文,有意义的是提出Inception结构的第一篇,后面两篇都是建立大量实验试错下的修改。

你可能感兴趣的:(Deep,Learning)