分组卷积(Group Convolusion)
提到分组卷积,我们最开始应该想到是大名鼎鼎的Alexnet.Alexnet最先用到了分组卷积,由于计算资源的有限,它将网络分成两部分,从而能够在两个GPU上并行运行。如图所示:
我们来具体看下,分组卷积是如何操作的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VdaLYRnl-1587883560359)(http://cdn.wangng.com/deeplearning/CNN中的Group&&Depthwise&&pointerwise卷积/分组卷积.png)]
如上图所示,左边的是常规的卷积,右边就是分组卷积。它把输入的特征图分成了几个组,然后各个组分别进行常规的卷积,将分组卷积后得到的特征图进行concat拼接,最后得到新的特征图。
常规卷积vs分组卷积
从图中(线代表卷积操作)可以明显看出,分组卷积的计算量是明显低于常规卷积。这只是从图中判断而已,我们来具体分析下这个计算量到底少多少?
就以上面的图为例,假设输入特征图的大小是H*W*N,卷积核的数量大小是M*k*k*N,那么输出的特征图很快就能算出来就是H*W*M,另外假设分组大小是g组。我们来计算下两种卷积的参数量情况。
常规卷积的参数量是M*k*k*N。分组卷积我们仔细分析下,我们先计算一组的参数量,输入现在是H * W * N/g,输出是H * W * M/s,那么相应的卷积核数量大小就是M/s * k * k * N/s。所以分组卷积中一组的参数量就是M/s * k * k * N/s,一共有s组,最终的参数量为M * k * k * N/s,相比常规的卷积,分组卷积的参数量是它的1/s倍。这也是为什么人们会用分组卷积来代替常规卷积来降低模型的参数量。
Depthwise卷积
Depthwise卷积其实可以看做是分组卷积的极端情况。还是以上图为例,输入特征图为H*W*N,如果我们把分组大小s设成是输入特征图的深度(depth)N,输出特征图的大小也为H*W*N。那么这样的卷积方式就成为Depthwise卷积。
从图中我们可以看出,经过Depthwise卷积后,输出特征图的深度和输入特征图的深度保持一致。这种针对每个channel的卷积方式,没有有效的利用不同map对相同位置空间的信息,使得卷积后的效果大打折扣,虽然参数量进一步减少了。
Depthwise卷积的参数量为k*k*N。是常规卷积的1/N
Pointerwise卷积
Pointerwise卷积一般是紧跟Depthwise卷积的。Pointerwise卷积和常规卷积很相似,只不过卷积核的大小变成了1*1*M,M是上一层卷积的channl数。pointerwise卷积会对上一层的特征图在各个channel上进行线性加权就和,得到一个新的channel为1的特征图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clquCXgM-1587883560371)(http://cdn.wangng.com/deeplearning/CNN中的Group&&Depthwise&&pointerwise卷积/pointwise.png)]
这里的pointerwise卷积就是我们所谓的1*1卷积。它会对上一层的特征图在channl维进行拓展。Pointerwise卷积的参数量是N*1*1*M,是常规卷积的1/(k^2)
深度可分离卷积
说完Depthwise和pointwise卷积后,深度可分离卷积就很好理解了,深度可分离卷积就是这两种卷积的组合,它将常规卷积分成了两部分,输入特征图先经过Depthwise卷积,再经过pointerwise卷积。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9tGHw7dE-1587883560375)(http://cdn.wangng.com/deeplearning/CNN中的Group&&Depthwise&&pointerwise卷积/seperate.png)]
参数量方面我们来计算下:
这和我们分别计算的结果是吻合的。
参考
1.A Tutorial on Filter Groups (Grouped Convolution)
2.https://www.cnblogs.com/shine-lee/p/10243114.html
3.理解分组卷积和深度可分离卷积如何降低参数量