Xception

论文:Xception: Deep Learning with Depthwise Separable Convolutions 

论文链接:https://arxiv.org/abs/1610.02357

 

算法详解:

Xception是google继Inception后提出的对Inception v3的另一种改进,主要是采用depthwise separable convolution来替换原来Inception v3中的卷积操作。

要介绍Xception的话,需要先从Inception讲起,Inception v3的结构图如下Figure1。

Xception_第1张图片

当时提出Inception的初衷可以认为是:特征的提取和传递可以通过1*1卷积,3*3卷积,5*5卷积,pooling等,到底哪种才是最好的提取特征方式呢?Inception结构将这个疑问留给网络自己训练,也就是将一个输入同时输给这几种提取特征方式,然后做concat。Inception v3和Inception v1(googleNet)对比主要是将5*5卷积换成两个3*3卷积层的叠加。

于是从Inception v3联想到了一个简化的Inception结构,就是Figure 2。

Xception_第2张图片

再将Figure2延伸,就有了Figure3,Figure3表示对于一个输入,先用一个统一的1*1卷积核卷积,然后连接3个3*3的卷积,这3个卷积操作只将前面1*1卷积结果中的一部分作为自己的输入(这里是将1/3channel作为每个3*3卷积的输入)。

Xception_第3张图片

再从Figure3延伸就得到Figure4,也就是3*3卷积的个数和1*1卷积的输出channel个数一样,达到每个卷积与每个输出通道单独对应,也就是每个3*3卷积都是和1个输入channel做卷积

Xception_第4张图片

那么作者为什么要采用depthwise separable convolution操作呢?就是从Figure1到Figure4的关于Inception v3结构的不断延伸,然后Figure4基本上和depthwise separable convolution没有太大的区别,于是就有了引入depthwise separable convolution修改Inception v3结构的Xception。

铺垫了这么多,终于要讲到Xception了。在Xception中主要采用depthwise separable convolution,什么是depthwise separable convolution?这是mobileNet里面的内容,下图就是depthwise separable convolution的示意图,其实就是将传统的卷积操作分成两步,假设原来是3*3的卷积,那么depthwise separable convolution就是先用M个3*3卷积核一对一卷积输入的M个feature map,不求和,生成M个结果;然后用N个1*1的卷积核正常卷积前面生成的M个结果,求和,最后生成N个结果。因此文章中将depthwise separable convolution分成两步,一步叫depthwise convolution,就是下图的(b),另一步是pointwise convolution,就是下图的(c)。

现在对深度可分离卷积做具体讲解:假定卷积核默认都是三维,这三维分别对应长、宽和输入通道数,因为不同人对卷积核维度的理解不同。对于常规卷积而言,假设输入特征通道数是M,卷积核的长宽分别是DK和DK,卷积核的数量是N,那么可以说是有N个M*DK*DK卷积核,也可以说是有N组卷积核,每组有M个DK*DK的卷积核。不管是哪种理解,都不影响卷积层的本质:该层有N*M*DK*DK个参数。假定输入特征图大小为M*Width*Height,其中M为输入的通道数,N个M*DK*DK的卷积核与M*Width*Height做卷积,DK*DK每次做卷积都要对通道M进行一次求和合并,然后得到一个通道的结果,并列N个卷积核数据量得到N个通道,最后得到Width*Height*N的特征图。

可分离卷积的核心就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的卷积(文中叫pointwise convolution)操作。简单讲就是将原来一个卷积层分成两个卷积层,其中前面一个卷积层的每个filter都只跟input的每个channel进行卷积,然后后面一个卷积层则负责combining,即将上一层卷积的结果进行合并。

如下图:M表示输入特征的通道数,N表示输出特征的通道数(也是本层的卷积核个数)。因此如果假设卷积核大小是DK*DK*M*N,输出是DF*DF*N,那么标准卷积的计算量是DK*DK*M*N*DF*DF。这个式子可以这么理解,先去掉M*N,那么就变成一个二维卷积核去卷积一个二维输入feature map;那么如果输出feature map的尺寸是DF*DF,由于输出feature map的每个点都是由卷积操作生成的,而每卷积一次就会有DK*DK个计算量,因此一个二维卷积核去卷积一个二维输入feature map就有DF*DF*DK*DK个计算量;如果有M个输入feature map和N个卷积核,那么就会有DF*DF*DK*DK*M*N计算量。

Xception_第5张图片

算法是用上图中的(b)+(c)代替(a),接下来详细讲解下什么怎么卷积的。依然假设有N个卷积核,每个卷积核维度是DK*DK*M,输入feature map的通道数是M,输出feature map为DF*DF*N。那么(b)表示用M个维度为DK*DK*1的卷积核去卷积对应输入的M个feature map,然后得到M个结果,而且这M个结果相互之间不累加(传统的卷积是用N个卷积核卷积输入的所有(也就是M个)feature map,然后累加这M个结果,最终得到N个累加后的结果),注意这里是用M个卷积核而不是N个卷积核,所以(b)中没有N,只有M。因此计算量是DF*DF*DK*DK*M。(b)生成的结果应该是DF*DF*M,图中的(b)表示的是卷积核的维度。

(c)表示用N个维度为1*1*M的卷积核卷积(b)的结果,即输入是DF*DF*M,最终得到DF*DF*N的feature map。这个就可以当做是普通的一个卷积过程了,所以计算量是DF*DF*1*1*M*N(联系下前面讲的标准卷积是DF*DF*DK*DK*M*N,就可以看出这个(c)其实就是卷积核为1*1的标准卷积)。

差异性比较:其实depthwise separable convolution和上面的Figure4是很像的,差别有两个:

1、顺序不一样,在depthwise separable convolution中是先进行一个channel-wise的spatial convolution,也就是上图的(b),然后是1*1的卷积。而在Figure4中是先进行1*1的卷积,再进行channel-wise的spatial convolution,最后concat。

2、在Figure4中,每个操作后都有一个ReLU的非线性激活,但是在depthwise separable convolution中没有。

 

Xception_第6张图片

参数量:2*3*3*3 = 54

 

Xception_第7张图片

参数量:2*3*3 + 2*1*1*3 = 24

所以最重要的来了,采用这种算法的计算量变成了DF*DF*DK*DK*M+DF*DF*M*N。具体和原来相比减少了多少计算量?可以看下面这个式子:

(DF*DF*DK*DK*M+DF*DF*M*N)/ (DF*DF*DK*DK*M*N) = 1/N + 1/DK2

也就是说如果卷积核大小为3*3,那么差不多卷积操作的时间能降到原来的1/9左右!

Figure5是Xception的结构图。这里的sparsableConv就是depthwise separable convolution。另外,每个小块的连接采用的是residule connection(图中的加号),而不是原Inception中的concat。

Xception_第8张图片

Xception 的实验有一部分是关于应不应该在 1x1 卷积后面只用激活层的讨论,实验结果是:如果在 1x1 卷积后不加以激活直接进行 depthwise separable convolution,无论是在收敛速度还是效果上都优于在 1x1 卷积后加以 ReLU 之类激活函数的做法。这可能是因为,在对很浅的 feature(比如这里的 1-channel feature)进行激活会导致一定的信息损失,而对很深的 feature,比如 Inception module 提取出来的特征,进行激活是有益于特征的学习的,个人理解是这一部分特征中有大量冗余信息。

 

实验结果:

Table1表示几种网络结构在ImageNet上的对比。

Xception_第9张图片

Table2表示几种网络结构在JFT数据集上的对比。大数据上的提升会比Table1好一点。

Xception_第10张图片

其他更多的实验结果可以参考论文。

总结:

Xception作为Inception v3的改进,主要是在Inception v3的基础上引入了depthwise separable convolution,在基本不增加网络复杂度的前提下提高了模型的效果。有些人会好奇为什么引入depthwise separable convolution没有大大降低网络的复杂度,因为depthwise separable convolution在mobileNet中主要就是为了降低网络的复杂度而设计的。原因是作者加宽了网络,使得参数数量和Inception v3差不多,然后在这前提下比较性能。因此Xception目的不在于模型压缩,而是提高性能。

 

 

 

 

 

你可能感兴趣的:(神经网络)