一维中的 PyTorch 圆形填充
Posted
技术标签:
【中文标题】一维中的 PyTorch 圆形填充【英文标题】:PyTorch Circular Padding in one Dimension 【发布时间】:2021-01-29 18:24:46 【问题描述】:对于卷积,我想在一维应用圆形填充,在所有其他维度应用零填充。我该怎么做?
对于卷积,有 28 个通道,并且数据在球形箱中描述。半径乘以 20 个容器,极地乘以 20 个容器,倾角乘以 20 个容器。 圆形填充仅应用于倾斜。
小例子
# Example:
x = torch.tensor([[1,2,3],
[4,5,6],
[7,8,9]])
y = sphere_pad(x, pad=(0, 1))
# y is now tensor([[3, 1, 2, 3, 1],
# [6, 4, 5, 6, 4],
# [9, 7, 8, 9, 7]])
我已尝试申请
def sphere_pad(x, pad=(1,1)):
return x.repeat(*x.shape)[
(x.shape[0]-pad[0]):(2*x.shape[0]+pad[0]),
(x.shape[1]-pad[1]):(2*x.shape[1]+pad[1])]
然后应用具有正常零填充的卷积(并且在最后一维中没有填充)。 这适用于一个小例子,但这种方法超出了实际问题大小的 GPU 内存。 还有其他方法吗?
【问题讨论】:
【参考方案1】:使用 numpy,您可以进行 wrap
填充,以便数组沿第二个轴包裹:
np.pad(x, ((0,0),(1,1)), mode='wrap')
array([[3, 1, 2, 3, 1],
[6, 4, 5, 6, 4],
[9, 7, 8, 9, 7]])
【讨论】:
谢谢你这对第一层非常有效,但我想知道这是否也可以用于其他层的 autograd?【参考方案2】:此功能由#17240 添加。但是,由于某些(奇怪的)原因,圆形填充仅受 3D、4D 和 5D 张量支持。如果你已经有一个 2D 张量,你需要在直接在 pytorch 中将其转换为 3D 之前:
>>> a = torch.randint(0, 9, (1, 3, 3))
>>> a
tensor([[[4, 2, 5],
[2, 2, 8],
[3, 2, 8]]])
>>> F.pad(a, (1, 1), mode='circular')
tensor([[[5, 4, 2, 5, 4],
[8, 2, 2, 8, 2],
[8, 3, 2, 8, 3]]])
【讨论】:
以上是关于一维中的 PyTorch 圆形填充的主要内容,如果未能解决你的问题,请参考以下文章