Notes on Xception

Xception 的主要特点是 Depthwise Separable Convolutions, Xception 在多个数据集上并没有比 Inception V3 好很多的结果, 但是, Xception 中 Depthwise Separable Convolutions 的做法在最近的一些高效模型中被广泛使用.

与 vgg 不同的是, Inception 系列的模型, 包括后来的 resnet 等, 做法都是先设计几个比较高效的 building block, 然后串联起很多个 building block 来构建整个网络模型.
在 CNN 中最常使用的卷积是 3 维卷积, 其中 2 维是空间信息, 即高和宽信息, 另外 1 维 是 channel 信息. 因此, 一个卷积核同时要搞定 cross channel 的信息又要搞定 spatial 信息. Inception 中已经注意到了这个问题, 因此, 在 Inception 中, 首先使用一个 \(1 \times 1\) 的卷积来处理 cross channel 的信息, 把一个比较大的 feature map 映射到多个较小的 output, 然后在这些较小的 output 上使用 \(3 \times 3 \) 的卷积和 \(5 \times 5\) 的卷积来进一步处理(注意, 这里的卷积核仍是 3 维的). Inception 认为, cross channel correlation信息和 spatial correlation 信息之间是没有关系的, 因此, 这两个部分应该尽量解耦. 如下图.

上图中, 如果去掉 avg pooling 这个 tower, 然后精简一下可以变成下面这个版本:

上面这个简化版的 Inception 的等价版本如下:

即多个 \(1 \times 1\) 的卷积可以用一个 \(1 \times 1\) 的卷积来完成.

现在这个版本, 通过 \(1 \times 1\) 的卷积来处理 cross channel correlation 信息, 但是, 后面的 \(3 \times 3\) 的卷积仍然是 3 维的, 也就是说, 这里的 \(3 \times 3\) 的卷积仍然同时处理和 cross channel correlation 信息和 spatial correlation 信息, 因此, 有没有可能进一步解耦 \(3 \times 3\) 的卷积操作呢? 这就是 Xception 做的事情. 如下图:

具体来说, Xception 的做法是, 首先是用 \(1 \times 1\) 的卷积来处理 cross channel correlation, 然后, 对出输出的每一个 channel, 使用 \(3 \times 3 \) 的卷积核来处理 spatial correlation, 然后把输出 concat 起来.

注意 Xception 和 depthwise separable convolution 的区别:

  1. 操作顺序不同, Xception 先做 \(1 \times 1\) 的 convolution, 然后是 channel-wise spatial convolution 操作, depthwise separable convolution 恰好相反.
  2. Xception 在每一次 convolution 操作之后都要进行非线性变换, 例如 ReLU, depthwise separable convolution 没有非线性变换.