论文解读 | MobileNets Efficient Convolutional Neural Networks for Mobile Vision Application

转载:https://blog.csdn.net/u013082989/article/details/77970196

1、概述

  • Google在2017年提出的适用于手机端的神经网络模型
  • 主要使用了深度可分离卷积Depthwise Separable Convolution 将卷积核进行分解计算来减少计算量
  • 引入了两个超参数减少参数量和计算量 

              宽度乘数(Width Multiplier): [减少输入和输出的 channels ]  pointwise

              分辨率乘数(Resolution Multiplier):[减少输入输出的 feature maps 的大小]  deepwise

2、深度可分离卷积(Depthwise Separable Convolution

  • 可以将一个标准卷积核分成一个深度卷积depthwise convolution 和 一个1X1的卷积(叫作逐点卷积pointwise convolution)。如下图所示

depthwise separable convolution

2.1 标准卷积

  • 标准的卷积层是将维度为D_{F}\times D_{F}\times M的输入层转化为维度为D_{G}\times D_{G}\times N ,我在另一个介绍mobilenet中详细说过怎么计算。

D_{F} 是输入feature map的长和宽,M 是输入的通道数(channels)

D_{G} 是输出feature map的长和宽,N 是输出的通道数

  • 假设卷积核filter的大小是D_{k}\times D_{k},则标准卷积的计算量是

D_{k}\cdot D_{k} \cdot M \cdot N \cdot D_{F} \cdot D_{F}

引用上篇论文中的图, 只看kernel matrix 部分,Dk⋅DkDk⋅Dk就是一个方格的大小,然后乘上输入和输出的channels个数,然后作用在input feature maps 

kernel matrix

标准卷积是这样的, 即不管当前pixel有多少channels,卷积之后就是一个channel

2.2 Depthwise Separable Convolution

  • 分为两个步骤 

第一步深度卷积:卷积核的大小是D_{k}\cdot D_{k} \cdot M \cdot 1,所以总的计算量是:

D_{k}\cdot D_{k} \cdot M \cdot D_{F} \cdot D_{F}
第二步逐点卷积:卷积核大小是1 \cdot 1 \cdot M \cdot N,所以总的计算量是:M \cdot N \cdot D_{F} \cdot D_{F}
所以和标准的卷积相比计算量比率为:  

(D_{k}\cdot D_{k} \cdot M \cdot D_{F} \cdot D_{F} + M \cdot N \cdot D_{F} \cdot D_{F}) /D_{k}\cdot D_{k} \cdot M \cdot N \cdot D_{F} \cdot D_{F} = 1/N + 1/D_{k} ^ 2
MobileNet使用的是3x3的卷积核,所以计算量可以减少8-9倍 (因为比率是1/N+1/9)
第一步深度卷积操作是在每一个channel上进行的卷积操作

regular conv

第二步逐点卷积才是结合起来

PointwiseConvolution

可以将一个标准卷积核分成一个深度卷积depthwise convolution 和 一个1X1的卷积(叫作逐点卷积pointwise convolution)。如下图所示
-


宽度乘数(Width Multiplier):减少输入输出的channels
分辨率乘数(Resolution Multiplier):减少输入输出的feature map的大小


3:深度可分离卷积是将一个标准的卷积核分成深度卷积核和1x1的点卷积核,假设输入为M个通道的feature map,卷积核大小为DK∗DKDK∗DK,输出通道为N,那么标准卷积核即为M∗DK∗DK∗NM∗DK∗DK∗N。例如,输入feature map 为m∗n∗16m∗n∗16,想输出32通道,那么卷积核应为16∗3∗3∗3216∗3∗3∗32,则可以分解为深度卷积:16∗3∗316∗3∗3得到的是16通道的特征图谱。点卷积为16∗1∗1∗3216∗1∗1∗32,如果用标准卷积,则计算量为:m∗n∗16∗3∗3∗32=m∗n∗4608m∗n∗16∗3∗3∗32=m∗n∗4608。用深度可分解卷积之后的计算量为m∗n∗16∗3∗3+m∗n∗16∗1∗1∗32=m∗n∗656m∗n∗16∗3∗3+m∗n∗16∗1∗1∗32=m∗n∗656

4:所以和标准卷积核相比计算量比率为:Dk∗Dk∗Df∗Df∗M+Df∗Df∗M∗NDk∗Dk∗M∗N∗Df∗Df=1N+1Dk2Dk∗Dk∗Df∗Df∗M+Df∗Df∗M∗NDk∗Dk∗M∗N∗Df∗Df=1N+1Dk2

5:深度可分解卷积操作示意图如下: 
 


6:mobilenet共28层(深度卷积和点卷积单独算一层),每层后边都跟有batchnorm层 和relu层 
 


7:引入宽度乘数和分辨率乘数两个超参数, 
宽度乘数αα主要用于减少channels,即即输入层的channels个数MM,变成αMαM,输出层的channels个数NN变成了αNαN 
所以引入宽度乘数后的总的计算量是:Dk⋅Dk⋅αM⋅DF⋅DF+αM⋅αN⋅DF⋅DFDk⋅Dk⋅αM⋅DF⋅DF+αM⋅αN⋅DF⋅DF

分辨率乘数ρρ主要用于降低图片的分辨率,即作用在feature map 上 
 所以引入分辨率乘数后的总的计算量为:Dk⋅Dk⋅αM⋅ρDF⋅ρDF+αM⋅αN⋅ρDF⋅ρDFDk⋅Dk⋅αM⋅ρDF⋅ρDF+αM⋅αN⋅ρDF⋅ρDF

在看看MobileNet_ssd 
mobilenet_ssd caffe模型可视化地址:MobileNet_ssd 
可以看出,conv13是骨干网络的最后一层,作者仿照VGG-SSD的结构,在Mobilenet的conv13后面添加了8个卷积层,然后总共抽取6层用作检测,貌似没有使用分辨率为38*38的层,可能是位置太靠前了吧。 
提取默认框的6层为conv11, conv13, conv14_2, conv15_2, conv16_2, conv17_2,该6层feature map 每个cell产生的默认框个数分别为3,6,6,6,6,6。也就是说在那6层的后边接的用于坐标回归的3*3的卷积核(层名为conv11_mbox_loc……)的输出个数(num output)分别为12,24,24,24,24,24,24。                             

那6层后边接的用于类别得分的3*3卷积核(层名为conv11_mbox_conf……)的输出个数为3*21(类别为21类,3个默认框) = 63,126, 126, 126, 126, 126。                        
 

猜你喜欢

转载自blog.csdn.net/weixin_39875161/article/details/90615482