繁体   English   中英

NumPy 转换中的 PyTorch 就地运算符问题

[英]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.]

PyTorch 文档

将火炬张量转换为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM