码字不易,转载请注明出处~~
tags: depthwise seperable convolution; pointwise convolution; mobilenet
论文题目《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
来源:google 2017
核心思想:利用深度可分离卷积(depthwise separable convolutions)进行通道卷积,极大减少了参数量和运算量;同时引入宽度因子 α \alpha α和分辨率因子 ρ \rho ρ来控制模型的通道和输入图像分辨率,从而减少图像的运算量和参数量。
传统标准卷积过程
假定输入维度为[batchsize, height, width, channels],即有M个通道,每个通道的特征图大小为DF
×
\times
× DF,如果输出特征图大小与输入一样,有N个通道,那么卷积核的维度为 [M
×
\times
× DF
×
\times
× DF
×
\times
× N],也就是每个卷积核的宽度为M,共有N个。
那么传统卷积的过程图就如下图所示,每个卷积核要与对应的输入特征图进行卷积,然后将结果相加,产生一个输出特征图。整个过程要进行N次,最终产生N个输出特征图。
这样,可以计算一下总共需要的运算和参数量:
运算量:每个卷积核大小为DF
×
\times
× DF,那么它与输入进行卷积的时候,对每一个特征图都要进行DK
×
\times
× DK
×
\times
× DF
×
\times
× DF次运算相乘相加的过程,才能对应产生一个输出特征图,那么一共有M个特征图,N个核,则需要进行DK
×
\times
× DK
×
\times
× M
×
\times
× N
×
\times
× DF
×
\times
× DF次运算才能产生结果。
参数量:卷积核的宽度为M,单个卷积核的参数量是DK
×
\times
× DK,一共有N个卷积核,那么参数量为DK
×
\times
× DK
×
\times
× M
×
\times
× N
MobileNet卷积过程
mobilenet通过对输入通道进行分离卷积,即每一个通道都对应一个卷积核的方式,将M个输入特征图分别对应M个卷积核进行卷积操作,然后利用1
×
\times
× 1的卷积核进行通道融合,最终产生输出特征图。这样做的好处就在于减少卷积核DK
×
\times
× DK 的数目,利用1
×
\times
× 1来代替。过程如下:
上图中的filter1只有一列,只有一个卷积核,卷积核的宽度M对应输入的M个特征图,进行完卷积操作之后,利用1
×
\times
× 1的卷积过程,进行卷积,从而进行特征的融合。那么可以计算一下这个结构的计算量和参数量
计算量:filter1卷积核大小为DK
×
\times
× DK,因为输入特征图有M个,因此这里的filter1的卷积核宽度M;将它们进行卷积操作所需要的运算量为:DK
×
\times
× DK
×
\times
× DF
×
\times
× DF
×
\times
× M;这步执行完之后,产生的特征图数量依然为M个,假设输出大小与输入特征图大小相同,没有发生变化。那么下面就是利用1
×
\times
× 1的卷积核filter2进行特征融合了。1
×
\times
× 1卷积核的shape为M
×
\times
× N,每个卷积核与上一步filter1产生的特征图进行卷积后结果相加,产生1个输出特征图,那么一共进行N次,则产生N个输出特征图。第二步计算量为:M
×
\times
× 1
×
\times
× 1
×
\times
× DF
×
\times
× DF
×
\times
× N 。综上,总共需要的运算量为:DK
×
\times
× DK
×
\times
× DF
×
\times
× DF
×
\times
× M + M
×
\times
× 1
×
\times
× 1
×
\times
× DF
×
\times
× DF
×
\times
× N
参数量:filter1中,就有一个卷积核,其宽度为M,那么其参数量M × \times × DK × \times × DK,1 × \times × 1卷积核一共有M × \times × N个,那么参数量为:M × \times × N,总共:M × \times × DK × \times × DK + M × \times × N
对比
可以看出,mobilenet中的运算量相比较标准卷积过程如下:
D
K
×
D
K
×
D
F
×
D
F
×
M
+
M
×
1
×
1
×
D
F
×
D
F
×
N
D
K
×
D
K
×
M
×
N
×
D
F
×
D
F
=
1
N
+
1
D
K
2
\frac {D_K \times D_K \times D_F \times D_F \times M + M \times 1 \times 1 \times D_F \times D_F \times N} {D_K \times D_K\times M \times N \times D_F \times D_F} = \frac {1}{N} + \frac {1}{D_K^2}
DK×DK×M×N×DF×DFDK×DK×DF×DF×M+M×1×1×DF×DF×N=N1+DK21
可以看到,mobilenet的运算量是之前的标准卷积过程的大约
1
N
+
1
D
K
2
\frac{1}{N} + \frac{1}{D_K^2}
N1+DK21倍,如果这时的卷积核DK大小为3,那么总体运算量低于标准卷积操作的
1
9
\frac{1}{9}
91。
对于参数量而言,参数量缩减如下:
M
×
D
K
×
D
K
+
M
×
N
D
K
×
D
K
×
M
×
N
=
1
N
+
1
D
K
2
\frac {M \times D_K \times D_K + M \times N} {D_K \times D_K \times M \times N} = \frac {1}{N} + \frac {1}{D_K^2}
DK×DK×M×NM×DK×DK+M×N=N1+DK21
好了,具体的计算和参数分析完了,看下作者在原文中是怎么表示的:
网络实现
相比较传统卷积过程,mobilenet中对网络结构进行了微观层面的修改,下图可以很好的进行说明:
这里,作者强调,因为mobilenet中大量使用了1 × \times × 1卷积核,而在一般深度学习框架中,都会采用一种叫做矩阵乘法优化的方式对卷积核和输入特征图进行卷积操作,在Caffe框架中的im2col函数就是实现了这种方式。具体原理我认为下面这篇博客概括的非常好:https://blog.youkuaiyun.com/Mrhiuser/article/details/52672824。 正因为使用了 1 × \times × 1 这种方式,可以大量减少卷积的重组过程,从而能够节省大量的底层运算,大大加速了底层的运算。
辅助功能
仅仅简单实现了这样的mobilenet网络显然对于google大牛还是不够的,于是作者提出了两个因子来可以针对不同任务和需求进行网络的修改。
宽度因子
α
\alpha
α:这个
α
\alpha
α是用来进行模型“瘦身”的,主要用在控制每层网络输入的通道数量,也就是说,如果原来的网络输入通道数量为M, 那么在设置了
α
\alpha
α因子后,其输入通道变为原来的
α
×
M
\alpha \times M
α×M,这样就可以在每层减少特征图的数目,从而网络计算量和参数量减少,计算量变为:
D
K
×
D
K
×
D
F
×
D
F
×
α
M
+
α
M
×
1
×
1
×
D
F
×
D
F
×
α
N
D_K \times D_K \times D_F \times D_F\times \alpha M + \alpha M \times 1 \times 1 \times D_F \times D_F \times \alpha N
DK×DK×DF×DF×αM+αM×1×1×DF×DF×αN
可以看到,只是改变这一个因子,其计算量减少非常可观,接近指数级别。
分辨率因子
ρ
\rho
ρ:这个
ρ
\rho
ρ主要是用来进行模型每层特征图大小的缩放。如果原来网络中某层的输入特征图大小为
D
F
D_F
DF,那么在添加了这个分辨率因子之后,其特征图大小则变为
ρ
D
F
\rho D_F
ρDF,那么整体运算量又进行了大幅减少,其计算量变为:
ρ
D
F
×
ρ
D
F
×
D
K
×
D
K
×
α
M
+
α
M
×
1
×
1
×
ρ
D
F
×
ρ
D
F
×
α
N
\rho D_F \times \rho D_F \times D_K \times D_K\times \alpha M + \alpha M \times 1 \times 1 \times \rho D_F \times \rho D_F \times \alpha N
ρDF×ρDF×DK×DK×αM+αM×1×1×ρDF×ρDF×αN
可以看到,其计算量缩减也大约是指数级别的。
一般这里宽度因子 α \alpha α取值为[1, 0.75, 0.5, 0.25],分辨率因子 ρ \rho ρ取值为[0, 1]。
实验部分
这部分作者测试了不同的参数下的模型表现,一张图表带过: