jmm*_*mcd 4 padding convolution pytorch convolutional-neural-network
我想用 PyTorch 卷积做两件事,文档或代码中没有提到:
我想用这样的固定内核创建卷积:
000010000
000010000
100010001
000010000
000010000
Run Code Online (Sandbox Code Playgroud)
我猜,水平方面就像膨胀,但垂直部分是不同的。我看到 dilation 可以作为代码中的参数使用,但它必须是标量或单元素元组(不是每个维度一个元素),所以我认为它不能在这里做我想做的事。
我希望我的卷积像环形一样“环绕”,而不是使用填充。
与torch.nn.conv2d()
(实例化其自己的可训练内核)不同,torch.nn.functional.conv2d()
它将矩阵和内核作为参数,因此您可以将任何自定义内核传递给它。
正如@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
Run Code Online (Sandbox Code Playgroud)
torch.nn.functional
模块中,torch.nn.functional.pad()
也可以作为参数mode=reflect
,我相信这是你想要的(?)。您可以使用此方法在执行卷积之前手动填充输入矩阵。(注意:您还拥有torch.nn.ReflectionPad2d
专为反射固定 2D 填充量身定制的图层) 归档时间: |
|
查看次数: |
2925 次 |
最近记录: |