[英]How do I get the value of a tensor in PyTorch?
打印張量x
給出:
>>> x = torch.tensor([3])
>>> print(x)
tensor([3])
索引x.data
給出:
>>> x.data[0]
tensor(3)
如何獲得常規的非張量值3
?
您可以使用x.item()
從具有一個元素的Tensor
中獲取 Python 編號。
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
示例: CUDA 上的單元素張量再次使用 AD
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 數組na
copy()
到一個新的 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.
RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
,因為require_grad=True
的張量由 PyTorch AD 記錄。
這就是為什么我們需要在使用numpy()
轉換之前先detach()
它們。
示例: 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.
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.
TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
將被設置。
將張量轉換為 numpy:
x.numpy()[0]
您可以使用x.cpu().detach().numpy()
從具有一個元素的張量中獲取 Python 數組,然后您可以從該數組中獲取一個數字
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.