2022-07-07 深度學(xué)習(xí)Python筆記

如何解決報(bào)錯(cuò)信息:RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method。 在運(yùn)行論文的代碼時(shí),報(bào)出此錯(cuò)誤信息,由于網(wǎng)上給出的方法不一且比較籠統(tǒng),所以著實(shí)花費(fèi)了些研究時(shí)間,趁著熱乎,趕緊將解決方法記錄下來(lái)。

報(bào)錯(cuò)信息也是錯(cuò)誤原因,因?yàn)槟惝?dāng)前繼承了torch.autograd.Function的子類代碼中,forward方法是“非靜態(tài)”方法,這種使用方式已經(jīng)過(guò)時(shí)了,所以請(qǐng)使用帶靜態(tài)forward方法的新的風(fēng)格的torch.autograd.Function。

錯(cuò)誤信息中給出了如何解決的例子:Example: https://pytorch.org/docs/stable/autograd.html#torch.autograd.Function

這個(gè)例子實(shí)在過(guò)于簡(jiǎn)單,當(dāng)針對(duì)如何修改自己的代碼時(shí),并不是一帆風(fēng)順的,除了將forward和backward上面加上注解:@staticmethod外,還需要特別關(guān)注:

1. 可以看到例子中沒(méi)有類的構(gòu)造器方法:def __init__(self, x),因此在你的代碼中torch.autograd.Function的子類需要去掉def __init__(self, x),同時(shí)將參數(shù)x放到forward方法中如下代碼中,init中的參數(shù)triplets以及代碼放到新的forward方法:

__init__()


新的forward()

2. 在外部調(diào)用torch.autograd.Function子類的地方,也需要修改,改寫成調(diào)用類的apply方法如triplets放到了apply方法中,注意:參數(shù)的順序一定要與forward方法中的一致,不能顛倒。

外部調(diào)用修改

3. 修改backward方法:除了加上@staticmethod外,還需要修改backward的return一行的代碼,因?yàn)槲覀兊膄orward方法已經(jīng)有了兩個(gè)參數(shù),說(shuō)明這兩個(gè)參數(shù)或許都參與了前向forward操作,因此程序認(rèn)為backward方法返回也需要有兩個(gè)參數(shù)參與自動(dòng)微分過(guò)程,根據(jù)你的實(shí)際情況,如果第二個(gè)、三個(gè)。。。不用參與自動(dòng)微分,請(qǐng)使用'None'返回如在我的例子中:


return修改
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容