卷积层中的 group 参数理解


卷积层中 group 参数理解


Convolution 层的参数中有一个group参数,其意思是将对应的输入通道与输出通道数进行分组, 默认值为1, 也就是说默认输出输入的所有通道各为一组. 比如输入数据大小为
90x100x100x32 90是数据批大小 100x100是图像数据shape,32是通道数,要经过一个3x3x48的卷积,group默认是1,就是全连接的卷积层,
如果group是2,那么对应要将输入的32个通道分成2个16的通道,将输出的48个通道分成2个24的通道。对输出的2个24的通道,第一个24通道与输入的第一个16通道进行全卷积,第二个24通道与输入的第二个16通道进行全卷积。极端情况下,输入输出通道数相同,比如为24,group大小也为24,那么每个输出卷积核,只与输入的对应的通道进行卷积。
caffe官网原话是:
group (g) [default 1]: If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated into g groups, and the i-th output group channels will be only connected to the i-th input group channels.

mobilenet V1 是基于 tensorflow 实现的,如果现在需要利用 caffe 实现 depthwise separable convolution ,应该怎么办呢?
解决方法:使用卷积参数group实现。
group对输入输出对应分组,默认为1,也就是说默认输出输入的所有通道各为一组。输出一个通道由输入所有通道进行卷积运算。如果我们把卷积group等于输入通道,输出通道等于输入通道便轻松实现了depthwize separable convolution结构。


总结


贾扬清在 https://www.zhihu.com/question/26871787 里说 group 没什么用,只是为了保证向下兼容性。
不过,caffe 在实现用反卷积做上采样的时候,用 group 参数进行了加速,具体见下面的 PR 和 issue:

https://github.com/BVLC/caffe/pull/2213

Please note that I assume you specify group: {{num_in}} in convolution_param. That results channel-wise convolution, and it is more efficient for both memory and computation.
https://github.com/BVLC/caffe/issues/3906
This filler is intended to be used with grouped convolution that makes it effectively diagonal as you outlined.


参考文章


[1]. 卷积参数group的使用
[2]. caffe group参数理解
[3]. 为什么depthwise convolution 比 convolution更加耗时?
[4]. Depthwise卷积与Pointwise卷积
[5]. caffe框架中 LRN层有什么作用

你可能感兴趣的:(深度学习)