如何在 PyTorch conv2d 函数中使用组参数
How to use groups parameter in PyTorch conv2d function
我正在尝试在 PyTorch 中计算每个通道的梯度图像。为此,我想在图像的每个通道上使用 Sobel 滤波器执行标准的 2D 卷积。我为此使用 torch.nn.functional.conv2d
函数
在我下面的最低工作示例代码中,出现错误:
import torch
import torch.nn.functional as F
filters = torch.autograd.Variable(torch.randn(1,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1)
RuntimeError: Given groups=1, weight[1, 1, 3, 3], so expected
input[1, 3, 10, 10] to have 1 channels, but got 3 channels instead
这表明 groups
需要为 3。但是,当我设置 groups=3
时,我得到一个不同的错误:
import torch
import torch.nn.functional as F
filters = torch.autograd.Variable(torch.randn(1,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1, groups=3)
RuntimeError: invalid argument 4: out of range at
/usr/local/src/pytorch/torch/lib/TH/generic/THTensor.c:440
当我在 THTensor class 中检查该代码片段时,它指的是一堆维度检查,但我不知道我哪里出错了。
这个错误是什么意思?如何使用此 conv2d
函数执行预期的卷积?我相信我误解了 groups
参数。
如果您想应用每通道卷积,那么您的 out-channel
应该与您的 in-channel
相同。这是预料之中的,考虑到您的每个输入通道都会创建一个与其对应的单独输出通道。
简而言之,这会起作用
import torch
import torch.nn.functional as F
filters = torch.autograd.Variable(torch.randn(3,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1, groups=3)
然而,大小为 (2, 1, 3, 3)
或 (1, 1, 3, 3)
的过滤器将不起作用。
此外,您还可以使 out-channel
成为 in-channel
的倍数。这适用于您希望每个输入通道都有多个卷积滤波器的情况。
但是,这只有在它是倍数时才有意义。如果不是,那么 pytorch 会回落到最接近的倍数,一个小于您指定的数字。这再次是预期的行为。例如,大小为 (4, 1, 3, 3)
或 (5, 1, 3, 3)
的过滤器将导致大小为 3 的 out-channel
。
我正在尝试在 PyTorch 中计算每个通道的梯度图像。为此,我想在图像的每个通道上使用 Sobel 滤波器执行标准的 2D 卷积。我为此使用 torch.nn.functional.conv2d
函数
在我下面的最低工作示例代码中,出现错误:
import torch
import torch.nn.functional as F
filters = torch.autograd.Variable(torch.randn(1,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1)
RuntimeError: Given groups=1, weight[1, 1, 3, 3], so expected input[1, 3, 10, 10] to have 1 channels, but got 3 channels instead
这表明 groups
需要为 3。但是,当我设置 groups=3
时,我得到一个不同的错误:
import torch
import torch.nn.functional as F
filters = torch.autograd.Variable(torch.randn(1,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1, groups=3)
RuntimeError: invalid argument 4: out of range at /usr/local/src/pytorch/torch/lib/TH/generic/THTensor.c:440
当我在 THTensor class 中检查该代码片段时,它指的是一堆维度检查,但我不知道我哪里出错了。
这个错误是什么意思?如何使用此 conv2d
函数执行预期的卷积?我相信我误解了 groups
参数。
如果您想应用每通道卷积,那么您的 out-channel
应该与您的 in-channel
相同。这是预料之中的,考虑到您的每个输入通道都会创建一个与其对应的单独输出通道。
简而言之,这会起作用
import torch
import torch.nn.functional as F
filters = torch.autograd.Variable(torch.randn(3,1,3,3))
inputs = torch.autograd.Variable(torch.randn(1,3,10,10))
out = F.conv2d(inputs, filters, padding=1, groups=3)
然而,大小为 (2, 1, 3, 3)
或 (1, 1, 3, 3)
的过滤器将不起作用。
此外,您还可以使 out-channel
成为 in-channel
的倍数。这适用于您希望每个输入通道都有多个卷积滤波器的情况。
但是,这只有在它是倍数时才有意义。如果不是,那么 pytorch 会回落到最接近的倍数,一个小于您指定的数字。这再次是预期的行为。例如,大小为 (4, 1, 3, 3)
或 (5, 1, 3, 3)
的过滤器将导致大小为 3 的 out-channel
。