关于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
很容易知道a
和b
会同时变成tensor([[0,0,0,0],[0,0,0,0]])
,因为a
和b
共享同一个内存。当我将代码更改为
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]])
。
a
和 b
共享同一内存。为什么 b
变了,而 a
没变?
在您的第二个示例中,a
和 b
共享相同的引用,但 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
我对pytorch的共享内存机制有点迷惑
a = torch.tensor([[1,0,1,0],
[0,1,1,0]])
b = a
b[b == 1] = 0
很容易知道a
和b
会同时变成tensor([[0,0,0,0],[0,0,0,0]])
,因为a
和b
共享同一个内存。当我将代码更改为
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]])
。
a
和 b
共享同一内存。为什么 b
变了,而 a
没变?
在您的第二个示例中,a
和 b
共享相同的引用,但 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