變量 (Variable)


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.]]
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM