代码之家  ›  专栏  ›  技术社区  ›  s-m-e

如何使用pytorch进行“逐元素就地反演”?

  •  2
  • s-m-e  · 技术社区  · 7 年前

    给定的是一个数组 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)
    

    假设 而是Pytork张量,下面的操作 失败 :

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

    div 应为长度/形状匹配的张量。

    如果我替换 1.0 b 填充一个,其长度等于 A. ,它起作用了。不利的一面是我必须分配内存 . 我也可以做类似的事情 a = 1.0 / a 这将再次分配额外(临时)内存。

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

    1 回复  |  直到 7 年前
        1
  •  9
  •   srmsoumya    7 年前

    Pytork遵循使用的惯例 _ 用于就地操作。

    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])