可分离卷积

可分离卷积主要包括空间可分离卷积(Spatial Separable Convolutions)、深度可分离卷积(Depthwise Separable Convolutions.空间可分离卷积在Inception-v2中采用.深度可分离卷积在MobileNet系列中被采用,降低运算次数,提升网络速度.


Spatial Separable Convolutions

空间可分离卷积将n * n 卷积核简单分为 n * 1 与 1 * n 的两个小卷积核. 如下图:

对卷积核分离后,之前一次卷积9次乘法,现在只需两次卷积,每次3次乘法. 计算量减少,故网络运行速度更快.

主要问题在于不是所有卷积核都可以被分离为两个小的卷积核.

Depthwise Separable Convolutions

和空间可分离卷积不同的是,深度可分离卷积卷积核不能被“因子“化.

  • 图a)中为标准卷积,单个卷积核大小$D_K * D_K * M$, 输入通道数为$M$,输出通道数$N$.
  • 图b)中将上述标准卷积分离为深度卷积,单个卷积核$D_K * D_K * 1$,共$M$个,以及$N$个$1 * 1 * M$的点卷积.

Normal Convolution:

上图所示,上一层输出为 12 * 12 * 3, 使用 5 * 5 的卷积核(卷积核需要与输入通道一致),核大小为 5 * 5 * 3,无填充, 步长为1, 则单个卷积核卷积结果为 8 * 8 * 1. 期望输出为256个通道,则使用256个(5 * 5 * 3)卷积核, 得到 256个 8 * 8 * 1的输出.

计算复杂度: 对于单个卷积核每次移动乘法计算次数为5 × 5 × 3,在一个输入通道上共进行 5 × 5 × 3 × 8 × 8次乘法,256个卷积核共进行 256 × 5 × 5 × 3 × 8 × 8 = 1228800次乘法.

Depthwise Separable Convolutions

Part 1 — Depthwise Convolution:

上一层的输出同上,对于深度卷积,使用5 * 5 的卷积核,深度卷积每个卷积核针对于单个输入通道,因此卷积核大小为 5 * 5 * 1, 输入有几个通道则有多少深度卷积核. 因此得到输出为 8 * 8 * 3.

Part 2 — Pointwise Convolution:

在标准卷积中,我们希望将 12 * 12 * 3 的输入转化为 8 * 8 * 256 的输出. 深度卷积不改变输出的通道数. 点卷积使用1 * 1 卷积核(1 * 1 卷积核可用来升维或降维). 单个点卷积大小为 1 * 1 * 3 (保持通道数一致),得到 8 * 8 * 1 的输出,使用256个1 * 1卷积核可得到输出 8 * 8 * 256.

计算复杂度: 对于单个深度卷积核乘法计算次数为5 × 5 × 8 × 8 = 1600,3个卷积核共进行 4800次乘法,256个点卷积核共进行 8 × 8 × 3 × 256 = 49152次乘法. 深度分离卷积共进行53952次乘法.

analysis

参考上面的计算复杂度,输入输出维度一样的情况下,标准卷积的乘法运算次数远多于深度可分离卷积. 乘法运算少,自然速度更快.

对于标准卷积,我们对图像进行了256次变换,每次变换用了4800次乘法. 在深度可分离卷积中,只在深度卷积处对图像进行了一次变换,然后对变换后的图像拉伸了256次.

the main difference is this: in the normal convolution, we are transforming the image 256 times. And every transformation uses up 5x5x3x8x8=4800 multiplications. In the separable convolution, we only really transform the image once — in the depthwise convolution. Then, we take the transformed image and simply elongate it to 256 channels. Without having to transform the image over and over again, we can save up on computational power. ref

深度可分离卷卷积由于计算量小,则参数量小,其学习能力不可避免的有所降低.

usage

现有实现 keras.layers.SeparableConv2D or tf.layers.separable_conv2d. Keras 中有 SeparableConv2DDepthwiseConv2D ,默认深度卷积输出通道为1,可通过设置 depth_multiplier 修改.

  • SeparableConv2D: 即为完整的深度可分离卷积
  • DepthwiseConv2D: 深度可分离卷积的第一部分深度卷积

reference

ref

MobileNets