[英]PyTorch in-place operator issue in NumPy conversion
我将 PyTorch Tensor
转换为 NumPy ndarray
,如下所示,“ a
”和“ b
”都有不同的 ID,因此它们指向不同的内存位置。
我知道在PyTorch下划线表示就地操作, a.add_(1)
不改变的存储位置a
,但为什么它的阵列的内容改变b
(由于ID的区别)?
import torch
a = torch.ones(5)
b = a.numpy()
a.add_(1)
print(id(a), id(b))
print(a)
print(b)
结果:
139851293933696 139851293925904
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
将火炬张量转换为 NumPy 数组,反之亦然,这是轻而易举的。 Torch Tensor 和 NumPy 数组将共享它们的底层内存位置,改变一个将改变另一个。
但为什么? (他们有不同的ID,所以必须是独立的):(
如果您使用numpy.ndarray.__array_interface__
和torch.Tensor.data_ptr()
,您可以找到它们的data_array的内存位置。
a = torch.ones(5)
b = a.numpy()
a.add_(1)
print(b.__array_interface__)
# > {'data': (1848226926144, False),
# 'strides': None,
# 'descr': [('', '<f4')],
# 'typestr': '<f4',
# 'shape': (5,),
# 'version': 3}
print(a.data_ptr())
# > 1848226926144
a.data_ptr() == b.__array_interface__["data"][0]
# > True
数组和张量共享相同的 data_array。
我们可以合理地得出结论, torch.Tensor.numpy()
方法通过将引用传递给其 data_array 来从 Tensor 创建一个 numpy 数组。
b[0] = 4
print(a)
# > tensor([4., 2., 2., 2., 2.])
我的猜测是 b 是指向 a 的指针,而 id() 返回的内存地址正是它们存储在内存中的位置。 尝试使用copy.deepcopy()从 b 创建 a ,这应该使它们完全分开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.