卷积神经网络(CNN)中的群组

3

我发现了一个使用groups参数进行深度可分离卷积的PyTorch示例:链接:

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_channels”和“out_channels”必须都能被组整除。
所以我的问题是:
1. CNN中的“groups”是什么? 2. 在哪些情况下需要使用“groups”?
(我猜这更多是一般性问题,而非特定于PyTorch。)
1个回答

7

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

Groups 控制输入和输出之间的连接。in_channels 和 out_channels 必须同时被 groups 整除。例如:

当 groups=1 时,所有输入都会卷积到所有输出。

当 groups=2 时,该操作相当于将两个卷积层并排放置,每个层次级别都看到一半的输入通道,并生成一半的输出通道,随后这两个层次级别被连接起来。

当 groups=in_channels 时,每个输入通道与其自己的一组滤波器进行卷积,大小为: (floor(c_out / c_in))

如果您更喜欢数学描述,请先考虑 1x1 卷积,且 groups=1(默认值)。它本质上是在每个位置 (h, w) 上应用于所有通道f 的完整矩阵。将 groups 设置为更高的值使此矩阵成为一个对角块稀疏矩阵,其中块的数量等于 groups。当 groups=in_channels 时,您会得到一个对角矩阵。

现在,如果卷积核大于 1x1,您将保留上述通道级块稀疏性,但允许更大的空间卷积核。我建议重新阅读上面引用文档中的 groups=2 免责声明,它以另一种方式描述了这种情况,这可能有助于理解。希望这可以帮助您。

编辑: 为什么有人想要使用它?因为它不仅是模型的约束(先验),也是一种性能提升技术;有时两者都有。在链接的线程中,想要用NxN,groups=1的二维卷积替换成NxN,groups=n_features -> 1x1,groups=1序列卷积。数学上的结果是一个单独的卷积(因为卷积的卷积仍然是卷积),但使“乘积”卷积矩阵更加稀疏,从而减少了参数和计算复杂度。 似乎是一个更深入解释的合理资源。


谢谢你的回答!我认为我至少有了一个大致的想法,即使它还不是100%清楚。但是这样做的目的是什么?我什么时候需要使用多个组?使用多个组的好处是什么? - MBT
谢谢提供链接。虽然它与群组没有直接关系,但看到numpy的实现还是很有趣的。我仍然不太明白如何通过更多的群组来减少参数,但我认为我需要查看更多的资源才能完全理解这个过程。感谢您的帮助! - MBT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接