MobileNet v1中 深度可分离卷积(Depthwise Separable Convolution) 是怎么回事
flyfish
深度可分卷积,深度可分离卷积,depthwise separable convolution
相同的意思,不同的名字
卷积是人工神经网络(ANN)中一种非常重要的数学运算。卷积神经网络(CNN)可以用来学习特征。
CNN有很多种类型,其中一类是深度可分离的卷积神经网络。
这些类型的CNN之所以被广泛使用,是因为以下两个原因:
与标准CNN相比,它们需要调整的参数数量更少,这减少了过度拟合。
它们的计算成本更低,因为它们的计算量更少,这使得它们适合于移动端视觉应用。
这些类型的CNN就像MobileNet、Xception(都是由Google提出的)
我们通过普通卷积和深度可分离卷积的计算过程对比,理解深度可分离卷积是如何减少计算量的。
正常卷积运算过程
假设有大小为Df x Df x M的输入数据,其中Df x Df是图像大小,M是通道数(对于RGB图像为3)。
假设有大小为Dk x Dk x M的N个卷积核,如果执行正常的卷积运算,则输出大小将为Dp x Dp x N。
1次卷积运算中的乘法次数=卷积核大小=
D
k
∗
D
k
∗
M
Dk * Dk * M
Dk∗Dk∗M。
由于有N个卷积核并且每个卷积核垂直和水平滑动
D
p
Dp
Dp次,
乘法总数变为
N
∗
D
p
∗
D
p
∗
(
每
次
卷
积
的
乘
法
)
N * Dp * Dp * (每次卷积的乘法)
N∗Dp∗Dp∗(每次卷积的乘法)。
所以对于正常的卷积运算的乘法总数=
N
∗
D
p
2
∗
D
k
2
∗
M
N * Dp^2 * Dk^2 * M
N∗Dp2∗Dk2∗M
深度可分离卷积的计算过程
深度可分离卷积分为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)
1、深度卷积(Depthwise Convolution)
在深度操作中,卷积一次应用于单个通道,而不像标准CNN那样对所有M个通道进行卷积。因此,这里的卷积核的大小为
D
k
∗
D
k
∗
1
Dk * Dk *1
Dk∗Dk∗1。
假设输入数据中有M个通道,则需要M个这样的过滤器。输出的大小为
D
p
∗
D
p
∗
M
Dp * Dp * M
Dp∗Dp∗M。
卷积核在所有M个通道上滑动
D
p
∗
D
p
Dp* Dp
Dp∗Dp次,
单个卷积运算的计算量是
D
k
∗
D
k
Dk * Dk
Dk∗Dk。
由于卷积核在所有M个通道上滑动
D
p
∗
D
p
Dp*Dp
Dp∗Dp次,
乘法总数等于
M
∗
D
p
∗
D
p
∗
D
k
∗
D
k
M * Dp * Dp *Dk * Dk
M∗Dp∗Dp∗Dk∗Dk。
因此,对于 深度卷积的运算乘法总数= M ∗ D k 2 ∗ D p 2 M*Dk^2 * Dp^2 M∗Dk2∗Dp2
2、逐点卷积(Pointwise Convolution)
在逐点卷积运算中,在M个通道上应用1×1卷积运算。因此,此操作的卷积核大小将为
1
∗
1
∗
M
1 * 1 * M
1∗1∗M。
假设我们使用N个这样的卷积核,则输出大小为
D
p
∗
D
p
∗
N
Dp * Dp* N
Dp∗Dp∗N
单次卷积运算需要
1
∗
M
1*M
1∗M次乘法。
由于卷积核滑动
D
p
∗
D
p
Dp*Dp
Dp∗Dp次,
乘法总数等于
M
∗
D
p
∗
D
p
∗
(
卷
积
核
的
数
量
)
M * Dp * Dp *(卷积核的数量)
M∗Dp∗Dp∗(卷积核的数量)。
因此,对于逐点卷积的运算乘法总数
=
M
∗
D
p
2
∗
N
=M *Dp^2 * N
=M∗Dp2∗N
深
度
可
分
离
卷
积
总
计
算
量
=
M
∗
D
k
2
∗
D
p
2
+
M
∗
D
p
2
∗
N
=
M
∗
D
p
2
∗
(
D
k
2
+
N
)
深度可分离卷积总计算量 = M * Dk^2 * Dp^2 + M * Dp^2 * N = M * Dp^2 * (Dk^2 + N)
深度可分离卷积总计算量=M∗Dk2∗Dp2+M∗Dp2∗N=M∗Dp2∗(Dk2+N)
对比
[ d e p t h w i s e ] [ s e p a r a b l e ] [ c o n v o l u t i o n ] [ s t a n d a r d ] [ c o n v o l u t i o n ] = M ∗ D p 2 ∗ ( D k 2 + N ) N ∗ D p 2 ∗ D k 2 ∗ M = 1 / N + 1 / D k 2 \frac{[depthwise][ separable][ convolution]}{[standard ][convolution ]}=\frac{M * Dp^2 * (Dk^2 + N)}{N * Dp^2 * Dk^2 * M} = 1/N + 1/Dk^2 [standard][convolution][depthwise][separable][convolution]=N∗Dp2∗Dk2∗MM∗Dp2∗(Dk2+N)=1/N+1/Dk2
再看两个易于理解的图
普通卷积
深度可分离卷积
深度分离就是通道分离各自计算,然后堆叠起来,最后用1×1得到你想输出的通道数
假设
输入是 7 * 7 * 3
输出是 5 * 5 * 128
标准卷积步骤一步就完成
因为 7 * 7 * 3 -》3 * 3 * 3 = 5 * 5 * 1
所以 7 * 7 * 3 -》3 * 3 * 3(128个) = 5 * 5 * 128
深度可分卷积需要经过两步
7 * 7 * 3 -》3 * 3 * 1(3个)= 5 * 5 * 3
5 * 5 * 3 -》1 * 1 * 3(128个)= 5 * 5 * 128
标准卷积计算次数
128个 3 * 3 * 3 移动了 5 * 5 次
128 * (( 3 * 3 * 3 )* ( 5 * 5 ))=128 * 675 =86400
深度可分卷积计算次数
第一步:3 * 3 * 1(3个)移动了 5 * 5 次
第二步:1 * 1 * 3(128个)移动了 5 * 5 次
3 * (( 3 * 3 * 1 ) * ( 5 * 5 )) + 128 * (( 1 * 1 * 3 ) * ( 5 * 5 ))
=675 + 9600 = 10275
此处的计算结果是
标准卷积的计算量 是 深度可分卷积计算量的8.4倍(当前实例)
在《MobileNetV2: Inverted Residuals and Linear Bottlenecks》
论文中已经给他们起了名字
depthwise convolution,pointwise convolution
Depthwise(DW)卷积,Pointwise(PW)卷积
The first layer is called a depthwise convolution, it performs lightweight filtering by applying a single convolutional filter per input channel.
The second layer is a 1 × 1 convolution, called a pointwise convolution, which is responsible for building new features through computing linear combinations of the input channels
在《Xception: Deep Learning with Depthwise Separable Convolutions》这篇论文中也有描述
a depthwise convolution followed by a pointwise convolution