论文链接:https://arxiv.org/abs/1704.04861
MXNet框架代码:https://github.com/miraclewkf/mobilenet-MXNet
moblileNet,顾名思义,可以在移动端使用的网络,那必然要求网络的计算量要小一些,不然移动端可扛不住啊,那MobileNet如何做到这个的呢??总结来看,其主要创新点就在于论文中反复强调的depth-wise separable convolutions,作者将其操作分成两步,一部分是depthwise convolution,另一部分是pointwise convolution,通过这种方法,将网络的复杂度降下来,使得可以在移动端、嵌入式平台中使用。
那么MobileNet是怎么做的呢?
首先介绍一下论文的核心:Depthwise Separable Convolution
Depthwise Separable Convoltion类似于一种因式分解,比如你求面积,可以使用长乘以宽一样,moblieNet就是将一个完整的卷积分为两部分:depthwise convolution以及1*1的pointwise convolution, depthwise对特征图的每个channel进行卷积,pointwise convolution将depthwise的结果进行合并。如下图所示,图(a)为一个标准的卷积计算,标准的卷积需要将filter与各个channel相乘,然后求和得到一个卷积结果。图(b)代表着depthwise convolution,其将每个filter与每个channel单独相乘,并不求和,得到与原来channel相同的特征图,然后利用图(c)代表pointwise convolution,将各个特征图求和。
下面详细说明一下:
在标准的卷积中假设输入为 D F ∗ D F ∗ M D_F*D_F*M DF∗DF∗M的特征图F,其中M为通道数(channel),输出为 D G ∗ D G ∗ N D_G*D_G*N DG∗DG∗N的特征图G,利用卷积核大小为 M ∗ D K ∗ D K ∗ N M*D_K*D_K*N M∗DK∗DK∗N,标准的卷积计算的计算量为: D K ∗ D K ∗ M ∗ N ∗ D F ∗ D F D_K*D_K*M*N*D_F*D_F DK∗DK∗M∗N∗DF∗DF这里当然是估算,stride=1时,大概是这个数,至于moblileNet呢?首先使用M个 D K ∗ D K D_K*D_K DK∗DK的卷积核,如图(b)所示,对每个channel进行处理(这里其实就是一个group 卷积处理,group数量等于channel数量,就实现了每个卷积核对每个channel处理),这里的计算量是 D K ∗