【问题标题】:Groups in Convolutional Neural Network / CNN卷积神经网络 / CNN 中的组
【发布时间】:2019-08-03 00:35:29
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    在 groups=2 时,该操作相当于有两个并排的卷积层,每个卷积层看到一半的输入通道,产生一半的输出通道,然后将两者连接起来。

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

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

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

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

    【讨论】:

    • 感谢您的回答!我想我至少知道它是如何工作的,即使它仍然不是 100% 清楚。但是这样做的目的是什么,我什么时候要使用多个组?使用多个组有什么好处?
    • 感谢您的链接。虽然它与组没有直接关系,但看到 numpy 实现仍然很有趣。我仍然不太了解如何通过更多组来减少参数,但我认为我需要查看更多资源才能完全了解这是如何发生的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 2020-05-26
    • 2018-06-15
    • 2017-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    相关资源
    最近更新 更多