分组卷积:Grouped convolution

参考:A Tutorial on Filter Groups (Grouped Convolution)

分组卷积最早出现在AlexNet中,当时硬件资源有限,训练时卷积操作不能全部放在同一个GPU中运算,因此作者在2个GPU上运行,把feature maps分给这两个GPU分别进行处理,最后把这两个GPU的结果进行concatenate,作为一层的output。

直到2016年Deep Roots: Improving CNN Efficiency with Hierarchical Filter Groups的论文首次发表之前,绝大多数深度学习研究人员都将一组滤波器解释为一种工程手段。确实,这是发明卷积层的主要原因,但是如果减少卷积层的参数,准确性肯定会下降吗?

AlexNet的作者在2012年也指出了一个有趣的副作用:conv1过滤器很容易被解释,过滤器组似乎总是把conv1分成两个独立的、截然不同的任务:黑白过滤器和彩色过滤器。

分组卷积:Grouped convolution_第1张图片

AlexNet论文中没有明确指出的是分组卷积更重要的副作用,即它们能更好地学习表示。这似乎是一个很不寻常的现象,然而可以用一个简单的实验来证明的:在使用分组卷积和不使用分组卷积来训练AlexNet,并观察准确率/计算效率的差异。下图表明,不用分组卷积的AlexNet不仅效率更低(在参数和计算方面),而且准确性也稍差。

分组卷积:Grouped convolution_第2张图片

首先回顾一下普通的卷积,这里我们显式地显示通道数,输入为H×W×c1,共有c2个h×w×c1的滤波器,经过卷积后,输出为H×W×c2。

分组卷积:Grouped convolution_第3张图片

接下来是分组卷积,这里group=2,即图中的g=2,可以看出,输入的c1个通道,被分为2组,每组为H×W×c1/2,卷积滤波器变成了2组,每组c2/2个大小为h×w×c1/2的滤波器,所以共有c2个h×w×c1/2的滤波器,每组中的每个滤波器只与前一层的一半特征图进行卷积。因此滤波器的参数数量(黄色)正好是对应正常卷积层的一半。

分组卷积:Grouped convolution_第4张图片

举个例子:比如input大小为H×W×32,通道数c1=32,想要得到output的通道数c2=64,当group是1时,要经过64个3×3×32滤波器,那么该卷积层的参数个数是64×3×3×32,即64个3×3×32大小的滤波器,pytorch中写法如下。

如果把group设置为2,要么每个滤波器的channel=c1/g=32/2=16,需要64个3×3×16大小的滤波器,滤波器分成两组,每组32个3×3×16,input也被分成两组,每组的shape为H×W×16,每组做卷积运算,得到两组H×W×32,做拼接,得到H×W×64的output。参数个数是64×3×3×16,减少了一半。

如果把group设置为4,要么每个滤波器的channel=c1/g=32/4=8,需要64个3×3×8大小的滤波器,滤波器分成四组,每组16个3×3×8,input也被分成四组,每组的shape为H×W×8,每组做卷积运算,得到四组H×W×16,做拼接,得到H×W×64的output。参数个数是64×3×3×8,比分两组再减少了一半。

groups的值必须能被in_channels和out_channels整除,否则会报错。

分组卷积:Grouped convolution_第5张图片

分组卷积:Grouped convolution_第6张图片

 

 

你可能感兴趣的:(Deep,Learning)