簡體   English   中英

如何在 PyTorch 中獲取張量的值?

[英]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行進行更改, naa將保持原樣。

示例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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM