簡體   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