MobileNet-深度可分离卷积

论文地址:https://arxiv.org/abs/1704.04861

MobileNet的核心就是Depthwise separable convolution(深度可分离卷积),它将一般的卷积过程分为了depthwise convolution(逐深度卷积)和pointwise convolution(逐点卷积),在损失一点精度的情况下,计算量大幅下降,速度更快,模型更小。

先来看看一般的卷积过程,如下图:

MobileNet-深度可分离卷积

输入12×12×312\times 12\times 3的图像,即size=12×12,channel=3size=12\times 12,channel=3,使用5×5×35\times 5\times 3的卷积核,stride=1stride=1,无paddingpadding,则卷积后,输出8×8×18\times 8 \times 1的图像。

为了得到下图channel=256channel=256的输出:

MobileNet-深度可分离卷积

那么就需要256个卷积核(一个卷积核输出一个channel),因此总的计算量就为8×8×5×5×3×256=1,228,8008\times 8 \times 5 \times 5 \times 3 \times 256 = 1,228,800,即一个卷积核要在输入图像上滑动8×88\times 8个位置,每个位置进行5×5×35\times 5 \times 3次运算,一共有256256个卷积核。

如果用DK×DKD_K \times D_K表示卷积核的尺寸,DF×DFD_F \times D_F表示输入feature map的尺寸,MM表示输入channel数,NN表示输出channel数,那么在stride=1stride=1且有paddingpadding的情况下,总的计算量为:

DKDKMNDFDFD_K · D_K · M · N · D_F · D_F

Depthwise separable convolution的第一步是depthwise convolution,如下图:

MobileNet-深度可分离卷积

将原来的5×5×35 \times 5 \times 3的卷积核变为了3个5×5×15 \times 5 \times 1的卷积核,1×11 \times 1卷积核常被用来减少channel数。每个卷积核只在输入图像的一个channel上操作,最后得到一个8×8×38 \times 8 \times 3的输出。

这一步的计算量为8×8×5×5×1×3=4,8008 \times 8 \times 5 \times 5 \times 1 \times 3=4,800

第二步是pointwise convolution,如下图:

MobileNet-深度可分离卷积

它使用一个1×1×31 \times 1 \times 3的卷积核对depthwise convolution的输出图像进行逐点卷积,最终就得到了8×8×18 \times 8 \times 1的输出。

如果使用256个1×1×31 \times 1 \times 3的卷积核就能得到8×8×2568\times 8 \times 256的输出图像了。

MobileNet-深度可分离卷积

这一步的计算量为8×8×1×1×3×256=49,1528 \times 8 \times 1 \times 1 \times 3 \times 256=49,152

因此这两步的计算量之和就为4,800+49,152=53,9524,800+49,152=53,952,只有原来的53,9521,228,800=0.04390625\frac{53,952}{1,228,800}=0.04390625倍的计算量。

于是 ,用上面的符号来表示的话,那么在stride=1stride=1且有paddingpadding的情况下,

depthwise convolution的计算量为:

DFDFDkDkMD_F · D_F · D_k · D_k · M

pointwise convolution的计算量为:

DFDFMND_F · D_F · M · N

因此Depthwise separable convolution就为一般卷积计算量的:

DFDFDkDkM+DFDFMNDKDKMNDFDF=1N+1DK2\frac{D_F · D_F · D_k · D_k · M + D_F · D_F · M · N}{D_K · D_K · M · N · D_F · D_F}=\frac{1}{N}+\frac{1}{D_K^2}

现在的问题是,为什么这么做了只损失了一点精度呢?(当然,对于原本就较小的模型来说,使用Depthwise separable convolution的话参数就更少了,性能就会大幅下降而不是只下降一点了)但卷积的一些东西本来就是黑盒,我们并不知道它的详细原理,只知道这么做是有效的。

参考