pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹
PyTorch結(jié)構(gòu)介紹
對(duì)PyTorch架構(gòu)的粗淺理解,不能保證完全正確,但是希望可以從更高層次上對(duì)PyTorch上有個(gè)整體把握。
幾個(gè)重要的類型
和數(shù)值相關(guān)的
- Tensor
- Variable
- Parameter
- buffer(這個(gè)其實(shí)不能叫做類型,其實(shí)他就是用來保存tensor的)
Tensor:
PyTorch 中的計(jì)算基本都是基于 Tensor 的,可以說是 PyTorch 中的基本計(jì)算單元。
Variable:
Tensor 的一個(gè) Wrapper ,其中保存了 Variable 的創(chuàng)造者, Variable 的值(tensor),還有 Variable 的梯度( Variable )。
自動(dòng)求導(dǎo)機(jī)制的核心組件,因?yàn)樗粌H保存了 變量的值,還保存了變量是由哪個(gè) op 產(chǎn)生的。這在反向傳導(dǎo)的過程中是十分重要的。
Variable 的前向過程的計(jì)算包括兩個(gè)部分的計(jì)算,一個(gè)是其值的計(jì)算(即,Tensor的計(jì)算),還有就是 Variable 標(biāo)簽的計(jì)算。標(biāo)簽指的是什么呢?如果您看過PyTorch的官方文檔 Excluding subgraphs from backward 部分的話,您就會(huì)發(fā)現(xiàn) Variable 還有兩個(gè)標(biāo)簽: requires_grad 和 volatile 。標(biāo)簽的計(jì)算指的就是這個(gè)。
Paramete:
這個(gè)類是 Variable 的一個(gè)子集, PyTorch 給出這個(gè)類的定義是為了在 Module (下面會(huì)談到)中添加模型參數(shù)方便。
模型相關(guān)的
- Function
- Module
Function:
如果您想在 PyTorch 中自定義 OP 的話,您需要繼承這個(gè)類,您需要在繼承的時(shí)候復(fù)寫 forward 和 backward 方法,可能還需要復(fù)寫 __init__ 方法(由于篇幅控制,這里不再詳細(xì)贅述如果自定義 OP )。您需要在 forward 中定義 OP ,在 backward 說明如何計(jì)算梯度。關(guān)于 Function ,還需要知道的一點(diǎn)就是, Function 中 forward 和 backward 方法中進(jìn)行計(jì)算的類型都是 Tensor ,而不是我們傳入的Variable。計(jì)算完forward和backward之后,會(huì)包裝成Varaible返回。這種設(shè)定倒是可以理解的,因?yàn)镺P是一個(gè)整體嘛,OP內(nèi)部的計(jì)算不需要記錄creator
Module:
這個(gè)類和 Function 是有點(diǎn)區(qū)別的,回憶一下,我們定義 Function 的時(shí)候, Funciton 本身是不需要變量的,而 Module 是變量和 Function 的結(jié)合體。在某些時(shí)候,我們更傾向稱這種結(jié)構(gòu)為 Layer 。但是這里既然這么叫,那就這么叫吧。
Module 實(shí)際上是一個(gè)容器,我們可以繼承 Module ,在里面加幾個(gè)參數(shù),從而實(shí)現(xiàn)一個(gè)簡(jiǎn)單全連接層。我們也可以繼承 Module ,在里面加入其它 Module ,從而實(shí)現(xiàn)整個(gè) VGG 結(jié)構(gòu)。
關(guān)于hook
PyTorch中注冊(cè)的hook都是不允許改變hook的輸入值的
下面對(duì)PyTorch中出現(xiàn)hook的地方做個(gè)總結(jié):
* Module : register_forward_hook, register_backward_hook
注意:forward_hook不能用來修改Module的輸出值,它的功能就像是安裝個(gè)監(jiān)視器一樣。
我們可以用forward_hook和visdom來監(jiān)控我們Module的輸出。
backward_hook和與 Variable 的功能是類似的,將和 Variable 的 register_hook 一起介紹。
- Variable: register_hook
- Variable的register_hook注冊(cè)的是一個(gè)
backward hook,backward hook是在BP的過程中會(huì)用到的??梢杂盟鼇硖幚碛?jì)算的梯度。
foward過程與backward過程
forward
以一個(gè)Module為例:
- 1. 調(diào)用module的
call方法 - 2.
module的call里面調(diào)用module的forward方法 - 3.
forward里面如果碰到Module的子類,回到第1步,如果碰到的是Function的子類,繼續(xù)往下 - 4. 調(diào)用
Function的call方法 - 5.
Function的call方法調(diào)用了Function的forward方法。 - 6.
Function的forward返回值 - 7.
module的forward返回值 - 8. 在
module的call進(jìn)行forward_hook操作,然后返回值。
backward
總結(jié)
PyTorch基本的操作是 OP ,被操作數(shù)是 Tensor 。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 元組拆包示例(Tuple Unpacking)
今天小編就為大家分享一篇Python 元組拆包實(shí)例(Tuple Unpacking),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python 求一個(gè)列表中所有元素的乘積實(shí)例
今天小編就為大家分享一篇python 求一個(gè)列表中所有元素的乘積實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python任意字符串轉(zhuǎn)16, 32, 64進(jìn)制的方法
今天小編就為大家分享一篇Python任意字符串轉(zhuǎn)16, 32, 64進(jìn)制的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
pycharm的console輸入實(shí)現(xiàn)換行的方法
今天小編就為大家分享一篇pycharm的console輸入實(shí)現(xiàn)換行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python實(shí)現(xiàn)中文分詞FMM算法實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)中文分詞FMM算法,實(shí)例分析了Python基于FMM算法進(jìn)行中文分詞的實(shí)現(xiàn)方法,涉及Python針對(duì)文件、字符串及正則匹配操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07
使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn)
這篇文章主要介紹了使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測(cè)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python?異步之在?Asyncio中如何運(yùn)行阻塞任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之在?Asyncio?中運(yùn)行阻塞任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

