卷积神经网络/ CNN中的组

时间:2019-03-12 13:52:56

标签: neural-network deep-learning conv-neural-network pytorch

我遇到了这个PyTorch example for depthwise separable convolutions using the groups parameter

class depthwise_separable_conv(nn.Module):
    def __init__(self, nin, nout):
        super(depthwise_separable_conv, self).__init__()
        self.depthwise = nn.Conv2d(nin, nin, kernel_size=3, padding=1, groups=nin)
        self.pointwise = nn.Conv2d(nin, nout, kernel_size=1)

    def forward(self, x):
        out = self.depthwise(x)
        out = self.pointwise(out)
        return out

我以前没有在CNN中看到任何组的用法。就此而言,文档也有点稀疏:

  

groups控制输入和输出之间的连接。   in_channelsout_channels必须都可以被组整除。

所以我的问题是:

  • CNN中的组是什么?
  • 在哪些情况下需要使用组?

(我猜是 ,这不是一般的PyTorch,而是一般情况。)

1 个答案:

答案 0 :(得分:1)

也许您正在查找文档的旧版本。 nn.Conv2d的1.0.1文档对此进行了扩展。

  

组控制输入和输出之间的连接。 in_channels和out_channels必须都可以被组整除。例如,

     

在groups = 1时,所有输入都被卷积为所有输出。

     

在groups = 2时,该操作等效于并排设置两个conv层,每个conv层看到一半的输入通道,并产生一半的输出通道,然后将它们都串联起来。

     

在groups = in_channels中,每个输入通道都与自己的一组过滤器卷积,其大小为(floor(c_out / c_in)

如果您希望使用更数学的描述,请先考虑使用1x1的{​​{1}}卷积(默认)。它实际上是在每个groups=1位置的所有通道f上应用的完整矩阵。将(h, w)设置为更高的值会将该矩阵变成对角线稀疏矩阵,其块数等于groups。使用groups,您会得到一个对角矩阵。

现在,如果内核大于groups=in_channels,则可以像上面一样保留通道级块稀疏性,但可以使用更大的空间内核。我建议重读上面引用的文档中的1x1豁免,它以另一种方式准确地描述了这种情况,可能有助于理解。希望这会有所帮助。

编辑:为什么有人要使用它?作为模型的约束(在先)或作为性能改进技术;有时两者都有。在链接的线程中,其想法是用groups=2-> NxN, groups=1卷积的序列替换NxN, groups=n_features 2d转换。从数学上讲,这会导致单个卷积(因为卷积仍然是卷积),但是会使“乘积”卷积矩阵更加稀疏,从而减少了参数数量和计算复杂性。 This似乎是更合理的解释资源。