如何在PyTorch中获得张量的值?

时间:2019-08-30 13:08:12

标签: python pytorch tensor

x = torch.tensor([3])

我有一个张量对象 当我

print(x)

它给 tensor([3])

x.data[0]给出tensor(3) 我怎么只得到3

4 个答案:

答案 0 :(得分:6)

您可以使用x.item()从具有一个元素的张量中获取Python数字

答案 1 :(得分:4)

要从单个元素张量x.item()中获取值,始终可以:

示例 CPU上的单个元素张量

x = torch.tensor([3])
x.item()

输出:

3

示例具有AD的CPU上的单元素张量

x = torch.tensor([3.], requires_grad=True)
x.item()

输出:

3.0

注意:我们需要对AD使用浮点算法

示例 CUDA上的单元素张量

x = torch.tensor([3], device='cuda')
x.item()

输出:

3

示例具有AD的CUDA上的单元素张量

x = torch.tensor([3.], device='cuda', requires_grad=True)
x.item()

输出:

3.0

示例再次使用AD的CUDA上的单元素张量

x = torch.ones((1,1), device='cuda', requires_grad=True)
x.item()

输出:

1.0

要从非单元素张量中获取值,我们必须要小心:

下一个示例将显示驻留在CPU上的PyTorch张量与numpy数组na共享相同的存储空间

示例共享存储空间

import torch
a = torch.ones((1,2))
print(a)
na = a.numpy()
na[0][0]=10
print(na)
print(a)

输出:

tensor([[1., 1.]])
[[10.  1.]]
tensor([[10.,  1.]])

示例消除共享存储的影响,首先复制numpy数组

为了避免共享存储的影响,我们需要将numpy数组copy() na更改为新的numpy数组nac。 Numpy copy()方法创建新的单独存储。

import torch
a = torch.ones((1,2))
print(a)
na = a.numpy()
nac = na.copy()
nac[0][0]=10
​print(nac)
print(na)
print(a)

输出:

tensor([[1., 1.]])
[[10.  1.]]
[[1. 1.]]
tensor([[1., 1.]])

现在,仅nac numpy数组将与行nac[0][0]=10naa保持不变。

示例 CPU张量requires_grad=True

import torch
a = torch.ones((1,2), requires_grad=True)
print(a)
na = a.detach().numpy()
na[0][0]=10
print(na)
print(a)

输出:

tensor([[1., 1.]], requires_grad=True)
[[10.  1.]]
tensor([[10.,  1.]], requires_grad=True)

在这里我们称为:

na = a.numpy() 

这将导致:RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.,因为PyTorch AD记录了require_grad=True的张量。

这就是为什么在使用detach()进行转换之前,我们需要先numpy()它们。

示例 CUDA张量requires_grad=False

a = torch.ones((1,2), device='cuda')
print(a)
na = a.to('cpu').numpy()
na[0][0]=10
print(na)
print(a)

输出:

tensor([[1., 1.]], device='cuda:0')
[[10.  1.]]
tensor([[1., 1.]], device='cuda:0')

在这里,我们只是不将CUDA张量转换为CPU。共享存储在这里没有影响。

示例 CUDA张量requires_grad=True

a = torch.ones((1,2), device='cuda', requires_grad=True)
print(a)
na = a.detach().to('cpu').numpy()
na[0][0]=10
​print(na)
print(a)

输出:

tensor([[1., 1.]], device='cuda:0', requires_grad=True)
[[10.  1.]]
tensor([[1., 1.]], device='cuda:0', requires_grad=True)

如果没有detach()方法,则会设置错误RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

没有设置.to('cpu')方法TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.的情况。

答案 2 :(得分:1)

将张量转换为numpy:

x.numpy()[0]

答案 3 :(得分:0)

您可以使用 x.cpu().detach().numpy() 从具有一个元素的张量中获取 Python 数组,然后您可以从该数组中获取一个数字