概述

(一)Inception结构的来源与演化

Inception(盗梦空间结构)是经典模型GoogLeNet中最核心的子网络结构,GoogLeNet是Google团队提出的一种神经网络模型,并在2014年ImageNet挑战赛(ILSVRC14)上获得了冠军,关于GoogLeNet模型具体介绍,能够参阅博主的另一篇博客 GoogLeNet网络详解与模型建立GoogLeNet网络详解与模型建立。Google团队在随后2年里不断改进,相继提出了v1-v4和xcpetion结构,本文对系列模型进行具体介绍。

2014-2016年,谷歌实验室发表了多篇系列经典论文,充分了Inception结构和GoogLeNet模型:

Inception v1(GoogLeNet, 2014) –> Inception v2(BN-Inception) –> Inception v3 –> Inception v4(Inception-ResNet) –> Xception(2016)

  • GoogLeNet:《Going deeper with convolutions》, 2014.09
  • BN:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》, 2015.02
  • Inception v3:《Rethinking the Inception Architecture for Computer Vision》, 2015.12
  • Inception v4:《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》, 2016.02
  • Xception:《Xception: Deep Learning with Depthwise Separable Convolutions》, 2016.10

(二)什么是Inception结构?

Inception便是将多个卷积或池化操作放在一同拼装成一个网络模块,规划神经网络时,以模块为单位去拼装整个网络结构。Inception结构规划了一个稀少网络结构,可是能够发生稠密的数据,既能添加神经网络体现,又能确保核算资源的运用功率。

详解Inception结构:从Inception v1到Xception
在GoogLeNet之前的网络中,一层一般只运用一种操作(单个卷积或池化),一层只运用一个操作的弊端是提取出来的特征往往过于单调。在实际状况中,由于图画的不同标准等原因,需要不同程度的下采样,或许说不同巨细的卷积核,咱们期望网络代替人手艺自己决议究竟运用111\times1333\times3555\times5以及是否需要max_pooling层,由网络主动去寻找适合的结构。而且节省核算提取更为丰厚的特征,Inception结构正好满意了这样的需求,因而获得了更好的体现。

(三)为什么要提出Inception结构?

The most straightforward way of improving the performance of deep neural networks is by increasing their size. This includes both increasing the depth – the number of levels – of the network and its width: the number of units at each level. This is as an easy and safe way of training higher quality models, especially given the availability of a large amount of labeled training data. However this simple solution comes with two major drawbacks.

Bigger size typically means a larger number of parameters, which makes the enlarged network more prone to overfitting, especially if the number of labeled examples in the training set is limited.

Another drawback of uniformly increased network size is the dramatically increased use of computational resources.

The fundamental way of solving both issues would be by ultimately moving from fully connected to sparsely connected architectures, even inside the convolutions.

​ 《Going deeper with convolutions》

文章提出,进步网络功能最直接的办法便是添加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种办法存在以下问题:

  1. 参数太多,假如练习数据集有限,很容易发生过拟合;
  2. 网络越大、参数越多,核算杂乱度越大,难以应用;
  3. 网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

为了处理提出的问题,就要在添加网络深度和宽度的一起削减参数,削减参数天然就想到将全衔接变成稀少衔接。可是在实现上,全衔接变成稀少衔接后实际核算量并不会有质的进步,由于大部分硬件是针对密布矩阵核算优化的,稀少矩阵尽管数据量少,可是核算所耗费的时间却很难削减。

那么,有没有一种办法既能坚持网络结构的稀少性,又能利用密布矩阵的高核算功能。大量的文献标明能够将稀少矩阵聚类为较为密布的子矩阵来进步核算功能,就如人类的大脑是能够看做是神经元的重复堆积,因而,GoogLeNet团队提出了Inception网络结构,便是结构一种“基础神经元”结构,来建立一个稀少性、高核算功能的网络结构。

NiN对Inception的启示

Network In Network (NIN)是由MinLinMin Lin等人于2014年提出,其网络结构中经过引入子网络结构代替纯卷积中的线性映射部分(NiN模型的具体介绍可参阅博主的另一篇博客 NiN网络详解),这种办法的网络结构激发了更杂乱的卷积神经网络的结构规划,Inception结构便是来源于这个思维。从上文图中的native inception结构中能够看出,在相邻的上下2层之间添加多个卷积核池化的并行操作能够进步模型的非线性表达能力。

除此之外,NiN网络中的MLPConv层则提供了111\times1卷积的思路,111\times1卷积不只能够对通道数进行升降维,明显下降参数量,还能够实现信息的跨通道交互与整合。下面了解一下111\times1卷积进程

详解Inception结构:从Inception v1到Xception
上图进程为输入巨细为5656356\times56\times3的feature map,经过3个1131\times1\times3卷积核,输出巨细为5656156\times56\times1的feature map的卷积进程。当然,以上进程也能够看作是对三个通道进行了线性组合,这几个卷积核能够看成便是一个简略的神经元结构,每个神经元参数数量与前面的通道数量持平。通常在卷积之后会参加非线性激活函数,在这里之后参加激活函数,就能够了解成一个简略的MLP网络了。

那么111\times1卷积如何实现通道数的改变和下降模型参数的呢?

相信大家在看完下文Inception v1与native inception结构的比照后就会发现答案。

Inception v1

下图中展示了原始Inception(native inception)结构和GoogLeNet中运用的Inception v1结构,运用Inception v1 Module的GoogleNet不只比Alex深,而且参数比AlexNet足足削减了12倍,网络巨细约是VGGNet的1/20。

详解Inception结构:从Inception v1到Xception
GoogleNet作者的初始想法是用多个不同类型的卷积核(111\times1333\times3555\times533Pool3\times3Pool)堆叠在一同(卷积、池化后的尺寸相同,将通道相加)代替一个3×3的小卷积核(如左图),好处是能够使提取出来的特征具有多样化,而且特征之间的co-relationship不会很大,最终用把feature map都concatenate起来使网络做得很宽,然后堆叠Inception Module将网络变深。但仅仅简略这么做会使一层的核算量爆炸式添加

native inception中所有的卷积核都在上一层的所有输出上来做,而那个5×5的卷积核所需的核算量就太大了,形成了特征图的厚度很大,为了防止这种状况,在3×3前、5×5前、max pooling后分别加上了1×1的卷积核,以起到了下降特征图厚度的作用,这也就构成了Inception v1的网络结构(右图)。

假定input feature map的size为282825628\times28\times256,output feature map的size为282848028\times28\times480,则native Inception Module的核算量有854M。核算进程如下

详解Inception结构:从Inception v1到Xception
从上图能够看出,核算量首要来自高维卷积核的卷积操作,因而在每一个卷积前先运用111\times1卷积核将输入图片的feature map维度先下降,进行信息紧缩,在运用3×3卷积核进行特征提取运算,相同状况下,Inception v1的核算量仅为358M。
详解Inception结构:从Inception v1到Xception
Inception v1结构总共有4个分支,输入的feature map并行的经过这四个分支得到四个输出,然后在在将这四个输出在深度维度(channel维度)进行拼接(concate)得到咱们的最终输出(注意,为了让四个分支的输出能够在深度方向进行拼接,必须确保四个分支输出的特征矩阵高度和宽度都相同),因而inception结构的参数为:

  • branch1: Conv11 C o n v 1 1 , stride=1
  • branch2: Conv33C o n v 3 3, stride=1, padding=1
  • branch3: Conv55C o n v 5 5, stride=1, padding=2
  • branch4: MaxPool33M a x P o o l 3 3, stride=1, padding=1

Inception v2

GoogLeNet凭借其优秀的体现,得到了许多研究人员的学习和运用,因而GoogLeNet团队又对其进行了进一步地发掘改进,继而提出了Inception v2,Inception v2的核心思维来自Google发表的2篇论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》和《Rethinking the Inception Architecture for Computer Vision》。第一篇论文的附录里,作者给出了Inception-BN(inception v2)的模型结构,即在v1的基础上于卷积层与激活函数之间插入BN层:Conv-BN-ReLU,并将v1结构中的555\times5卷积核替换为2个333\times3卷积核。第二篇论文里,作者给出了inception v2中卷积分化的具体阐明。

(一)Batch Normalization

在BN的论文里,作者提出了Internal Covariate Shift这个问题,即在练习神经网络的进程中,由于前一层的参数改变而导致每层的输入散布都在不断改变(the distribution of each layer’s inputs changes during training, as the parameters of the previous layers change)。这使得咱们需要更低的学习率和更小心地进行参数初始化,导致咱们难以充分构建一个具有饱满地非线性结构的模型,而这个现象就被称作Internal Covariate Shift。为了处理这个问题,Google提出了Batch Normalization(批规范化)。即在每次梯度下降前,对每个mini-batch做归一化操作来下降数据散布的影响。

咱们在图画预处理进程中通常会对图画进行标准化处理,这样能够加速网络的收敛,对于输入层来说,其输入数据满意某一散布的特征矩阵,但对于后续层结构而言输入的feature map就不必定满意某一散布规律了。而BN层的目的便是使咱们的feature map满意均值为0,方差为1的散布规律。想对BN层进一步了解,推荐阅览原论文。

(二)小卷积核代替大卷积核

在VGGNet中就提出了经过堆叠两层333\times3的卷积核能够代替一层555\times 5的卷积核,堆叠三层 333\times3的卷积核代替一层 777\times7的卷积核(参阅:VGGNet网络详解与模型建立)。这样的衔接办法在坚持感触野范围的一起又削减了参数量,而且能够防止表达瓶颈,加深非线性表达能力。基于此,作者经过将inception v1结构中的555\times5卷积核替换为2个333\times3卷积核。如下左图为v1结构,右图为v2结构。

详解Inception结构:从Inception v1到Xception

Inception v3

Inception v3来自论文《Rethinking the Inception Architecture for Computer Vision》,论文中首先给出了深度网络的通用规划原则,并在此原则上对inception结构进行修正,最终构成Inception v3。

(一)深度网络的通用规划原则

  1. 防止表达瓶颈,特别是在网络靠前的当地。 信息流前向传达进程中显然不能经过高度紧缩的层,即表达瓶颈。从input到output,feature map的宽和高根本都会逐步变小,可是不能一下子就变得很小。比方你上来就来个kernel = 7, stride = 5 ,这样显然不合适。 别的输出的维度channel,一般来说会逐步增多(每层的num_output),否则网络会很难练习。(特征维度并不代表信息的多少,仅仅作为一种估量的手法)。
  2. 高维特征更易处理。 高维特征更易区别,会加速练习。
  3. 能够在低维嵌入上进行空间会聚而无需担心丢掉许多信息。 比方在进行3×3卷积之前,能够对输入先进行降维而不会发生严峻的后果。假定信息能够被简略紧缩,那么练习就会加速。
  4. 平衡网络的宽度与深度。

上述的这些并不能直接用来进步网络质量,而仅用来在大环境下作指导。

(二)卷积分化(Factorizing Convolutions)

作者将一个大卷积核的操作分化成若干个小卷积核的操作称为卷积分化,并探讨了2种不同的卷积分化办法,即对称卷积分化和不对称卷积空间分化。

  • 对称卷积分化

即运用小卷积核串联来代替大卷积核,这在inception v2中现已提到过。一起作者还提出,经过大量实验标明这种代替计划并不会形成表达能力的下降。经过堆叠两层333\times3的卷积核能够代替一层555\times 5的卷积核,堆叠三层 333\times3的卷积核代替一层 777\times7的卷积核,能够看出,大卷积核完全能够由一系列的333\times3卷积核来代替,那能不能再分化得更小一点呢?GoogLeNet团队考虑了非对称卷积分化。

  • 非对称卷积分化

恣意nnn\times n的卷积都能够经过1n1\times n卷积后接n1n\times 1卷积来代替,如下图(右)所示。

详解Inception结构:从Inception v1到Xception
实际上,作者发现在网络的前期运用这种分化作用并不好,还有在中度巨细的feature map上运用作用才会更好。(对于mxm巨细的feature map,建议m在12到20之间)

(三)下降特征图巨细

一般状况下,假如想让特征图的通道数,能够有如下两种办法:

详解Inception结构:从Inception v1到Xception
先池化再作Inception卷积,或许先作Inception卷积再作池化。可是办法一(左图)先作pooling(池化)会导致特征表明遇到瓶颈(特征缺失),办法二(右图)是正常的缩小,但核算量很大。为了一起坚持特征表明且下降核算量,将网络结构改为下图,运用两个并行化的模块来下降核算量(卷积、池化并行履行,再进行合并),即用卷积得到一半的特征图,池化得到一半的特征图,再进行拼接
详解Inception结构:从Inception v1到Xception

Inception v4

2016年ResNet网络的提出处理了跟着神经网络的加深,参数越来越多,模型越来越难以练习,练习时间大大添加,容易出现梯度消散问题。为了融合这一重要成果,Google团队在论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》里提出了第四版模型,Inception v4研究了Inception模块与残差衔接(Residual Connection)的结合来改进V3结构。

详解Inception结构:从Inception v1到Xception
如图,将残差模块的卷积结构替换为Inception结构,即得到Inception Residual结构。除了上述右图中的结构外,作者经过20个类似的模块进行组合,最终构成了InceptionV4的网络结构,构建了Inception-ResNet模型。

Xception

继续更新中……

总结回顾

  1. Inception v1首要采用了多标准卷积核、1×1卷积操作。
  2. Inception v2在v1的基础上添加了BN层,运用2个333\times3小卷积核堆叠替换555\times5大卷积核;
  3. inception v3进行了卷积分化(将777\times7分化成两个一维的卷积171\times7171\times7333\times3也是相同131\times3313\times1))和特征图降维。
  4. inception v4在v3的基础上融合了Residual模块。