我遇到了这个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_channels
和out_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/