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

vai*_*ijr 0 python pytorch tensor

x = torch.tensor([3])
Run Code Online (Sandbox Code Playgroud)

我有张量对象

print(x)
Run Code Online (Sandbox Code Playgroud)

它给 tensor([3])

x.data[0]给出tensor(3) 如何得到公正3

Ioa*_*ios 21

将张量转换为 numpy:

x.numpy()[0]
Run Code Online (Sandbox Code Playgroud)


pro*_*sti 20

从单元素张量获取值x.item()总是有效的:

示例CPU 上的单元素张量

x = torch.tensor([3])
x.item()
Run Code Online (Sandbox Code Playgroud)

输出:

3
Run Code Online (Sandbox Code Playgroud)

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

x = torch.tensor([3.], requires_grad=True)
x.item()
Run Code Online (Sandbox Code Playgroud)

输出:

3.0
Run Code Online (Sandbox Code Playgroud)

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

示例CUDA 上的单元素张量

3
Run Code Online (Sandbox Code Playgroud)

输出:

3
Run Code Online (Sandbox Code Playgroud)

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

x = torch.tensor([3.], requires_grad=True)
x.item()
Run Code Online (Sandbox Code Playgroud)

输出:

3.0
Run Code Online (Sandbox Code Playgroud)

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

3.0
Run Code Online (Sandbox Code Playgroud)

输出:

1.0
Run Code Online (Sandbox Code Playgroud)

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

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

示例共享存储

import torch
a = torch.ones((1,2))
print(a)
na = a.numpy()
na[0][0]=10
print(na)
print(a)
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[1., 1.]])
[[10.  1.]]
tensor([[10.,  1.]])
Run Code Online (Sandbox Code Playgroud)

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

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

x = torch.tensor([3], device='cuda')
x.item()
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[1., 1.]])
[[10.  1.]]
[[1. 1.]]
tensor([[1., 1.]])
Run Code Online (Sandbox Code Playgroud)

现在,只有nacnumpy 数组将随行更改nac[0][0]=10naa保持原样。

示例CPU 张量requires_grad=True

3
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[1., 1.]], requires_grad=True)
[[10.  1.]]
tensor([[10.,  1.]], requires_grad=True)
Run Code Online (Sandbox Code Playgroud)

在这里我们调用:

x = torch.tensor([3.], device='cuda', requires_grad=True)
x.item()
Run Code Online (Sandbox Code Playgroud)

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

这就是为什么我们需要detach()在使用numpy().

示例CUDA 张量requires_grad=False

3.0
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[1., 1.]], device='cuda:0')
[[10.  1.]]
tensor([[1., 1.]], device='cuda:0')
Run Code Online (Sandbox Code Playgroud)

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

示例CUDA 张量requires_grad=True

x = torch.ones((1,1), device='cuda', requires_grad=True)
x.item()
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[1., 1.]], device='cuda:0', requires_grad=True)
[[10.  1.]]
tensor([[1., 1.]], device='cuda:0', requires_grad=True)
Run Code Online (Sandbox Code Playgroud)

如果没有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.将被设置。


Vim*_*lak 6

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

  • 这应该被标记为最佳解决方案。 (11认同)
  • 如果我们的张量中有不止一项怎么办?当我有一个包含 2 个或更多元素的张量时,它会抛出错误。 (6认同)