1. 程式人生 > >變量 (Variable)

變量 (Variable)

() 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)