Separable Convolution

阅读论文《The Evolved Transformer》时遇到了separable convolution的概念,因此找了相关资料学习了一下。

参考:
https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-al

在讲Separable Convolution前先了解下常用的卷积网络的定义。

Convolutional Neural Networks

参考:
https://towardsdatascience.com/what-is-a-neural-network-6010edabde2b

卷积网络中最重要的是卷积核,通过卷积核在图像每个区域的运算,得到图像不同的特征,如下图(可以在http://setosa.io/ev/image-kernels/中更好得体验):

图片

上面这张图使用outliine卷积核,实际中可以使用sharp等不同功能的卷积核以达到不同效果。

对于神经网络的每一层而言,可以使用多个卷积和得到不同的特征图,并将这些特征图一起输入到下一层网络。最终这些特征供给最后一层的分类器进行匹配,得到分类结果。下面的动画展示了这个过程:

图片

图片

图片

图片

Separable Convolution可以分成spatial separable convolution和depthwise separable convolution。

对于12x12x3的图像,5x5x3的卷积核,能产生8x8x1的输出:

图片

假设我们想要8x8x256的输出,则需要使用256个卷积核来创造256个8x8x1的图像,把他们叠加在一起产生8x8x256的输出:

图片

即12x12x3 — (5x5x3x256) — >12x12x256

Spatial Separable Convolutions

Spatial separable convolution将卷积分成两部分,最常见的是把3x3的kernel分解成3x1和1x3的kernel,如:

图片

通过这种方式,原本一次卷积要算9次乘法,现在只需要6次。

图片

还有一个Sobel kernel(用来检测边)也是用的这种方法:

图片

但spatial separable convolution存在的问题是,不是所有kernel都能转换成2个小的kernel。

Depthwise Separable Convolutions

由于卷积并不使用矩阵相乘,为了减少计算量,可以将卷积的过程分成两部分:a depthwise convolution and a pointwise convolution.

depthwise convolution

首先,我们使用3个5x5x1的卷积核产生8x8x3的图像:

图片

pointwise convolution

其次,使用1x1x3 的卷积核对每个像素计算,得到8x8x1 的图像:

图片

使用256个1x1x3 的卷积核,则恶意产生8x8x256的图像:

图片

可以看到,整个过程由原来的12x12x3 — (5x5x3x256) →12x12x256,变成12x12x3 — (5x5x1x1) — > (1x1x3x256) — >12x12x256

意义

主要就是减少了计算量,原先是256个5x5x3的卷积核移动8x8次,即需要256x3x5x5x8x8=1,228,800次乘法计算。使用depthwise convolution,有3个5x5x1的卷积核移动8x8次,需要3x5x5x8x8 = 4,800次乘法计算。使用pointwise convolution,有256个1x1x3的卷积核移动8x8次,需要256x1x1x3x8x8=49,152次乘法计算,加起来共有53,952次计算。

应用