您好,登錄后才能下訂單哦!
在pytorch中使用loss反向傳播出現錯誤如何解決?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
解決辦法:
loss = criterion(pred, targets) loss.backward() # 改為: loss = criterion(pred, targets) loss.backward(loss.clone().detach())
把張量的輸出修改為標量,比如說多多個維度的loss求和或求均值等。此方法對于某些任務不一定適用,可以嘗試自己修改。
criterion = nn.L1Loss(reduction='none') # 把參數去掉,改為: criterion = nn.L1Loss()
在新的pytorch版本里,使用reduction 參數取代了舊版本的size_average和reduce參數。
reduction 參數有三種選擇:
'elementwise_mean':為默認情況,表明對N個樣本的loss進行求平均之后返回(相當于reduce=True,size_average=True);
'sum':指對n個樣本的loss求和(相當于reduce=True,size_average=False);
'none':表示直接返回n分樣本的loss(相當于reduce=False)
補充:在Pytorch下,由于反向傳播設置錯誤導致 loss不下降的原因及解決方案
在Pytorch下,由于反向傳播設置錯誤導致 loss不下降的原因及解決方案
剛剛接觸深度學習一段時間,一直在研究計算機視覺方面,現在也在嘗試實現自己的idea,從中也遇見了一些問題,這次就專門寫一下,自己由于在反向傳播(backward)過程中參數沒有設置好,而導致的loss不下降的原因。
簡單描述一下我的網絡結構,我的網絡是有上下兩路,先對第一路網絡進行訓練,使用groud truth對這一路的結果進行監督loss_steam1,得到訓練好的feature.然后再將得到的feature級聯到第二路,通過網絡得到最后的結果,再用groud truth進行監督loss。
這個問題確實折麼自己一段時間,結果發現自己出現了一個問題,下面將對這個問題進行分析和解答:
在PyTorch中,傳入網絡計算的數據類型必須是Variable類型, Variable包裝了一個Tensor,并且保存著梯度和創建這個Variablefunction的引用,換句話說,就是記錄網絡每層的梯度和網絡圖,可以實現梯度的反向傳遞.
則根據最后得到的loss可以逐步遞歸的求其每層的梯度,并實現權重更新。
在實現梯度反向傳遞時主要需要三步:
1、初始化梯度值:net.zero_grad() 清除網絡狀態
2、反向求解梯度:loss.backward() 反向傳播求梯度
3、更新參數:optimizer.step() 更新參數
自己在寫代碼的時候,還是沒有對自己的代碼搞明白。在反向求解梯度時,對第一路沒有進行反向傳播,這樣肯定不能使這一路的更新,所以我就又加了一步:
loss_steam1.backward( retain_graph = True) //因為每次運行一次backward時,如果不加retain_graph = True,運行完后,計算圖都會free掉。
loss.backward()
這樣就夠了么?我當時也是這么認為的結果發現loss_steam1還是沒有降,又愁了好久,結果發現梯度有了,不更新參數,怎么可能有用!
optimizer_steam1.step() //這項必須加 optimizer.step()
1.PyTorch是相當簡潔且高效快速的框架;2.設計追求最少的封裝;3.設計符合人類思維,它讓用戶盡可能地專注于實現自己的想法;4.與google的Tensorflow類似,FAIR的支持足以確保PyTorch獲得持續的開發更新;5.PyTorch作者親自維護的論壇 供用戶交流和求教問題6.入門簡單
看完上述內容,你們掌握在pytorch中使用loss反向傳播出現錯誤如何解決的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。