如何将 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/…
这是真的,尽管我相信如果没有必要,两者都是无用的,所以过度杀伤只是在打字中,如果编写一个接受未知来源的张量的函数,则有一些价值。对于您对拉斯的原始问题的误解,我深表歉意。总而言之,detach
和 cpu
并非在所有情况下都是必需的,但在最常见的情况下可能是必需的(因此值得一提)。 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章