我遇到了这个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特定的。)

最佳答案

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

组控制输入和输出之间的连接。 in_channels和out_channels必须都可以被组整除。例如,
在组= 1时,所有输入都卷积为所有输出。
在groups = 2时,该操作等效于并排设置两个conv层,每个conv层看到一半的输入通道,并产生一半的输出通道,并且随后都将它们级联。
在groups = in_channels时,每个输入通道都与自己的一组过滤器卷积,其大小为(floor(c_out / c_in)

如果您希望使用更数学的描述,请先考虑使用1x1进行groups=1卷积(默认)。它实际上是在每个f位置跨所有通道(h, w)应用的完整矩阵。将groups设置为更高的值会将此矩阵变成对角线稀疏矩阵,其块数等于groups。使用groups=in_channels,您将得到一个对角矩阵。
现在,如果内核大于1x1,则保留上述通道级块稀疏性,但允许使用更大的空间内核。我建议重读上面引用的文档中的groups=2豁免,它以另一种方式准确地描述了这种情况,可能有助于理解。希望这可以帮助。
编辑:为什么有人要使用它?作为模型的约束(在先)或作为性能改进技术;有时两者都有。在链接的线程中,其想法是用NxN, groups=1-> NxN, groups=n_features卷积的序列替换1x1, groups=1 2d conv。从数学上讲,这会导致单个卷积(因为卷积仍然是卷积),但是会使“乘积”卷积矩阵更加稀疏,从而减少了参数数量和计算复杂性。 This似乎是更深入地解释这一点的合理资源。

关于neural-network - 卷积神经网络/CNN中的组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55123161/

10-16 09:10