談?wù)剬?duì)Pytorch中的forward的理解
寫(xiě)在前面
以下是本人根據(jù)Pytorch學(xué)習(xí)過(guò)程中總結(jié)出的經(jīng)驗(yàn),如果有錯(cuò)誤,請(qǐng)指正。
正文
為什么都用def forward,而不改個(gè)名字?
在Pytorch建立神經(jīng)元網(wǎng)絡(luò)模型的時(shí)候,經(jīng)常用到forward方法,表示在建立模型后,進(jìn)行神經(jīng)元網(wǎng)絡(luò)的前向傳播。說(shuō)的直白點(diǎn),forward就是專(zhuān)門(mén)用來(lái)計(jì)算給定輸入,得到神經(jīng)元網(wǎng)絡(luò)輸出的方法。
在代碼實(shí)現(xiàn)中,也是用def forward
來(lái)寫(xiě)forward前向傳播的方法,我原來(lái)以為這是一種約定熟成的名字,也可以換成任意一個(gè)自己喜歡的名字。
但是看的多了之后發(fā)現(xiàn)并非如此:Pytorch對(duì)于forward方法賦予了一些特殊“功能”
(這里不禁再吐槽,一些看起來(lái)挺厲害的Pytorch“大神”,居然不知道這個(gè)。。。只能草草解釋一下:“就是這樣的。。。”)
forward有什么特殊功能?
第一條:.forward()可以不寫(xiě)
我最開(kāi)始發(fā)現(xiàn)forward()的與眾不同之處就是在此,首先舉個(gè)例子:
import torch.nn as nn class test(nn.Module): def __init__(self, input): super(test,self).__init__() self.input = input def forward(self,x): return self.input * x T = test(8) print(T(6)) # print(T.forward(6)) --------------------------運(yùn)行結(jié)果------------------------- D:\Users\Lenovo\anaconda3\python.exe C:/Users/Lenovo/Desktop/DL/pythonProject/tt.py 48 Process finished with exit code 0
可以發(fā)現(xiàn),T(6)是可以輸出的!而且不用指定,默認(rèn)了調(diào)用forward方法
。當(dāng)然如果非要寫(xiě)上.forward()這也是可以正常運(yùn)行的,和不寫(xiě)是一樣的。
如果不調(diào)用Pytorch(正常的Python語(yǔ)法規(guī)則),這樣肯定會(huì)報(bào)錯(cuò)的
# import torch.nn as nn #不再調(diào)用torch class test(): def __init__(self, input): self.input = input def forward(self,x): return self.input * x T = test(8) print(T.forward(6)) print("************************") print(T(6)) --------------------------運(yùn)行結(jié)果------------------------- D:\Users\Lenovo\anaconda3\python.exe C:/Users/Lenovo/Desktop/DL/pythonProject/tt.py 48 ************************ Traceback (most recent call last): File "C:\Users\Lenovo\Desktop\DL\pythonProject\tt.py", line 77, in <module> print(T(6)) TypeError: 'test' object is not callable Process finished with exit code 1
這里會(huì)報(bào):‘test’ object is not callable
因?yàn)閏lass不能被直接調(diào)用,不知道你想調(diào)用哪個(gè)方法。
第二條:優(yōu)先運(yùn)行forward方法
如果在class中再增加一個(gè)方法:
import torch.nn as nn class test(nn.Module): def __init__(self, input): super(test,self).__init__() self.input = input def byten(self): return self.input * 10 def forward(self,x): return self.input * x T = test(8) print(T(6)) print(T.byten()) --------------------------運(yùn)行結(jié)果------------------------- D:\Users\Lenovo\anaconda3\python.exe C:/Users/Lenovo/Desktop/DL/pythonProject/tt.py 48 80 Process finished with exit code 0
可以見(jiàn)到,在class中有多個(gè)method的時(shí)候,如果不指定method,forward是會(huì)被優(yōu)先執(zhí)行的。
總結(jié)
在Pytorch中,forward方法是一個(gè)特殊的方法,被專(zhuān)門(mén)用來(lái)進(jìn)行前向傳播。
到此這篇關(guān)于談?wù)剬?duì)Pytorch中的forward的理解的文章就介紹到這了,更多相關(guān)Pytorch中的forward內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
linux平臺(tái)使用Python制作BT種子并獲取BT種子信息的方法
這篇文章主要介紹了linux平臺(tái)使用Python制作BT種子并獲取BT種子信息的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python BT模塊的安裝及針對(duì)BT種子文件的相關(guān)操作技巧,需要的朋友可以參考下2017-01-01利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能
這篇文章主要介紹了利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python用faker庫(kù)批量生成假數(shù)據(jù)
這篇文章主要介紹了python用faker庫(kù)批量生成假數(shù)據(jù),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03python爬蟲(chóng)今日熱榜數(shù)據(jù)到txt文件的源碼
這篇文章主要介紹了python爬蟲(chóng)今日熱榜數(shù)據(jù)到txt文件的源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Python實(shí)現(xiàn)的將文件每一列寫(xiě)入列表功能示例【測(cè)試可用】
這篇文章主要介紹了Python實(shí)現(xiàn)的將文件每一列寫(xiě)入列表功能,涉及Python文件讀取、遍歷、序列追加、賦值等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python3 列表,數(shù)組,矩陣的相互轉(zhuǎn)換的方法示例
這篇文章主要介紹了Python3 列表,數(shù)組,矩陣的相互轉(zhuǎn)換的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08numpy.linalg.eig() 計(jì)算矩陣特征向量方式
今天小編就為大家分享一篇numpy.linalg.eig() 計(jì)算矩陣特征向量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11