深度分离卷积方法简介

简介

相比于普通卷积,Depth-wise 卷积是一种可以减少FLOPs的卷积。但根据网上的评价,这种卷积在降低计算量的同时,会减慢推理速度;实际原因可能是Depth-wise采用的做法将存储瓶颈变为了计算瓶颈:减小了模型size,但在实际计算时需要的IO读取次数是普通卷积的100倍,增加了IO时间。

方法

对于普通卷积,输入feature map为$HWC$,输出为$H_1W_1C_1$的情况。kernel size为$(k_1,k_2)$。那么FLOPs为:$k_1\times k_2\times C\times C_1$。

如上图所示,输入大小为$12\times 12\times 3$,kernel大小$5\times 5$,输出大小为$8\times 8\times 256$,参数量为:$5\times 5\times 3\times 256$。

对于深度分离卷积,它将输入的每层channel分开计算卷积,再通过$1\times 1$卷积进行全channel的映射。

如图,每个channel先进行$5\times 5$大小的卷积操作,得到一个$8\times 8\times 3$的feature map。

再对$8\times 8\times 3$做$1\times 1$的卷积,进行全通道的映射。

第一部分参数量为:$5\times 5\times 3$,第二部分参数量为:$1\times 1\times 3\times 256$。总参数量为$5\times 5\times 3+1\times 1\times 3\times 256$。

形象的方法例子说完了,下面来进行抽象分析。

对于输入大小为$HWC$的feature map,要得到输出大小为$H_1W_1C_1$的feature map,kernel size统一假定为$(k_1,k_2)$。

普通卷积的情况为:

FLOPs: $H_1\times W_1\times k_1\times k_2\times C\times C_1$。也就是输出map大小$\times$kernel大小$\times$输入输出通道。

参数量: $k_1\times k_2\times C\times C_1$。也就是$C_1$个计算$C$通道、大小为$(k_1,k_2)$的kernel。

读取的数据量为feature map+kernel权重,整体为$HWC+k_1k_2CC_1$。

深度分离卷积的情况为:

FLOPs: $H_1\times W_1\times k_1\times k_2\times C_1+H_1W_1\times1\times1\times C\times C_1$。

参数量:$k_1k_2C+1\times1\times C\times C_1$。

读取的数据量为feature map+kernel权重,整体为$HWC+k_1k_2C+CC_1$。

对比:

$HWC$$\rightarrow$$H_1W_1C_1$ ($k_1,k_2$) FLOPs 参数量 读取数据量
普通卷积 $H_1W_1k_1k_2CC_1$ $k_1k_2CC_1$ $HWC+k_1k_2CC_1$
深度分离卷积 $H_1W_1C_1(k_1k_2+C)$ $k_1k_2C+CC_1$ $HWC+k_1k_2C+CC_1$
倍数(深度/普通) $\frac{k_1k_2+C}{k_1k_2C}$ $\frac{k_1k_2+C_1}{k_1k_2C_1}$ -

总结

深度分离卷积是一种降低FLOPs和参数量的方法,对于它的缺点(?)此处不做介绍,具体可以参见博客:FLOPs与模型推理速度

Reference


深度分离卷积方法简介
https://pandintelli.github.io/2022/04/10/Depth-wise-Convolution/
作者
Pand
发布于
2022年4月10日
许可协议