PyTorch 中的自定义卷积内核和环形卷积



我想用 PyTorch 卷积做两件事,这些事情在文档或代码中没有提到:

  1. 我想创建一个带有固定内核的卷积,如下所示:

    000010000
    000010000
    100010001
    000010000
    000010000
    

    我猜水平方面就像扩张,但垂直部分是不同的。我看到膨胀可以作为代码中的参数使用,但它必须是标量或单元素元组(不是每个维度一个元素(,所以我认为它不能在这里做我想要的。

  2. 我希望我的卷积像环形线圈一样"环绕",而不是使用填充。

    编辑以添加:我看到有一个未解决的问题,这也提供了一种次优的解决方法。所以,我想还没有"正确"的方法可以做到这一点。

  1. torch.nn.conv2d()(实例化自己的可训练内核(不同,torch.nn.functional.conv2d()将矩阵和内核都作为参数,因此您可以传递所需的任何自定义内核。

  2. 正如 @zou3519 在 Github 问题(链接到您自己提到的问题(中所建议的那样,您可以通过"在nxn 网格中重复张量,然后裁剪出您需要的部分"来实现自己的 2D 圆形填充。

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

    (
  1. previous(torch.nn.functional模块中,torch.nn.functional.pad()也可以作为参数mode=reflect,我相信这就是你想要的(?您可以使用此方法在执行卷积之前手动填充输入矩阵。(注意:您还拥有专门为通过反射固定 2D 填充量身定制的torch.nn.ReflectionPad2d图层(

最新更新