【问题标题】:PyTorch Circular Padding in one Dimension一维中的 PyTorch 圆形填充
【发布时间】: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 内存。 还有其他方法吗?

【问题讨论】:

    标签: python machine-learning pytorch torch


    【解决方案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]]])
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2020-04-27
      • 1970-01-01
      • 2020-04-11
      • 2016-05-24
      相关资源
      最近更新 更多