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

时间:2019-01-19 14:21:22

标签: python numpy pytorch

我有一个火炬张量

List<ChildClass>

如何在numpy中获取它?

类似

IEnumerable<Baseclass>

输出应该和我做的一样

Baseclass

6 个答案:

答案 0 :(得分:3)

您可以尝试以下方式

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

答案 1 :(得分:2)

http://www.richardvanbergen.com/复制:

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

张量([1.,1.,1.,1.,1。])

b = a.numpy()
print(b)
  

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

这是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内查看,您会发现以下code

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张量。

答案 4 :(得分:0)

另一种有用的方法:

a = torch(0.1, device: cuda)

a.cpu().data.numpy()

Answer: array(0.1, dtype=float32)

答案 5 :(得分:0)

有时,如果存在“已应用”的渐变,则必须首先将.detach()函数放在.numpy()函数之前。

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