![](/img/trans.png)
[英]How to convert TensorFlow tensor to PyTorch tensor without converting to Numpy array?
[英]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 張量。
您可能會發現以下兩個函數很有用。
有時候,如果有“應用”漸變,你首先得把.detach()
的函數之前.numpy()
函數。
loss = loss_fn(preds, labels)
print(loss.detach().numpy())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.