簡體   English   中英

如何將pytorch張量轉換為numpy數組?

[英]How to convert a pytorch tensor into a numpy array?

我有一個火炬張量

a = torch.randn(1, 2, 3, 4, 5)

我怎樣才能在 numpy 中得到它?

就像是

b = a.tonumpy()

輸出應該和我一樣

b = np.random.randn(1, 2, 3, 4, 5)

復制自pytorch 文檔

a = torch.ones(5)
print(a)

張量([1., 1., 1., 1., 1.])

b = a.numpy()
print(b)

[1. 1. 1. 1. 1.]


以下與@John 的討論:

如果張量在(或可以)在 GPU 上,或者如果它(或可以)需要 grad,可以使用

t.detach().cpu().numpy()

我建議僅根據需要丑化您的代碼。

您可以嘗試以下方法

1. torch.Tensor().numpy()
2. torch.Tensor().cpu().data.numpy()
3. torch.Tensor().cpu().detach().numpy()

另一種有用的方法:

a = torch(0.1, device='cuda')

a.cpu().data.numpy()

回答

數組(0.1,dtype=float32)

這是fastai core 的一個函數:

def to_np(x):
    "Convert a tensor to a numpy array."
    return apply(lambda o: o.data.cpu().numpy(), x)

可能使用來自預期 PyTorch 庫的函數是一個不錯的選擇。

如果您查看PyTorch Transformers內部,您會發現以下代碼

preds = logits.detach().cpu().numpy()

所以你可能會問為什么需要detach()方法? 當我們想從 AD 計算圖中分離張量時需要它。

還是要注意,CPU張量和numpy數組是相連的 它們共享相同的存儲:

import torch
tensor = torch.zeros(2)
numpy_array = tensor.numpy()
print('Before edit:')
print(tensor)
print(numpy_array)

tensor[0] = 10

print()
print('After edit:')
print('Tensor:', tensor)
print('Numpy array:', numpy_array)

輸出:

Before edit:
tensor([0., 0.])
[0. 0.]

After edit:
Tensor: tensor([10.,  0.])
Numpy array: [10.  0.]

第一個元素的值由張量和 numpy 數組共享。 在張量中將其更改為 10 也會在 numpy 數組中更改它。

這就是為什么我們需要小心,因為改變 numpy 數組也會改變 CPU 張量。

您可能會發現以下兩個函數很有用。

  1. 火炬.Tensor.numpy()
  2. torch.from_numpy()

有時候,如果有“應用”漸變,你首先得把.detach()的函數之前.numpy()函數。

loss = loss_fn(preds, labels)
print(loss.detach().numpy())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM