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

时间:2018-06-01 03:33:51

标签: padding convolution pytorch convolutional-neural-network

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

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

    000010000
    000010000
    100010001
    000010000
    000010000
    

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

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

    编辑添加:我看到有一个open issue,这也提供了次优workaround。所以,我认为没有“正确”的方式来做到这一点。

1 个答案:

答案 0 :(得分:3)

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

  2. 正如@zou3519Github issue所建议的那样(与您自己提及的issue相关联),您可以通过“重复”来实现自己的2D圆形填充在nxn网格中张紧,然后裁剪出你需要的部分。“:

  3. 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图层)