PyTorch中的Variable變量詳解
一、了解Variable
顧名思義,Variable就是 變量 的意思。實質(zhì)上也就是可以變化的量,區(qū)別于int變量,它是一種可以變化的變量,這正好就符合了反向傳播,參數(shù)更新的屬性。
具體來說,在pytorch中的Variable就是一個存放會變化值的地理位置,里面的值會不停發(fā)生片花,就像一個裝雞蛋的籃子,雞蛋數(shù)會不斷發(fā)生變化。那誰是里面的雞蛋呢,自然就是pytorch中的tensor了。(也就是說,pytorch都是有tensor計算的,而tensor里面的參數(shù)都是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計算時,它會逐漸地生成計算圖。這個圖就是將所有的計算節(jié)點都連接起來,最后進(jìn)行誤差反向傳遞的時候,一次性將所有Variable里面的梯度都計算出來,而tensor就沒有這個能力。
v_out.backward() # 模擬 v_out 的誤差反向傳遞 print(variable.grad) # 初始 Variable 的梯度 ''' 0.5000 1.0000 1.5000 2.0000 '''
三、獲取Variable里面的數(shù)據(jù)
直接print(Variable) 只會輸出Variable形式的數(shù)據(jù),在很多時候是用不了的。所以需要轉(zhuǎn)換一下,將其變成tensor形式。
print(variable) # Variable 形式 """ Variable containing: 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data) # 將variable形式轉(zhuǎn)為tensor 形式 """ 1 2 3 4 [torch.FloatTensor of size 2x2] """ print(variable.data.numpy()) # numpy 形式 """ [[ 1. 2.] [ 3. 4.]] """
擴(kuò)展
在PyTorch中計算圖的特點總結(jié)如下:
autograd根據(jù)用戶對Variable的操作來構(gòu)建其計算圖。
1、requires_grad
variable默認(rèn)是不需要被求導(dǎo)的,即requires_grad屬性默認(rèn)為False,如果某一個節(jié)點的requires_grad為True,那么所有依賴它的節(jié)點requires_grad都為True。
2、volatile
variable的volatile屬性默認(rèn)為False,如果某一個variable的volatile屬性被設(shè)為True,那么所有依賴它的節(jié)點volatile屬性都為True。volatile屬性為True的節(jié)點不會求導(dǎo),volatile的優(yōu)先級比requires_grad高。
3、retain_graph
多次反向傳播(多層監(jiān)督)時,梯度是累加的。一般來說,單次反向傳播后,計算圖會free掉,也就是反向傳播的中間緩存會被清空【這就是動態(tài)度的特點】。為進(jìn)行多次反向傳播需指定retain_graph=True來保存這些緩存。
4、backward()
反向傳播,求解Variable的梯度。放在中間緩存中。
以上這篇PyTorch中的Variable變量詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python pandas如何根據(jù)指定條件篩選數(shù)據(jù)
這篇文章主要介紹了Python pandas如何根據(jù)指定條件篩選數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02Django filter動態(tài)過濾與排序?qū)崿F(xiàn)過程解析
這篇文章主要介紹了Django filter動態(tài)過濾與排序?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11pytorch中forwod函數(shù)在父類中的調(diào)用方式解讀
這篇文章主要介紹了pytorch中forwod函數(shù)在父類中的調(diào)用方式解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02python 將list轉(zhuǎn)成字符串,中間用符號分隔的方法
今天小編就為大家分享一篇python 將list轉(zhuǎn)成字符串,中間用符號分隔的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Python?Struct庫之pack和unpack舉例詳解
這篇文章主要給大家介紹了關(guān)于Python?Struct庫之pack和unpack的相關(guān)資料,pack和unpack在處理二進(jìn)制流中比較常用的封包、解包格式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02pycharm配置anaconda環(huán)境時找不到python.exe的兩種解決辦法
如果你在Anaconda中創(chuàng)建了虛擬環(huán)境,但是無法找到python.exe,可能是因為虛擬環(huán)境的Python路徑?jīng)]有添加到系統(tǒng)環(huán)境變量中,這篇文章主要給大家介紹了關(guān)于pycharm配置anaconda環(huán)境時找不到python.exe的兩種解決辦法,需要的朋友可以參考下2024-07-07python解析Chrome瀏覽器歷史瀏覽記錄和收藏夾數(shù)據(jù)
大家好,本篇文章主要講的是python解析Chrome瀏覽器歷史瀏覽記錄和收藏夾數(shù)據(jù),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02