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è)簡單全連接層。我們也可以繼承 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實(shí)現(xiàn)掃描指定目錄下的子目錄及文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)掃描指定目錄下的子目錄及文件的方法,需要的朋友可以參考下2014-07-07
Python實(shí)現(xiàn)目錄遍歷和內(nèi)容獲取的完整指南
在軟件開發(fā)中,目錄遍歷和文件系統(tǒng)操作是極其常見且重要的任務(wù),本文將深入探討Python中獲取目錄內(nèi)容的各種方法,展示如何在不同場(chǎng)景下選擇和使用最合適的工具,希望對(duì)大家有所幫助2025-09-09
python3中超級(jí)好用的日志模塊-loguru模塊使用詳解
loguru默認(rèn)的輸出格式是上面的內(nèi)容,有時(shí)間、級(jí)別、模塊名、行號(hào)以及日志信息,不需要手動(dòng)創(chuàng)建?logger,直接使用即可,另外其輸出還是彩色的,看起來會(huì)更加友好,這篇文章主要介紹了python3中超級(jí)好用的日志模塊-loguru模塊使用詳解,需要的朋友可以參考下2022-11-11

