[模型压缩/加速]-加速卷积计算的三种方法-Depth-wise Conv、Group Conv、Channel-wise Conv

1.概念简介

假设输入尺寸大小为aa、通道 为n,输出通道数为m,卷积核大小为bb,步长为1.那么
计算量为 FLOPs = a * a * n * m * b * b
参数量为 b * b * n * m
这就是传统卷积的计算方式,可以看到,当a、b、n、m相对较大的时候,造成的计算量是非常大的,所以就有降低模型大小与计算量的需要。

2.Depth-wise Conv

出自论文《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》,这个DwConv的提出是它的核心工作之一,它可以将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核)。深度卷积将每个卷积核应用到每一个通道,而1 × 1卷积用来组合通道卷积的输出。
[模型压缩/加速]-加速卷积计算的三种方法-Depth-wise Conv、Group Conv、Channel-wise Conv_第1张图片
对一个大小为aan的输入图,传统的方法是使用大小为bbn*m的卷积核进行卷积。

而depth-wise separable convolution则首先使用大小为bb1n的卷积核进行depth-wise convolution。具体来说,在depth-wise convolution中,n个输入通道中的每一个都有相应的卷积核,两两进行卷积。得到的输出通道数为n,如果stride为1且padding为same的话,大小就是aa*n。

接下来再进行1x1卷积,卷积核为11nm,得到aa*m的最终输出。

这种方法的计算量为FLOPs=a*a*n*b*b+a*a*n*m,参数大小为aan+n*m

可以发现参数量和计算量都大幅下降。现在大多数的卷积核大小为3*3,可以大致减少1/8-1/9的计算量。

但是可以发现仍然没有规避一个巨大的n*m,在现代网络通道数动辄512、1024的情况下,仍然有优化余地。

3.Group Conv

最早见于AlexNet——2012年Imagenet的冠军方法,Group Convolution被用来切分网络,使其在2个GPU上并行运行。
Group Convolution顾名思义,则是对输入feature map进行分组,然后每组分别卷积。
[模型压缩/加速]-加速卷积计算的三种方法-Depth-wise Conv、Group Conv、Channel-wise Conv_第2张图片
我们假设输入通道数和输出通道数都能被g整除,那么计算量就是FLOPs = a * a * n * m * b * b / g,参数量是b * b * n * m / g
缺点很明显,就是形成的新的特征图只来源于他们上一级的同组,而不同组别之间的信息没有任何交流,这就会导致性能损失。

后面有ShuffleNet对group convolution进行改进,就是在卷积完成后加入一个channel shuffle。进行均匀的打乱,这样接下来进行group convolution时,每一个group的输入不是只来自相邻组,这样就实现了特征融合。
[模型压缩/加速]-加速卷积计算的三种方法-Depth-wise Conv、Group Conv、Channel-wise Conv_第3张图片
利用channel shuffle就可以充分发挥group convolution的优点,而避免其缺点

4.Channel-wise Conv

出自论文: ChannelNets: Compact and Efficient Convolutional Neural Networks via Channel-Wise Convolutions
论文地址:https://arxiv.org/abs/1809.01330
论文代码:https://github.com/HongyangGao/ChannelNets

Channel-wise卷积的核心在于输入和输出连接的稀疏化,每个输出仅与部分输入相连,概念上区别于分组卷积,没有对输入进行严格的区分,而是以一定的stride去采样多个相关输入进行输出(在channel维度滑动),能够降少参数量以及保证channel间一定程度的信息流

假设我们输入一个2 * 2 * 9的图像,将图像平铺,我们会得到一个6 * 6的 二维图,卷积核大小为 1 * 1 * 4
[模型压缩/加速]-加速卷积计算的三种方法-Depth-wise Conv、Group Conv、Channel-wise Conv_第4张图片
channel-wise convolution的卷积核为公用的,大小为11c的卷积核,代表着参数量也仅为c 。它的计算量为cnaa,规避了 巨大的mn,效率比较高。

5.补充

感觉4还有点不太明白,有没有人讨论下,他这个实现分组交流是靠什么?是平铺成2d图后,根据步长来进行滑动,直接完全跳出一个2*2的小的子图吗?
这个点还需要再看下。

你可能感兴趣的:(模型压缩/加速,目标检测,深度学习,卷积,人工智能,算法,机器学习)