普通卷积:
上图为普通卷积示意图,为方便理解,图中只有一个卷积核,此时输入输出数据为:
输入feature map尺寸: W×H×C ,分别对应feature map的宽,高,通道数;
单个卷积核尺寸: k×k×C ,分别对应单个卷积核的宽,高,通道数;
输出feature map尺寸 :W'×H' ,输出通道数等于卷积核数量,输出的宽和高与卷积步长有关,这里不关心这两个值。
参数量
运算量,这里只考虑浮点乘数量,不考虑浮点加。
group convolution (分组卷积):
将图一卷积的输入feature map分成组,每个卷积核也相应地分成组,在对应的组内做卷积,如上图2所示,图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成个feature map。
输入每组feature map尺寸: ,共有组;
单个卷积核每组的尺寸:,一个卷积核被分成了组;
输出feature map尺寸:,共生成个feature map。
现在我们再来计算一下分组卷积时的参数量和运算量:
参数量
运算量
我们居然用了同等的参数量运算量生成了个feature map!!!
所以group conv常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature map,大量的feature map意味着能够编码更多的信息!
换个角度看,如果要生成个feature map来编码特征信息,普通卷积需要个卷积核,其参数量为,而分组卷积只需要将一个卷积核分为组即可实现,参数量只有。
从分组卷积的角度来看,分组数就像一个控制旋钮,最小值是1,此时的卷积就是普通卷积;最大值是输入feature map的通道数,此时的卷积就是depthwise sepereable convolution,即深度分离卷积,又叫逐通道卷积。
深度分离卷积:
如上图所示,深度分离卷积是分组卷积的一种特殊形式,其分组数,其中是feature map的通道数。即把每个feature map分为一组,分别在组内做卷积,每组内的单个卷积核尺寸为,组内一个卷积核生成一个feature map。这种卷积形式是最高效的卷积形式,相比普通卷积,用同等的参数量和运算量就能够生成个feature map,而普通卷积只能生成一个feature map。
所以深度分离卷积几乎是构造轻量高效模型的必用结构,如Xception, MobileNet, MobileNet V2, ShuffleNet, ShuffleNet V2, CondenseNet等轻量型网络结构中的必用结构。
多维情况下的分组卷积运算
上面为便于理解,只讨论了单个卷积核情况下的普通卷积和分组卷积情况,当卷积核增加时,两种卷积运算有什么区别呢?
如上图所示,假设要生成4个输出通道,普通卷积需要4个维度的滤波器,而对于分组卷积来说,假设分组数为(图中为2),则需要4个的滤波器,参数量减少了倍。
上图详细演示了分组卷积计算的特点,即首先把输入特征图划分为组,在各组内分别进行卷积生成特征图,最后所有分组中的特征图总和即为输出特征图的数量。
这一卷积方式虽然高效且便宜,但也存在明显的弊端,即输出的特征图数量只能是分组数的整数倍,即,不能是任意值。这就决定了输入通道数和输出通道数都必须被分组数整除。幸好常用的通道数都是,容易找到输入和输出的公约数作为分组数,否则,如果通道数是37,61这种素数,则无法用分组卷积实现。
另外一个弊端是这种分组间被隔离的卷积方式无法进行通道间的信息交流,如上图所示的第一组中生成的特征图所包含的信息只是对第一组输入特征图的总结和提取,并不包含第二组输入特征图的信息,因为两组之间没有任何连接。而普通卷积计算时所有通道间都有连接,对应相乘之后再相加实现全局信息总结。一种解决方案就是通道shuffle操作,详见ShuffleNet。