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

Posted

技术标签:

【中文标题】如何将 pytorch 张量转换为 numpy 数组?【英文标题】:How to convert a pytorch tensor into a numpy array? 【发布时间】:2019-06-13 13:09:16 【问题描述】:

我有一个火炬张量

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

如何在 numpy 中获取它?

类似

b = a.tonumpy()

输出应该和我做的一样

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

【问题讨论】:

【参考方案1】:

复制自pytorch doc:

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

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

【讨论】:

在我的torch副本中最好把a.detach().cpu().numpy() @LarsEricson 为什么? 像这样将张量转换为 NumPy 会有什么复杂性? @Sid 我相信o(1) 在大多数情况下,但并非总是如此。见github.com/pytorch/pytorch/blob/master/torch/csrc/utils/… 和numpy.org/devdocs/reference/c-api/… 这是真的,尽管我相信如果没有必要,两者都是无用的,所以过度杀伤只是在打字中,如果编写一个接受未知来源的张量的函数,则有一些价值。对于您对拉斯的原始问题的误解,我深表歉意。总而言之,detachcpu 并非在所有情况下都是必需的,但在最常见的情况下可能是必需的(因此值得一提)。 numpy 在任何情况下都是必要的,但它本身通常是不够的。任何未来的人都应该参考上面链接的问题或 pytorch 文档以获取更多信息。【参考方案2】:

您可以尝试以下方法

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

【讨论】:

【参考方案3】:

另一个有用的方法:

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 内部,您会发现这个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 张量。

【讨论】:

【参考方案5】:

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

    torch.Tensor.numpy() torch.from_numpy()

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于如何将 pytorch 张量转换为 numpy 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串列表转换为pytorch中的张量?

将张量变量(非常数)转换为 numpy 数组? [复制]

Pytorch 张量到 numpy 数组

PyTorch张量类型转换

Pytorch张量,如何切换通道位置 - 运行时错误

一文读懂PyTorch张量基础(附代码)