【深度学习】Xception

Xception

  • 发展历程
    • 多尺寸卷积核
    • Pointwise Conv
    • 卷积核替换
    • Bottleneck
    • Depthwise Separable Conv
  • 创新点
  • 网络结构
  • 总结
  • 论文地址
  • 参考博客

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

发展历程

多尺寸卷积核

Inception 最初提出的版本,其核心思想就是使用多尺寸卷积核去观察输入数据。

举个例子,我们看某个景象由于远近不同,同一个物体的大小也会有所不同,那么不同尺度的卷积核观察的特征就会有这样的效果。于是就有了如下的网络结构图:
【深度学习】Xception_第1张图片
于是我们的网络就变胖了,增加了网络的宽度,同时也提高了对于不同尺度的适应程度。

Pointwise Conv

但是我们的网络变胖了的同时,计算量也变大了,所以我们就要想办法减少参数量来减少计算量,于是在 Inception v1 中的最终版本加上了 1x1 卷积核。
【深度学习】Xception_第2张图片
使用 1x1 卷积核对输入的特征图进行降维处理,这样就会极大地减少参数量,从而减少计算。

举个例子,输入数据的维度是 256 维,经过 1x1 卷积之后,我们输出的维度是 64 维,参数量是原来的 14 。

这就是 Pointwise Convolution,俗称叫做 1x1 卷积,简写为 PW,主要用于数据降维,减少参数量。

也有使用 PW 做升维的,在 MobileNet v2 中就使用 PW 将 3 个特征图变成 6 个特征图,丰富输入数据的特征。

卷积核替换

就算有了 PW ,由于 5x5 和 7x7 卷积核直接计算参数量还是非常大,训练时间还是比较长,我们还要再优化。

人类的智慧是无穷的,于是就想出了 使用多个小卷积核替代大卷积核的方法,这就是 Inception v3,如图所示:
【深度学习】Xception_第3张图片
使用两个 3x3 卷积核来代替 5x5 卷积,效果上差不多,但参数量减少很多,达到了优化的目的。不仅参数量少,层数也多了,深度也变深了。

除了规整的的正方形,我们还有分解版本的 3x3 = 3x1 + 1x3,这个效果在深度较深的情况下比规整的卷积核更好。
【深度学习】Xception_第4张图片
我们假设输入 256 维,输出 512 维,计算一下参数量:

5x5 卷积核:256∗5∗5∗512=3276800
两个 3x3 卷积核:256∗3∗3∗256+256∗3∗3∗512=589824+1179648=1769472

结果对比: 1769472 3276800 \frac{1769472}{3276800} 32768001769472=0.54。我们可以看到参数量对比,两个 3x3 的卷积核的参数量是 5x5 一半,可以大大加快训练速度。

Bottleneck

我们发现就算用了上面的结构和方法,我们的参数量还是很大,于是乎我们结合上面的方法创造出了 Bottleneck 的结构降低参数量。

Bottleneck 三步走是先 PW 对数据进行降维,再进行常规卷积核的卷积,最后 PW 对数据进行升维。我们举个例子,方便我们了解:
【深度学习】Xception_第5张图片
根据上图,我们来做个对比计算,假设输入 feature map 的维度为 256 维,要求输出维度也是 256 维。有以下两种操作:

  • 直接使用 3x3 的卷积核。256 维的输入直接经过一个 3×3×256 的卷积层,输出一个 256 维的 feature map ,那么参数量为:256×3×3×256 = 589,824 。
  • 先经过 1x1 的卷积核,再经过 3x3 卷积核,最后经过一个 1x1 卷积核。 256 维的输入先经过一个 1×1×64 的卷积层,再经过一个 3x3x64 的卷积层,最后经过 1x1x256 的卷积层,则总参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632 。

经过两种方式的对比,我们可以很明显的看到后者的参数量远小于前者的。Bottleneck 的核心思想还是利用多个小卷积核替代一个大卷积核,利用 1x1 卷积核替代大的卷积核的一部分工作。

Depthwise Separable Conv

我们发现参数量还是很多,于是人们又想啊想,得出了 Depthwise Separable Conv 。这个注意最早是来自这篇论文 Design of Efficient Convolutional Layers using Single Intra-channel Convolution, Topological Subdivisioning and Spatial “Bottleneck” Structure ,后面被 Google 用在 MobileNet 和 Xception 中发扬光大。

这个卷积的的大致意思是对每一个深度图分别进行卷积再融合,步骤是先 Depthwise Conv 再 Pointwise Conv,大大减少了参数量。下图是 Xception 模块的结构:
【深度学习】Xception_第6张图片
详细介绍见【深度学习】MobileNets。

从 Inception 到 Xception 的发展一路看来,每一次创新都让人啧啧称赞,精巧的结构设计和理念思想,让人佩服。

  • 多个不同尺寸的卷积核,提高对不同尺度特征的适应能力。
  • PW 卷积,降维或升维的同时,提高网络的表达能力。
  • 多个小尺寸卷积核替代大卷积核,加深网络的同时减少参数量。
  • 精巧的 Bottleneck 结构,大大减少网络参数量。
  • 精巧的 Depthwise Separable Conv 设计,再度减少参数量。

创新点

借鉴(非采用)depth-wise convolution 改进 Inception V3。简单理解就是说,卷积的时候要将通道的卷积与空间的卷积进行分离,这样会比较好。(没有理论证明,只有实验证明,就当它是定理,接受就好了,现在大多数神经网络的论文都这样。

Xception 与原版的 Depth-wise convolution 有两个不同之处:

  • 第一个:原版 Depth-wise convolution,先逐通道卷积,再 1 ∗ 1 1*1 11卷积; 而 Xception 是反过来,先 1 ∗ 1 1*1 11卷积,再逐通道卷积;
  • 第二个:原版 Depth-wise convolution 的两个卷积之间是不带激活函数的,而 Xception 在经过 1 ∗ 1 1*1 11卷积之后会带上一个 Relu 的非线性激活函数。

网络结构

【深度学习】Xception_第7张图片
Xception 结构如上图所示,共计 36 层分为 Entry flow;Middle flow;Exit flow。。

Entry flow 包含 8 个 conv;Middle flow 包含 3*8 =24 个 conv;Exit flow 包含 4 个 conv,所以 Xception 共计 36 层。

几种网络结构在ImageNet上的对比:
【深度学习】Xception_第8张图片

总结

Xception 是基于 Inception-V3,并结合了 depth-wise convolution,这样做的好处是提高网络效率,以及在同等参数量的情况下,在大规模数据集上,效果要优于 Inception-V3。这也提供了另外一种「轻量化」的思路:在硬件资源给定的情况下,尽可能的增加网络效率和性能,也可以理解为充分利用硬件资源。有些人会好奇为什么引入depthwise separable convolution没有大大降低网络的复杂度,因为depthwise separable convolution在mobileNet中主要就是为了降低网络的复杂度而设计的。原因是作者加宽了网络,使得参数数量和Inception v3差不多,然后在这前提下比较性能。因此Xception目的不在于模型压缩,而是提高性能。

论文地址

Xception: Deep Learning with Depthwise Separable Convolutions

参考博客

纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
DL 入门:关于「Inception」和「Xception」的那些事
Xception算法详解

你可能感兴趣的:(深度学习)