各参数含义如下:
C_IN:输入特征矩阵的channel数
C_OUT:输出特征矩阵channel数
K:卷积核大小
H_IN*W_IN:输入特征矩阵size(未用到)
H_OUT*W_OUT:输出特征矩阵size
传统卷积
- 卷积操作只有两种计算:乘法和加法
- 卷积操作是对位相乘再相加,因此乘法操作和加法操作的次数应相同
- 我们只需考虑乘法计算量,再将结果乘2即可
得到输出特征矩阵某一channel上的某一像素需要乘法计算:C_in*K*K
输出特征矩阵共有像素C_out*H_out*W_out
乘法计算量为C_in*K*K*C_out*H_out*W_out
总计算量为C_in*K*K*C_out*H_out*W_out*2
组卷积
- 假设分为g组,每个组n个卷积核
- 则输出矩阵channel数为n*g,每个组的channel数为C_in/g
- 得到输出矩阵上某个channel上的某个像素值需要乘法计算:每个组channel数*输入矩阵宽*输入矩阵高=(C_in/g)*K*K
- 输出矩阵共有n*g*H_out*W_out = C_out*H_out*W_out个像素
- 总计算量为C_in*K*K*n*H_out*W_out*2 = C_in*K*K*C_out*H_out*W_out*2/g
- 即若输出channel数量一致的情况下,组卷积的FLOPs为普通卷积的1/g
DW卷积
附上DW卷积操作图:
- DW卷积C_in == C_out
得到输出矩阵某一channel上的某一像素值需要乘法计算:K*K
输出矩阵共有像素C_in*H_out*W_out
乘法计算量为C_in*K*K*H_out*W_out
总计算量为C_in*K*K*H_out*W_out*2
PW卷积(卷积核大小为1*1的传统卷积)
附上PW卷积操作图:
得到输出矩阵某一channel上的某一像素值需要乘法计算:C_in
输出矩阵共有像素C_out*H_out*W_out
乘法计算量为C_in*C_out*H_out*W_out
总计算量为C_in*C_out*H_out*W_out*2
MobileNet的Depthwise Separable Conv
将传统卷积拆分为DW卷积核PW卷积两个部分,DW卷积的输出作为PW卷积的输入
综上,
(DW计算量+PW计算量)/传统卷积计算量=(C_in*C_out*H_out*W_out*2+C_in*K*K*H_out*W_out*2)/C_in*K*K*C_out*H_out*W_out*2=
1/k^2+1/C_out
在MobileNet中K一般为3,Cout很大,因此上式约等于1/9,即Depthwise Separable Conv减少了近9倍的计算量