关于pytorch copy a tensor的一些奇怪问题

Some strange questions about pytorch copy a tensor

我对pytorch的共享内存机制有点迷惑

a = torch.tensor([[1,0,1,0],
                                   [0,1,1,0]])
b = a
b[b == 1] = 0

很容易知道ab会同时变成tensor([[0,0,0,0],[0,0,0,0]]),因为ab共享同一个内存。当我将代码更改为

a = torch.tensor([[1,0,1,0],
                                   [0,1,1,0]])
b = a
b = b - 1

b变成了tensor([[0,-1,0,-1],[-1,0,0,-1]]),但是a还是torch.tensor([[1,0,1,0],[0,1,1,0]])
ab 共享同一内存。为什么 b 变了,而 a 没变?

在您的第二个示例中,ab 共享相同的引用,但 b = b - 1 实际上是一个副本。您不会影响 b 的基础数据(也不会影响 a 的基础数据,因为它们是相同的)。

  • 你可以这样看:

    >>> a = torch.tensor([[1,0,1,0],
                          [0,1,1,0]])
    >>> b1 = a
    >>> b2 = b1 - 1
    

    比较它们指向数据缓冲区的指针:

    >>> a.data_ptr() == b1.data_ptr()
    True
    
    >>> b1.data_ptr() == b2.data_ptr()
    False
    
  • 如果事实上,你就地操作b,你当然也会改变a

    >>> a = torch.tensor([[1,0,1,0],
                          [0,1,1,0]])
    >>> b1 = a
    >>> b1.sub_(1)
    

    那你还没有复制:

    >>> a.data_ptr() == b1.data_ptr()
    True