pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹
PyTorch結(jié)構(gòu)介紹
對PyTorch架構(gòu)的粗淺理解,不能保證完全正確,但是希望可以從更高層次上對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ǎ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
部分的話,您就會發(fā)現(xiàn) Variable
還有兩個(gè)標(biāo)簽: requires_grad
和 volatile
。標(biāo)簽的計(jì)算指的就是這個(gè)。
Paramete:
這個(gè)類是 Variable
的一個(gè)子集, PyTorch
給出這個(gè)類的定義是為了在 Module
(下面會談到)中添加模型參數(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之后,會包裝成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è)簡單全連接層。我們也可以繼承 Module
,在里面加入其它 Module
,從而實(shí)現(xiàn)整個(gè) VGG
結(jié)構(gòu)。
關(guān)于hook
PyTorch中注冊的hook都是不允許改變hook的輸入值的
下面對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注冊的是一個(gè)
backward hook
,backward hook
是在BP的過程中會用到的??梢杂盟鼇硖幚碛?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à)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12python 求一個(gè)列表中所有元素的乘積實(shí)例
今天小編就為大家分享一篇python 求一個(gè)列表中所有元素的乘積實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python任意字符串轉(zhuǎn)16, 32, 64進(jìn)制的方法
今天小編就為大家分享一篇Python任意字符串轉(zhuǎn)16, 32, 64進(jìn)制的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06pycharm的console輸入實(shí)現(xiàn)換行的方法
今天小編就為大家分享一篇pycharm的console輸入實(shí)現(xiàn)換行的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01python實(shí)現(xiàn)中文分詞FMM算法實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)中文分詞FMM算法,實(shí)例分析了Python基于FMM算法進(jìn)行中文分詞的實(shí)現(xiàn)方法,涉及Python針對文件、字符串及正則匹配操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測的實(shí)現(xiàn)
這篇文章主要介紹了使用python進(jìn)行廣告點(diǎn)擊率的預(yù)測的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python?異步之在?Asyncio中如何運(yùn)行阻塞任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之在?Asyncio?中運(yùn)行阻塞任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03