卷积神经网络 / CNN 中的组

blu*_*nox 2 neural-network deep-learning conv-neural-network pytorch

使用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
Run Code Online (Sandbox Code Playgroud)

我之前没有在 CNN 中看到任何组的使用。就这一点而言,文档也有点稀疏:

groups控制输入​​和输出之间的连接。 in_channels并且out_channels都必须可以被组整除。

所以我的问题是:

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

(我这更笼统,而不是 PyTorch 特定的。)

Jat*_*aki 5

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

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

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

在组 = 2 时,该操作等效于并排放置两个 conv 层,每个层看到一半的输入通道,并产生一半的输出通道,然后将两者连接起来。

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

如果您更喜欢更数学化的描述,请首先考虑1x1groups=1(默认)的卷积。它本质上是一个完整的矩阵,应用于f每个(h, w)位置的所有通道。设置groups为更高的值会将这个矩阵变成块数等于 的对角块稀疏矩阵groups。随着groups=in_channels你得到一个对角矩阵。

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

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