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