如何将 pytorch 张量转换为 numpy 数组?

问题描述 投票:0回答:8

如何将 torch 张量转换为 numpy?

python numpy pytorch
8个回答
43
投票

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()

我建议仅根据需要对代码进行丑化。


12
投票

您可以尝试以下方法

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

5
投票

另一个有用的方法:

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

a.cpu().data.numpy()

回答

数组(0.1,dtype=float32)


4
投票

这是来自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
投票

您可能会发现以下两个功能很有用。

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

1
投票

有时,如果有“应用”渐变,您首先必须将

.detach()
函数放在
.numpy()
函数之前。

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

0
投票
x = torch.tensor([0.1,0.32], device='cuda:0')

x.detach().cpu().data.numpy()

0
投票

对我来说这有效:

rz = 浮点数(3.)

lossT3 = loss.item() * 3.5

lossT3p = loss.tolist()

打印(类型(lossT3),类型(lossT3p))

参见 Daniel Voigt Godoy,2024 年,DL with Pytorch 第一卷,第 102 页

© www.soinside.com 2019 - 2024. All rights reserved.