torch.tensor、numpy.array、list三者之間互相轉換

michaelchengjl發表於2024-07-04

torch.tensor、numpy.array、list三者之間互相轉換

1.1 list 轉 numpy

ndarray = np.array(list)

1.2 numpy 轉 list

list = ndarray.tolist()

2.1 list 轉 torch.Tensor

tensor=torch.Tensor(list)

2.2 torch.Tensor 轉 list

先轉numpy,後轉list

list = tensor.numpy().tolist()

3.1 torch.Tensor 轉 numpy

轉換後共享記憶體
注意,轉換後的 pytorch tensor 與 numpy array 指向同一地址,所以,對一方的值改變另一方也隨之改變

最完全最常用的將 Tensor 轉成 numpy array 的方法如下:
x.detach().to('cpu').numpy()

在最簡單的情況下,當你在 CPU 上有一個沒有梯度的 PyTorch 張量時,你可以簡單地呼叫 .numpy() 方法

ndarray = tensor.numpy()

*gpu上的tensor不能直接轉為numpy
如果 Tensor 位於 “cpu” 以外的裝置上,則需要先將其帶回 CPU,然後才能呼叫 .numpy() 方法。
ndarray = tensor.cpu().numpy()


如果張量是需要梯度的計算圖的一部分(也就是說,如果 x.requires_grad=True),則需要呼叫 .detach() 方法:
x = torch.eye(3, requires_grad=True)
x.detach().numpy()

3.2 numpy 轉 torch.Tensor

tensor = torch.from_numpy(ndarray)
轉換時改變資料型別
tensor = torch.from_numpy(x).type(torch.float32)

轉換時傳送到不同的裝置上,如 GPU
if torch.cuda.is_available():
    y = torch.from_numpy(x).to("cuda")
	

注意,當使用鎖頁記憶體(pytorch 中資料載入器的鎖頁記憶體 pinned memory)的方式載入資料時,資料放入 GPU 的時候,應該把 non_blocking=True,這樣能夠縮減訪問時間,加快訓練。
if torch.cuda.is_available():
    y = torch.from_numpy(x).to("cuda", non_blocking=True)
	
	

相關文章