PyTorch中的Variable變量詳解
一、了解Variable
顧名思義,Variable就是 變量 的意思。實(shí)質(zhì)上也就是可以變化的量,區(qū)別于int變量,它是一種可以變化的變量,這正好就符合了反向傳播,參數(shù)更新的屬性。
具體來(lái)說(shuō),在pytorch中的Variable就是一個(gè)存放會(huì)變化值的地理位置,里面的值會(huì)不停發(fā)生片花,就像一個(gè)裝雞蛋的籃子,雞蛋數(shù)會(huì)不斷發(fā)生變化。那誰(shuí)是里面的雞蛋呢,自然就是pytorch中的tensor了。(也就是說(shuō),pytorch都是有tensor計(jì)算的,而tensor里面的參數(shù)都是Variable的形式)。如果用Variable計(jì)算的話(huà),那返回的也是一個(gè)同類(lèi)型的Variable。
【tensor 是一個(gè)多維矩陣】
用一個(gè)例子說(shuō)明,Variable的定義:
import torch from torch.autograd import Variable # torch 中 Variable 模塊 tensor = torch.FloatTensor([[1,2],[3,4]]) # 把雞蛋放到籃子里, requires_grad是參不參與誤差反向傳播, 要不要計(jì)算梯度 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計(jì)算時(shí),它會(huì)逐漸地生成計(jì)算圖。這個(gè)圖就是將所有的計(jì)算節(jié)點(diǎn)都連接起來(lái),最后進(jìn)行誤差反向傳遞的時(shí)候,一次性將所有Variable里面的梯度都計(jì)算出來(lái),而tensor就沒(méi)有這個(gè)能力。
v_out.backward() # 模擬 v_out 的誤差反向傳遞 print(variable.grad) # 初始 Variable 的梯度 ''' 0.5000 1.0000 1.5000 2.0000 '''
三、獲取Variable里面的數(shù)據(jù)
直接print(Variable) 只會(huì)輸出Variable形式的數(shù)據(jù),在很多時(shí)候是用不了的。所以需要轉(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中計(jì)算圖的特點(diǎn)總結(jié)如下:
autograd根據(jù)用戶(hù)對(duì)Variable的操作來(lái)構(gòu)建其計(jì)算圖。
1、requires_grad
variable默認(rèn)是不需要被求導(dǎo)的,即requires_grad屬性默認(rèn)為False,如果某一個(gè)節(jié)點(diǎn)的requires_grad為T(mén)rue,那么所有依賴(lài)它的節(jié)點(diǎn)requires_grad都為T(mén)rue。
2、volatile
variable的volatile屬性默認(rèn)為False,如果某一個(gè)variable的volatile屬性被設(shè)為T(mén)rue,那么所有依賴(lài)它的節(jié)點(diǎn)volatile屬性都為T(mén)rue。volatile屬性為T(mén)rue的節(jié)點(diǎn)不會(huì)求導(dǎo),volatile的優(yōu)先級(jí)比requires_grad高。
3、retain_graph
多次反向傳播(多層監(jiān)督)時(shí),梯度是累加的。一般來(lái)說(shuō),單次反向傳播后,計(jì)算圖會(huì)free掉,也就是反向傳播的中間緩存會(huì)被清空【這就是動(dòng)態(tài)度的特點(diǎn)】。為進(jìn)行多次反向傳播需指定retain_graph=True來(lái)保存這些緩存。
4、backward()
反向傳播,求解Variable的梯度。放在中間緩存中。
以上這篇PyTorch中的Variable變量詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 拷貝對(duì)象(深拷貝deepcopy與淺拷貝copy)
Python中的對(duì)象之間賦值時(shí)是按引用傳遞的,如果需要拷貝對(duì)象,需要使用標(biāo)準(zhǔn)庫(kù)中的copy模塊。2008-09-09
集調(diào)試共享及成本控制Prompt工具PromptLayer使用指南
這篇文章主要介紹了集調(diào)試共享及成本控制Prompt工具PromptLayer使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Python使用jupyter notebook查看ipynb文件過(guò)程解析
這篇文章主要介紹了Python使用jupyter notebook查看ipynb文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python基礎(chǔ)教程之內(nèi)置函數(shù)locals()和globals()用法分析
這篇文章主要介紹了Python基礎(chǔ)教程之內(nèi)置函數(shù)locals()和globals()用法,結(jié)合實(shí)例形式分析了locals()和globals()函數(shù)的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-03-03
Python提取JSON格式數(shù)據(jù)實(shí)戰(zhàn)案例
這篇文章主要給大家介紹了關(guān)于Python提取JSON格式數(shù)據(jù)的相關(guān)資料, Python提供了內(nèi)置的json模塊,用于處理JSON數(shù)據(jù),文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-07-07
POC漏洞批量驗(yàn)證程序Python腳本編寫(xiě)
這篇文章主要為大家介紹了POC漏洞批量驗(yàn)證程序Python腳本編寫(xiě)的完整示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
利用Python實(shí)現(xiàn)原創(chuàng)工具的Logo與Help
這篇文章主要給大家介紹了關(guān)于如何利用Python實(shí)現(xiàn)原創(chuàng)工具的Logo與Help的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來(lái)一起看看吧2018-12-12
win10下opencv-python特定版本手動(dòng)安裝與pip自動(dòng)安裝教程
這篇文章主要介紹了win10下opencv-python特定版本手動(dòng)安裝與pip自動(dòng)安裝教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

