【问题标题】:How to do a "element by element in-place inverse" with pytorch?如何使用 pytorch 进行“逐个元素就地反转”?
【发布时间】:2019-04-20 09:34:21
【问题描述】:

Given 是一个数组a:

a = np.arange(1, 11, dtype = 'float32')

使用 numpy,我可以做到以下几点:

np.divide(1.0, a, out = a)

导致:

array([1.        , 0.5       , 0.33333334, 0.25      , 0.2       ,
       0.16666667, 0.14285715, 0.125     , 0.11111111, 0.1       ],
      dtype=float32)

假设 a 是一个 pytorch 张量,则以下操作失败:

torch.div(1.0, a, out = a)

div的第一个参数预计是匹配长度/形状的张量。

如果我用一个数组b 替换1.0,它的长度等于a 的长度,它可以工作。缺点是我必须为b 分配内存。我还可以执行a = 1.0 / a 之类的操作,这将再次分配额外的(临时)内存。

如何有效地“就地”执行此操作(无需分配额外内存),最好是通过广播?

【问题讨论】:

    标签: python python-3.x numpy pytorch


    【解决方案1】:

    Pytorch 遵循使用_ 进行就地操作的约定。 例如

    add -> add_  # in-place equivalent
    div -> div_  # in-place equivalent
    etc
    

    逐个元素就地反转。

    >>> a = torch.arange(1, 11, dtype=torch.float32) 
    >>> a.pow_(-1) 
    >>> a
    >>> tensor([1.0000, 0.5000, 0.3333, 0.2500, 0.2000, 0.1667, 0.1429, 0.1250, 0.1111, 0.1000])
    

    >>> a = torch.arange(1, 11, dtype=torch.float32) 
    >>> a.div_(a ** a) 
    >>> a
    >>> tensor([1.0000, 0.5000, 0.3333, 0.2500, 0.2000, 0.1667, 0.1429, 0.1250, 0.1111, 0.1000])
    

    【讨论】:

    • 酷,谢谢。就地方法非常方便。不过有一个问题:虽然我知道x^-1 等于1/x,但我缺少一种应用广播的方法。如果我有一个标量b 而不是1,我必须进行“除法”和乘法运算,即x.pow_(-1); x.mul_(b)。这对我来说似乎很奇怪......
    • 是的,x.pow_(-1).mul_(b) 确实有点奇怪。 torch.div 现在接受 (tensor, scalar) 或 (tensor, tensor) 而不是 (scalar, tensor),这会让事情变得容易得多。
    • 再次感谢 - 虽然我忽略了一些事情。
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2019-01-29
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多