pytorch 中forward 的用法與解釋說明
前言
最近在使用pytorch的時(shí)候,模型訓(xùn)練時(shí),不需要使用forward,只要在實(shí)例化一個(gè)對(duì)象中傳入對(duì)應(yīng)的參數(shù)就可以自動(dòng)調(diào)用 forward 函數(shù)
即:
forward 的使用
class Module(nn.Module): def __init__(self): super(Module, self).__init__() # ...... def forward(self, x): # ...... return x data = ..... #輸入數(shù)據(jù) # 實(shí)例化一個(gè)對(duì)象 module = Module() # 前向傳播 module(data) # 而不是使用下面的 # module.forward(data)
實(shí)際上
module(data)
是等價(jià)于
module.forward(data)
forward 使用的解釋
等價(jià)的原因是因?yàn)?python calss 中的__call__和__init__方法.
class A(): def __call__(self): print('i can be called like a function') a = A() a()
out:
i can be called like a function
__call__里調(diào)用其他的函數(shù)
class A(): def __call__(self, param): print('i can called like a function') print('傳入?yún)?shù)的類型是:{} 值為: {}'.format(type(param), param)) res = self.forward(param) return res def forward(self, input_): print('forward 函數(shù)被調(diào)用了') print('in forward, 傳入?yún)?shù)類型是:{} 值為: {}'.format( type(input_), input_)) return input_ a = A() input_param = a('i') print("對(duì)象a傳入的參數(shù)是:", input_param)
out:
i can called like a function
傳入?yún)?shù)的類型是:<class ‘str'> 值為: i
forward 函數(shù)被調(diào)用了
in forward, 傳入?yún)?shù)類型是:<class ‘str'> 值為: i
對(duì)象a傳入的參數(shù)是: i
補(bǔ)充:Pytorch 模型中nn.Model 中的forward() 前向傳播不調(diào)用 解釋
在pytorch 中沒有調(diào)用模型的forward()前向傳播,只實(shí)列化后把參數(shù)傳入。
定義模型
class Module(nn.Module): def __init__(self): super(Module, self).__init__() # ...... def forward(self, x): # ...... return x data = ..... #輸入數(shù)據(jù) # 實(shí)例化一個(gè)對(duì)象 module = Module() # 前向傳播 直接把輸入傳入實(shí)列化 module(data) #沒有使用module.forward(data)
實(shí)際上module(data) 等價(jià)于module.forward(data)
等價(jià)的原因是因?yàn)?python calss 中的__call__ 可以讓類像函數(shù)一樣調(diào)用
當(dāng)執(zhí)行model(x)的時(shí)候,底層自動(dòng)調(diào)用forward方法計(jì)算結(jié)果
class A(): def __call__(self): print('i can be called like a function') a = A() a() >>>i can be called like a function
在__call__ 里可調(diào)用其它的函數(shù)
class A(): def __call__(self, param): print('我在__call__中,傳入?yún)?shù)',param) res = self.forward(param) return res def forward(self, x): print('我在forward函數(shù)中,傳入?yún)?shù)類型是值為: ',x) return x a = A() y = a('i') >>> 我在__call__中,傳入?yún)?shù) i >>>我在forward函數(shù)中,傳入?yún)?shù)類型是值為: i print("傳入的參數(shù)是:", y) >>>傳入的參數(shù)是: i
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python中的 is 和 == 以及字符串駐留機(jī)制詳解
這篇文章主要介紹了Python中的 is 和 == 以及字符串駐留機(jī)制詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06在python plt圖表中文字大小調(diào)節(jié)的方法
今天小編就為大家分享一篇在python plt圖表中文字大小調(diào)節(jié)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07基于Python OpenCV實(shí)現(xiàn)圖像的覆蓋
本文將基于Python、OpenCV和Numpy實(shí)現(xiàn)圖像的覆蓋,即小圖像覆蓋在大圖像上。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-02-02使用Python實(shí)現(xiàn)文字轉(zhuǎn)語音并生成wav文件的例子
今天小編就為大家分享一篇使用Python實(shí)現(xiàn)文字轉(zhuǎn)語音并生成wav文件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08淺談tensorflow語義分割api的使用(deeplab訓(xùn)練cityscapes)
這篇文章主要介紹了淺談tensorflow語義分割api的使用(deeplab訓(xùn)練cityscapes),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python中類的定義、繼承及使用對(duì)象實(shí)例詳解
這篇文章主要介紹了Python中類的定義、繼承及使用對(duì)象,較為詳細(xì)的分析了Python中類的相關(guān)概念與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04Python數(shù)據(jù)預(yù)處理之?dāng)?shù)據(jù)規(guī)范化(歸一化)示例
這篇文章主要介紹了Python數(shù)據(jù)預(yù)處理之?dāng)?shù)據(jù)規(guī)范化,簡(jiǎn)單描述了數(shù)據(jù)規(guī)范化的原理、用法及相關(guān)操作技巧,需要的朋友可以參考下2019-01-01對(duì)python捕獲ctrl+c手工中斷程序的兩種方法詳解
今天小編就為大家分享一篇對(duì)python捕獲ctrl+c手工中斷程序的兩種方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12