?one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [16, 64, 256, 256]], which is output 0 of LeakyReluBackward1, is at version 1;?
最近跑代碼遇到了這樣的一個(gè)問(wèn)題,在網(wǎng)上找了很多方法都沒(méi)有很好的解決,今天就在這個(gè)博客里面將所有的解決辦法整理記錄一下。
解決方法1:
去查看所有的loss反串的代碼區(qū)域:
需要將這種loss反串的代碼修改為:
即都應(yīng)該在計(jì)算loss后再進(jìn)行反傳和優(yōu)化器的優(yōu)化。
解決辦法2:
有很多人在寫(xiě)代碼的時(shí)候遇到了反傳過(guò)程中設(shè)置了retain_grah為T(mén)rue的問(wèn)題,需要將這部分設(shè)置為False或者直接把這個(gè)給去掉。
? ?
解決辦法3:
即問(wèn)題中所描述的inplace operation的問(wèn)題,這種問(wèn)題常常是某些變量還沒(méi)有保存就已經(jīng)被替換掉了,一般在報(bào)錯(cuò)的過(guò)程中會(huì)顯示錯(cuò)誤變量的shape,這時(shí)最好是看一下代碼中關(guān)于這個(gè)shape的所有變量,加上clone(),試試!我就是這個(gè)問(wèn)題,試完我的問(wèn)題就解決了。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-573325.html
?問(wèn)題4:
在pytorch中, inplace operation 可以是一些 .add_() 或 .scatter_() 導(dǎo)致的。對(duì)于.add_()方法,是直接在tensor上進(jìn)行修改的,可以把x.add_(y)改成x = x + y。如果需要復(fù)制一個(gè)副本話,參照第二個(gè)帖子的方法,可以使用.clone()方法。
在python中, inplace operation 可以是一些 += 或 *= 導(dǎo)致的。比如 x += y,需要改成 x = x +y
?
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-573325.html
?
?
?
到了這里,關(guān)于報(bào)錯(cuò)解決 one of the variables needed for gradient computation has been modified by an inplace operation的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!