本文简介轻量级网络中两种经典压缩方法:分组卷积(Group Convolution) 和 深度可分离卷积(depthwise separable convolution)
参考文献:
0. 卷积
对于普通卷积而言,卷积层的filters决定了参数量,其中
- 尺寸(h1,w1)与 input / output 的(H,W)有关
- 通道数c1与 input 的通道数相同
- 数量c2与 output 的通道数相同
从而,普通卷积层的参数量为:
P
1
=
h
1
×
w
1
×
C
1
×
C
2
=
k
2
C
1
C
2
P1 = h1×w1×C1×C2 = k^2C1C2
P1=h1×w1×C1×C2=k2C1C2
1. 分组卷积(Group Conv)
分组卷积的概念最先来源于AlexNet,其基本原理如下图。
当时是由于GTX580仅有3GB的memory,因此AlexNet在两块GPU上运行,才能满足其大参数量的需求
- 将input/output按channels分成g组,每组维度即为(H1,W1,C1/g)和(H2,W2,C2/g)
- 从而filters也为g组,每组C2/g个维度为(h1,w1,C1/g)的filters
其实就相当于将原来的卷积层拆分成了g个并行卷积层,其实我们的filters数量没有变化,只是每一个filter仅负责C1/g个通道信息了,从而参数量变为: P 2 = P 1 / g P2 = P1/g P2=P1/g
2. 深度可分离卷积(Depthwise Seperable Conv)
在MobileNet中,将深度可分离卷积描述为两个步骤: 深度卷积(Depthwise Conv)和逐点卷积(Pointwise Conv)
- 深度卷积,其实是上文中分组卷积的一个特例,令C2=C1,g=C1,分组卷积便变成了深度卷积。说白了,深度卷积就是对input的每一个通道单独做卷积,使(H1,W1, C1)→(H2,W2, C1)
- 逐点卷积,其实就是普通卷积的一个特例,只是卷积核尺寸为1×1而已;说白了就是用1×1 filters做一次通道调整,使(H2,W2,C1)→(H2,W2,C2)
参数量计算:
- 深度卷积参数量:h1×w1×1×C1
- 驻点卷积参数量:1×1×C1×C2
因此,
P
3
=
k
2
C
1
+
C
1
C
2
=
(
1
/
C
2
+
1
/
k
2
)
P
1
P3=k^2C1+C1C2=(1/C2+1/k^2)P1
P3=k2C1+C1C2=(1/C2+1/k2)P1
(若C2相对于k而言较大,那么
P
3
≈
P
1
/
k
2
P3≈P1/k^2
P3≈P1/k2)
下图取自MobileNet-v1