Introduction
GoogleNet论文中研究 group size 而搞出了Inceptionv1(即多group的CNN分支)。此后,Inception不断迭代,group size被越玩越复杂,一直发展到了v4版本。
这时,Inception的鼻祖Google团队又提出了 Extreme Inception ,即赫赫有名的 Xception 。只不过,这次不再是之前的 并行式group 了,取而代之的是 串行式group 。
具体来说,就是:
在channel上进行逐片分治,然后group之。
而这一 串行式group 的module,被起名 separable convolution 。
separable convolution是通过如下图所示(图片来源:Xception: Deep Learning with Depthwise Separable Convolutions)的演化而诞生的:

从此,group操作进入了“串行”时代。
传统的卷积操作如下图:

而separable convolution的操作如下图:

完整的一个SeparableConv组合如下图(图片来源):

整个网络结构并没有太多的创新点,可以视为将ResNeXt的Inception module替换为SeparableConv module:

换言之:
Xception是ResNeXt的一个变种。
Innovation
并行式group --> 串行式group 。
在SeparableConv module看来,channel之间的信息融合,交给Conv1×1就够了:

channel数个Conv3×3则只需对单channel负责,这样就可以更专心地学到本channel的location信息:

两部分各司其职,共同组成了SeparableConv module。
depth-wise conv 的计算
| 参数量 | 3 × 3 × C i n + 1 × 1 × C i n × C o u t 3 × 3 × C i n × C o u t \frac{3×3×C_{in} + 1×1×C_{in}×C_{out}}{3×3×C_{in}×C_{out}} 3×3×Cin×Cout3×3×Cin+1×1×Cin×Cout |
|---|---|
| FLOPS | [ 3 × 3 × C i n × F × F + C i n × C o u t × F × F ] × 2 [ 3 × 3 × C i n × C o u t × F × F ] × 2 = 1 C o u t + 1 3 × 3 \frac{[3×3×C_{in}×F×F + C_{in}×C_{out}×F×F]×2}{[3×3×C_{in}×C_{out}×F×F]×2} = \frac{1}{C_{out}} + \frac{1}{3×3} [3×3×Cin×Cout×F×F]×2[3×3×Cin×F×F+Cin×Cout×F×F]×2=Cout1+3×31 |
Result
经过实验,Xception在ImageNet上稍优于Inceptionv3:

参数数量和Inceptionv3基本一致,速度也差不多:

在ImageNet上的收敛情况也好于Inceptionv3:

Thinking
-
对于Xception的串行式group为什么会优于Inceptionv3的并行式group,并且在ImageNet上取得了更好地分类结果,我还是觉得百思不得其解。如果先出来Xception,再出来Inceptionv3,且Inceptionv3的分类效果更好,那么又可以吹出一个貌似“有理有据”的故事。
-
另外,Xception取代ResNet作为Detection算法的basemodel,从而提高算法速度和减少模型参数,是目前被普遍接受的一种做法。
-
Xception-145、Xception-39是Xception中最大和最小的两种version。其中,“39” 表示浮点数运算次数(FLOP)的量级为 39M ,“145” 则对应 145M 。
-
Xception的速度几乎比ResNet 快 了 一个数量级 。
[1] Xception: Deep Learning with Depthwise Separable Convolutions
[2] Google Xception Network
Xception网络采用串行式group代替并行式group,引入separable convolution模块,显著减少了参数量和计算成本,同时在ImageNet数据集上取得了优于Inception v3的性能。
2681

被折叠的 条评论
为什么被折叠?



