如何将 torch 张量转换为 numpy?
从 pytorch 文档复制:
a = torch.ones(5)
print(a)
张量([1., 1., 1., 1., 1.])
b = a.numpy()
print(b)
[1. 1.1.1.1.]
根据以下与@John 的讨论:
如果张量在(或可以)在 GPU 上,或者如果它(或可以)需要梯度,则可以使用
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())
x = torch.tensor([0.1,0.32], device='cuda:0')
x.detach().cpu().data.numpy()
对我来说这有效:
rz = 浮点数(3.)
lossT3 = loss.item() * 3.5
lossT3p = loss.tolist()
打印(类型(lossT3),类型(lossT3p))
参见 Daniel Voigt Godoy,2024 年,DL with Pytorch 第一卷,第 102 页