PyTorch中的Variable變數詳解
一、瞭解Variable
顧名思義,Variable就是 變數 的意思。實質上也就是可以變化的量,區別於int變數,它是一種可以變化的變數,這正好就符合了反向傳播,引數更新的屬性。
具體來說,在pytorch中的Variable就是一個存放會變化值的地理位置,裡面的值會不停發生片花,就像一個裝雞蛋的籃子,雞蛋數會不斷髮生變化。那誰是裡面的雞蛋呢,自然就是pytorch中的tensor了。(也就是說,pytorch都是有tensor計算的,而tensor裡面的引數都是Variable的形式)。如果用Variable計算的話,那返回的也是一個同類型的Variable。
【tensor 是一個多維矩陣】
用一個例子說明,Variable的定義:
import torch from torch.autograd import Variable # torch 中 Variable 模組 tensor = torch.FloatTensor([[1,2],[3,4]]) # 把雞蛋放到籃子裡,requires_grad是參不參與誤差反向傳播,要不要計算梯度 variable = Variable(tensor,requires_grad=True) print(tensor) """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable) """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """
注:tensor不能反向傳播,variable可以反向傳播。
二、Variable求梯度
Variable計算時,它會逐漸地生成計算圖。這個圖就是將所有的計算節點都連線起來,最後進行誤差反向傳遞的時候,一次性將所有Variable裡面的梯度都計算出來,而tensor就沒有這個能力。
v_out.backward() # 模擬 v_out 的誤差反向傳遞 print(variable.grad) # 初始 Variable 的梯度 ''' 0.5000 1.0000 1.5000 2.0000 '''
三、獲取Variable裡面的資料
直接print(Variable) 只會輸出Variable形式的資料,在很多時候是用不了的。所以需要轉換一下,將其變成tensor形式。
print(variable) # Variable 形式 """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data) # 將variable形式轉為tensor 形式 """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data.numpy()) # numpy 形式 """ [[ 1. 2.] [ 3. 4.]] """
擴充套件
在PyTorch中計算圖的特點總結如下:
autograd根據使用者對Variable的操作來構建其計算圖。
1、requires_grad
variable預設是不需要被求導的,即requires_grad屬性預設為False,如果某一個節點的requires_grad為True,那麼所有依賴它的節點requires_grad都為True。
2、volatile
variable的volatile屬性預設為False,如果某一個variable的volatile屬性被設為True,那麼所有依賴它的節點volatile屬性都為True。volatile屬性為True的節點不會求導,volatile的優先順序比requires_grad高。
3、retain_graph
多次反向傳播(多層監督)時,梯度是累加的。一般來說,單次反向傳播後,計算圖會free掉,也就是反向傳播的中間快取會被清空【這就是動態度的特點】。為進行多次反向傳播需指定retain_graph=True來儲存這些快取。
4、backward()
反向傳播,求解Variable的梯度。放在中間快取中。
以上這篇PyTorch中的Variable變數詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。