一维中的 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 圆形填充的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch中的Conv1d()函数

详解pytorch CNN操作

在Pytorch中训练一维CNN

pytorch中的torch.cat()矩阵拼接的用法及理解

Pytorch 中的 dim

pytorch 函数理解