【问题标题】:Custom convolution kernel and toroidal convolution in PyTorchPyTorch 中的自定义卷积核和环形卷积
【发布时间】:2018-11-11 03:24:21
【问题描述】:

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

  1. 我想用这样的固定内核创建一个卷积:

    000010000
    000010000
    100010001
    000010000
    000010000
    

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

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

    编辑添加:我看到有一个 open issue ,它也提供了一个次优的 workaround。所以,我想目前还没有“正确”的方法。

【问题讨论】:

    标签: padding convolution pytorch convolutional-neural-network


    【解决方案1】:
    1. 与torch.nn.conv2d()(实例化自己的可训练内核)不同,torch.nn.functional.conv2d() 将矩阵和内核都作为参数,因此您可以传递任何您想要的自定义内核。

    2. 正如@zou3519 在Github issue 中所建议的那样(链接到您自己提到的issue),您可以通过“在 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. (上一个) 在torch.nn.functional 模块中,torch.nn.functional.pad() 也可以作为参数mode=reflect,这就是你想要的我相信的(?)。您可以使用此方法在执行卷积之前手动填充输入矩阵。 (注意:您还拥有专门为通过反射进行固定 2D 填充而定制的 torch.nn.ReflectionPad2d 层)

    【讨论】:

    • 谢谢! 1. 我没有意识到可训练和不可训练之间的区别。这很有帮助。在 torch.nn.functional.conv2d() 中,如果我理解正确的话,filters 是自定义内核吗? 2. 环形不同于反射,参见例如github.com/pytorch/pytorch/issues/6124 - 它似乎是一个开放的请求,目前不可能,除非有解决方法。
    • 1.是的,将您的内核设为 filter(由参数weights 定义)。 2. 啊,确实,我的错。这个问题中提到的解决方法怎么样,即自己实现 2D 圆形填充,在卷积之前将其应用于矩阵? (我相应地更新了我的答案)
    • 是的,我在编辑中已链接到它——它似乎被视为一种解决方法。现在可以了。
    • 看起来torch.nn.functional.pad 现在支持circular 填充。
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2020-09-23
    • 2020-09-19
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多