论文地址:https://arxiv.org/abs/1704.04861
MobileNet的核心就是Depthwise separable convolution(深度可分离卷积),它将一般的卷积过程分为了depthwise convolution(逐深度卷积)和pointwise convolution(逐点卷积),在损失一点精度的情况下,计算量大幅下降,速度更快,模型更小。
先来看看一般的卷积过程,如下图:

输入12×12×3的图像,即size=12×12,channel=3,使用5×5×3的卷积核,stride=1,无padding,则卷积后,输出8×8×1的图像。
为了得到下图channel=256的输出:

那么就需要256个卷积核(一个卷积核输出一个channel),因此总的计算量就为8×8×5×5×3×256=1,228,800,即一个卷积核要在输入图像上滑动8×8个位置,每个位置进行5×5×3次运算,一共有256个卷积核。
如果用DK×DK表示卷积核的尺寸,DF×DF表示输入feature map的尺寸,M表示输入channel数,N表示输出channel数,那么在stride=1且有padding的情况下,总的计算量为:
DK⋅DK⋅M⋅N⋅DF⋅DF
Depthwise separable convolution的第一步是depthwise convolution,如下图:

将原来的5×5×3的卷积核变为了3个5×5×1的卷积核,1×1卷积核常被用来减少channel数。每个卷积核只在输入图像的一个channel上操作,最后得到一个8×8×3的输出。
这一步的计算量为8×8×5×5×1×3=4,800
第二步是pointwise convolution,如下图:

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

这一步的计算量为8×8×1×1×3×256=49,152
因此这两步的计算量之和就为4,800+49,152=53,952,只有原来的1,228,80053,952=0.04390625倍的计算量。
于是 ,用上面的符号来表示的话,那么在stride=1且有padding的情况下,
depthwise convolution的计算量为:
DF⋅DF⋅Dk⋅Dk⋅M
pointwise convolution的计算量为:
DF⋅DF⋅M⋅N
因此Depthwise separable convolution就为一般卷积计算量的:
DK⋅DK⋅M⋅N⋅DF⋅DFDF⋅DF⋅Dk⋅Dk⋅M+DF⋅DF⋅M⋅N=N1+DK21
现在的问题是,为什么这么做了只损失了一点精度呢?(当然,对于原本就较小的模型来说,使用Depthwise separable convolution的话参数就更少了,性能就会大幅下降而不是只下降一点了)但卷积的一些东西本来就是黑盒,我们并不知道它的详细原理,只知道这么做是有效的。
参考