如何在 PyTorch 中获取张量的值?
How do I get the value of a tensor in PyTorch?
打印张量给出:
>>> x = torch.tensor([3])
>>> print(x)
tensor([3])
同样索引其 .data
给出:
>>> x.data[0]
tensor(3)
如何只获取值 3
?
将张量转换为 numpy:
x.numpy()[0]
您可以使用 x.item()
从具有一个元素的 Tensor
中得到一个 Python 数字。
要从单元素张量中获取值 x.item()
始终有效:
示例:CPU
上的单元素张量
x = torch.tensor([3])
x.item()
输出:
3
示例:CPU 上的单元素张量与 AD
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数组
为了避免共享存储的影响,我们需要 copy()
numpy 数组 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]=10
,na
和 a
将保持原样。
示例: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.
,因为 require_grad=True
的张量由 PyTorch AD 记录。
这就是为什么我们需要先 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.
。
您可以使用 x.cpu().detach().numpy()
从具有一个元素的张量中获取一个 Python 数组,然后您可以从该数组中获取一个数字
打印张量给出:
>>> x = torch.tensor([3])
>>> print(x)
tensor([3])
同样索引其 .data
给出:
>>> x.data[0]
tensor(3)
如何只获取值 3
?
将张量转换为 numpy:
x.numpy()[0]
您可以使用 x.item()
从具有一个元素的 Tensor
中得到一个 Python 数字。
要从单元素张量中获取值 x.item()
始终有效:
示例:CPU
上的单元素张量x = torch.tensor([3])
x.item()
输出:
3
示例:CPU 上的单元素张量与 AD
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数组
为了避免共享存储的影响,我们需要 copy()
numpy 数组 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]=10
,na
和 a
将保持原样。
示例: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.
,因为 require_grad=True
的张量由 PyTorch AD 记录。
这就是为什么我们需要先 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.
。
您可以使用 x.cpu().detach().numpy()
从具有一个元素的张量中获取一个 Python 数组,然后您可以从该数组中获取一个数字