我遇到了这个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
必须都可以被组整除。
所以我的问题是:
(我猜是 ,这不是一般的PyTorch,而是一般情况。)
答案 0 :(得分:1)
也许您正在查找文档的旧版本。 nn.Conv2d
的1.0.1文档对此进行了扩展。
组控制输入和输出之间的连接。 in_channels和out_channels必须都可以被组整除。例如,
在groups = 1时,所有输入都被卷积为所有输出。
在groups = 2时,该操作等效于并排设置两个conv层,每个conv层看到一半的输入通道,并产生一半的输出通道,然后将它们都串联起来。
在groups = in_channels中,每个输入通道都与自己的一组过滤器卷积,其大小为(
floor(c_out / c_in)
)
如果您希望使用更数学的描述,请先考虑使用1x1
的{{1}}卷积(默认)。它实际上是在每个groups=1
位置的所有通道f
上应用的完整矩阵。将(h, w)
设置为更高的值会将该矩阵变成对角线稀疏矩阵,其块数等于groups
。使用groups
,您会得到一个对角矩阵。
现在,如果内核大于groups=in_channels
,则可以像上面一样保留通道级块稀疏性,但可以使用更大的空间内核。我建议重读上面引用的文档中的1x1
豁免,它以另一种方式准确地描述了这种情况,可能有助于理解。希望这会有所帮助。
编辑:为什么有人要使用它?作为模型的约束(在先)或作为性能改进技术;有时两者都有。在链接的线程中,其想法是用groups=2
-> NxN, groups=1
卷积的序列替换NxN, groups=n_features
2d转换。从数学上讲,这会导致单个卷积(因为卷积仍然是卷积),但是会使“乘积”卷积矩阵更加稀疏,从而减少了参数数量和计算复杂性。 This似乎是更合理的解释资源。