PyTorch 中的自定义卷积核和环形卷积
Custom convolution kernel and toroidal convolution in PyTorch
我想用 PyTorch 卷积做两件事 documentation 或代码中没有提到:
我想像这样创建一个具有固定内核的卷积:
000010000
000010000
100010001
000010000
000010000
我猜水平方面就像膨胀,但垂直部分不同。我看到膨胀可以作为代码中的参数使用,但它必须是标量或单元素元组(不是每个维度一个元素),所以我认为它不能在这里做我想要的。
我希望我的卷积像环形一样 "wrap around",而不是使用填充。
编辑添加: 我看到有一个 open issue for this , which also provides a suboptimal workaround。所以,我想目前还没有 "right" 的方法。
不像 torch.nn.conv2d()
(which instantiates its own trainable kernel), torch.nn.functional.conv2d()
将矩阵和内核都作为参数,因此您可以传递任何您想要的自定义内核。
正如您自己提到的 @zou3519 in a Github issue (linked to the issue 所建议的那样),您可以通过“在 nxn 网格中重复张量,然后裁剪出您需要的部分。":
def circular_pad_2d(x, pad=(1, 1)):
# Snipped by @zou3519 (https://github.com/zou3519)
return x.repeat(*x_shape[:2])[
(x.shape[0]-pad[0]):(2*x.shape[0]+pad[0]),
(x.shape[1]-pad[1]):(2*x.shape[1]+pad[1])
]
# Example:
x = torch.tensor([[1,2,3],[4,5,6]])
y = circular_pad_2d(x, pad=(2, 3))
print(y)
# 1 2 3 1 2 3 1 2 3
# 4 5 6 4 5 6 4 5 6
# 1 2 3 1 2 3 1 2 3
# 4 5 6 4 5 6 4 5 6
- (previous) 同样在
torch.nn.functional
模块中,torch.nn.functional.pad()
can take as parameter mode=reflect
, which is what you want I believe (?). You could use this method to manually pad your input matrix before performing the convolution. (note: you also have the torch.nn.ReflectionPad2d
层专门为固定的 2D 填充量身定制通过反射)
我想用 PyTorch 卷积做两件事 documentation 或代码中没有提到:
我想像这样创建一个具有固定内核的卷积:
000010000 000010000 100010001 000010000 000010000
我猜水平方面就像膨胀,但垂直部分不同。我看到膨胀可以作为代码中的参数使用,但它必须是标量或单元素元组(不是每个维度一个元素),所以我认为它不能在这里做我想要的。
我希望我的卷积像环形一样 "wrap around",而不是使用填充。
编辑添加: 我看到有一个 open issue for this , which also provides a suboptimal workaround。所以,我想目前还没有 "right" 的方法。
不像
torch.nn.conv2d()
(which instantiates its own trainable kernel),torch.nn.functional.conv2d()
将矩阵和内核都作为参数,因此您可以传递任何您想要的自定义内核。正如您自己提到的 @zou3519 in a Github issue (linked to the issue 所建议的那样),您可以通过“在 nxn 网格中重复张量,然后裁剪出您需要的部分。":
def circular_pad_2d(x, pad=(1, 1)):
# Snipped by @zou3519 (https://github.com/zou3519)
return x.repeat(*x_shape[:2])[
(x.shape[0]-pad[0]):(2*x.shape[0]+pad[0]),
(x.shape[1]-pad[1]):(2*x.shape[1]+pad[1])
]
# Example:
x = torch.tensor([[1,2,3],[4,5,6]])
y = circular_pad_2d(x, pad=(2, 3))
print(y)
# 1 2 3 1 2 3 1 2 3
# 4 5 6 4 5 6 4 5 6
# 1 2 3 1 2 3 1 2 3
# 4 5 6 4 5 6 4 5 6
- (previous) 同样在
torch.nn.functional
模块中,torch.nn.functional.pad()
can take as parametermode=reflect
, which is what you want I believe (?). You could use this method to manually pad your input matrix before performing the convolution. (note: you also have thetorch.nn.ReflectionPad2d
层专门为固定的 2D 填充量身定制通过反射)