變量 (Variable)
阿新 • • 發佈:2017-11-07
() auto code rom ria 傳遞 back 先生 雞蛋
Tensor不能反向傳播。
variable可以反向傳播。
什麽是 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] """
Variable 計算, 梯度
t_out = torch.mean(tensor*tensor) # x^2 v_out = torch.mean(variable*variable) # x^2 print(t_out) print(v_out) # 7.5
到目前為止, 我們看不出什麽不同, 但是時刻記住, Variable 計算時, 它在背景幕布後面一步步默默地搭建著一個龐大的系統, 叫做計算圖, computational graph. 這個圖是用來幹嘛的? 原來是將所有的計算步驟 (節點) 都連接起來, 最後進行誤差反向傳遞的時候, 一次性將所有 variable 裏面的修改幅度 (梯度) 都計算出來, 而 tensor 就沒有這個能力啦.
v_out.backward() # 模擬 v_out 的誤差反向傳遞 # 下面兩步看不懂沒關系, 只要知道 Variable 是計算圖的一部分, 可以用來傳遞誤差就好. # v_out = 1/4 * sum(variable*variable) 這是計算圖中的 v_out 計算步驟 # 針對於 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2 print(variable.grad) # 初始 Variable 的梯度 ,v_out對variable求導。 ‘‘‘ 0.5000 1.0000 1.5000 2.0000 ‘‘‘
獲取 Variable 裏面的數據
直接print(variable)
只會輸出 Variable 形式的數據, 在很多時候是用不了的(比如想要用 plt 畫圖), 所以我們要轉換一下, 將它變成 tensor 形式.
print(variable) # Variable 形式 """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data) # tensor 形式 """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data.numpy()) # numpy 形式 """ [[ 1. 2.] [ 3. 4.]] """
變量 (Variable)