PyTorch中張量和變數的區別
PyTorch是一個用於機器學習、計算機視覺和深度學習的開源Python庫。它是一個構建神經網路、進行復雜計算和最佳化梯度微分的優秀庫。
它由Facebook的研究團隊(FAIR)開發,由於其動態計算圖而廣受歡迎,使其能夠即時更改圖。這在2016年是一個革命性的突破,當時即時工作的模型才剛剛開始流行。
我們將重點關注PyTorch中的兩個主要變數:張量和變數。
張量用於定義n維矩陣或多維陣列,這些陣列又用於數學運算。它們表示許多型別的陣列,例如標量、向量和n維陣列。它們的功能與NumPy陣列或TensorFlow張量類似。PyTorch張量支援自動微分,這對於神經網路中的反向傳播至關重要,可以提高準確性並減少錯誤。它們用於儲存和操作PyTorch中的資料。
演算法
匯入PyTorch。
定義一個列表。
將其轉換為張量。
列印張量。
示例
import torch lst=[1,2,3,4,5] tensor=torch.tensor(lst) print(tensor)
輸出
tensor([1,2,3,4,5])
變數
它們是PyTorch中的主要資料型別。在更新到PyTorch 0.4.0之前,它們用於包裝張量並提供自動微分和跟蹤計算圖。在棄用之前,變數主要用於部署基於梯度的最佳化演算法。PyTorch更新到0.4.0之後,其大部分功能與張量合併。現在,張量可以在沒有變數的情況下執行所有這些功能,因此不再使用它。棄用的主要原因是降低PyTorch的API複雜性,並減少張量和變數之間的混淆。
演算法
匯入PyTorch
從PyTorch匯入Variable。
建立一個簡單的列表。
將其轉換為張量後,包裝變數函式。
列印變數。
示例
import torch from torch.autograd import Variable lst=[1,2,3,4,5] var=Variable(torch.tensor(lst)) print(var)
輸出
tensor([1,2,3,4,5])
讓我們透過更復雜的例子來了解張量和變數的使用,並親身體驗一下。
使用張量的示例
眾所周知,所有程式都是透過計算機的CPU執行的。為了顯著加快計算時間,我們可以利用GPU(圖形處理器)的強大功能來執行程式。
注意:如果您使用的是Google Colab,請將執行時更改為GPU執行時,否則程式將丟擲錯誤。
演算法
從PyTorch匯入張量。
建立兩個浮點型資料型別的張量。
找到它們的和並列印。
使用cuda()函式執行GPU加速。
列印所有GPU加速結果。
示例
import torch from torch import tensor, cuda #to prevent the program from throwing error device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') t1=tensor(6.) t2=tensor(9.) res=t1+t2 print(res) if cuda.is_available(): t1=t1.cuda() print(t1) t2=t2.cuda() print(t2) res=t1+t2 print(res)
輸出
tensor(15.) tensor(6., device='cuda:0') tensor(9., device='cuda:0') tensor(15., device='cuda:0')
使用變數的示例
為了在一個給定函式中執行微分,我們使用grad函式。透過計算輸入的計算圖,返回一個Python函式作為其導數,這與傳統的微分返回代數導數不同。
在這裡,我們在對結果變數執行反向傳遞後返回變數的函式,其中計算梯度,梯度將不會被計算,導致微分返回為'None'
演算法
匯入PyTorch。
從PyTorch匯入Variable。
使用Variable函式包裝兩個張量。
要查詢梯度型別,需要設定'requires_grad'=True
找到兩個張量的和。
在網路中反向傳遞結果以計算梯度。
列印兩個張量的梯度值。
示例
import torch from torch.autograd import Variable var1 = Variable(torch.tensor(6.), requires_grad=True) var2 = Variable(torch.tensor(9.), requires_grad=True) result = var1 + var2 print(result) result.backward() print(var1.grad) print(var2.grad)
輸出
tensor(15., grad_fn=<AddBackward07>) tensor(1.) tensor(1.)
結論
在PyTorch 0.4.0中棄用Variable函式之前,變數和張量具有不同的功能。變數用於包裝多維張量以執行微分。自更新以來,PyTorch中不再需要使用變數,因此它們已過時。