如何解決報(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方法:


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

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'返回如在我的例子中:
