首发于MCPRL
理解分组卷积和深度可分离卷积如何降低参数量

理解分组卷积和深度可分离卷积如何降低参数量

这是一篇简短的小文章,主要记录下我对分组卷积(Group convolution)和深度可分离卷积(Depthwise separable convolution)的一点理解。上网看别人写的博客和文章大同小异,他们锻炼了自己的英语翻译能力,也考验了我们读者的理解能力。

分组卷积(Group convolution)

这两张图怎么少的了呢:


第一张图代表标准卷积操作。若输入特征图尺寸为 H \times W \times c_1 ,卷积核尺寸为 h_1 \times w_1 \times c_1 ,输出特征图尺寸为 H \times W \times c_2 ,标准卷积层的参数量为: \bm{(h_1 \times w_1 \times  c_1) \times c_2}(一个滤波器在输入特征图 h_1 \times w_1 \times c_1 大小的区域内操作,输出结果为1个数值,所以需要 c_2 个滤波器。)

第二张图代表分组卷积操作。将输入特征图按照通道数分成 g 组,则每组输入特征图的尺寸为 H \times W \times( \frac {c_1}{g}) ,对应的卷积核尺寸为 h_1 \times w_1 \times (\frac{c_1}{g}) ,每组输出特征图尺寸为 H \times W \times (\frac {c_2}{g}) 。将 g 组结果拼接(concat),得到最终尺寸为 H \times W \times c_2 的输出特征图。分组卷积层的参数量为 h_1 \times w_1 \times (\frac{c_1}{g}) \times (\frac{c_2}{g}) \times g = \bm{h_1 \times w_1 \times c_1 \times c_2  \times \frac{1}{g}}

深入思考一下,常规卷积输出的特征图上,每一个点是由输入特征图 h_1 \times w_1 \times c_1 个点计算得到的;而分组卷积输出的特征图上,每一个点是由输入特征图 h_1 \times w_1 \times (\frac{c_1}{g}) 个点计算得到的。自然,分组卷积的参数量是标准卷积的 1/g

深度可分离卷积(Depthwise separable convolution)

这张图怎么少的了呢:

图(a)代表标准卷积。假设输入特征图尺寸为 D_F \times D_F \times M ,卷积核尺寸为 D_K \times D_K \times M ,输出特征图尺寸为 D_F \times D_F \times N,标准卷积层的参数量为: \bm{(D_K \times D_K \times  M) \times N}

图(b)代表深度卷积,图(c)代表逐点卷积,两者合起来就是深度可分离卷积。深度卷积负责滤波,尺寸为(DK,DK,1),共M个,作用在输入的每个通道上;逐点卷积负责转换通道,尺寸为(1,1,M),共N个,作用在深度卷积的输出特征映射上。

深度卷积参数量为 \bm{{(D_K \times D_K \times  1) \times M}} ,逐点卷积参数量为 \bm{(1×1×M)×N} ,所以深度可分离卷积参数量是标准卷积的 \frac{D_K×D_K×M+M×N}{D_K×D_K×M×N} = \frac{1}{N} + \frac{1}{D_K^2}

为了便于理解、便于和分组卷积类比,假设 M=N 。深度卷积其实就是 g=M=N 的分组卷积,只不过没有直接将 g 组结果拼接,所以深度卷积参数量是标准卷积的 1/N 。逐点卷积其实就是把g 组结果用 1\times1 conv 拼接起来,所以逐点卷积参数量是标准卷积的 1 / {D_K}^2 。(只考虑逐点卷积,之前输出的特征图上每一个点是由输入特征图 D_K \times D_K 区域内的点计算得到的;而逐点卷积输出上每一个点是由 1\times1 区域内的点计算得到的)。自然,深度可分离卷积参数量是标准卷积的 {1}/{N} + {1}/{D_K^2}


参考

A Tutorial on Filter Groups (Grouped Convolution)

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

编辑于 2019-05-13

文章被以下专栏收录