溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

在pytorch中使用loss反向傳播出現(xiàn)錯誤如何解決

發(fā)布時間:2021-05-12 16:18:09 來源:億速云 閱讀:385 作者:Leah 欄目:開發(fā)技術(shù)

在pytorch中使用loss反向傳播出現(xiàn)錯誤如何解決?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

解決辦法:

1. 給 loss.backward() 指定傳遞給后向的參數(shù)維度:

loss = criterion(pred, targets)
loss.backward()
# 改為:
loss = criterion(pred, targets)
loss.backward(loss.clone().detach())

2. 修改loss函數(shù)的輸出維度

把張量的輸出修改為標量,比如說多多個維度的loss求和或求均值等。此方法對于某些任務(wù)不一定適用,可以嘗試自己修改。

criterion = nn.L1Loss(reduction='none')
# 把參數(shù)去掉,改為:
criterion = nn.L1Loss()

這里順便介紹一下pytorch loss函數(shù)里面 的reduction 參數(shù)

在新的pytorch版本里,使用reduction 參數(shù)取代了舊版本的size_average和reduce參數(shù)。

reduction 參數(shù)有三種選擇:

'elementwise_mean':為默認情況,表明對N個樣本的loss進行求平均之后返回(相當于reduce=True,size_average=True);

'sum':指對n個樣本的loss求和(相當于reduce=True,size_average=False);

'none':表示直接返回n分樣本的loss(相當于reduce=False)

補充:在Pytorch下,由于反向傳播設(shè)置錯誤導(dǎo)致 loss不下降的原因及解決方案

在Pytorch下,由于反向傳播設(shè)置錯誤導(dǎo)致 loss不下降的原因及解決方案

剛剛接觸深度學(xué)習(xí)一段時間,一直在研究計算機視覺方面,現(xiàn)在也在嘗試實現(xiàn)自己的idea,從中也遇見了一些問題,這次就專門寫一下,自己由于在反向傳播(backward)過程中參數(shù)沒有設(shè)置好,而導(dǎo)致的loss不下降的原因。

對于多個網(wǎng)絡(luò)交替

描述

簡單描述一下我的網(wǎng)絡(luò)結(jié)構(gòu),我的網(wǎng)絡(luò)是有上下兩路,先對第一路網(wǎng)絡(luò)進行訓(xùn)練,使用groud truth對這一路的結(jié)果進行監(jiān)督loss_steam1,得到訓(xùn)練好的feature.然后再將得到的feature級聯(lián)到第二路,通過網(wǎng)絡(luò)得到最后的結(jié)果,再用groud truth進行監(jiān)督loss。

整個網(wǎng)絡(luò)基于VGG19網(wǎng)絡(luò),在pytorch下搭建,有GPU環(huán)境:

在pytorch中使用loss反向傳播出現(xiàn)錯誤如何解決

出現(xiàn)的情況,loss_steam1不怎么下降

這個問題確實折麼自己一段時間,結(jié)果發(fā)現(xiàn)自己出現(xiàn)了一個問題,下面將對這個問題進行分析和解答:

PyTorch梯度傳遞

在PyTorch中,傳入網(wǎng)絡(luò)計算的數(shù)據(jù)類型必須是Variable類型, Variable包裝了一個Tensor,并且保存著梯度和創(chuàng)建這個Variablefunction的引用,換句話說,就是記錄網(wǎng)絡(luò)每層的梯度和網(wǎng)絡(luò)圖,可以實現(xiàn)梯度的反向傳遞.
則根據(jù)最后得到的loss可以逐步遞歸的求其每層的梯度,并實現(xiàn)權(quán)重更新。

在實現(xiàn)梯度反向傳遞時主要需要三步:

1、初始化梯度值:net.zero_grad() 清除網(wǎng)絡(luò)狀態(tài)

2、反向求解梯度:loss.backward() 反向傳播求梯度

3、更新參數(shù):optimizer.step() 更新參數(shù)

解決方案

自己在寫代碼的時候,還是沒有對自己的代碼搞明白。在反向求解梯度時,對第一路沒有進行反向傳播,這樣肯定不能使這一路的更新,所以我就又加了一步:

loss_steam1.backward( retain_graph = True) //因為每次運行一次backward時,如果不加retain_graph = True,運行完后,計算圖都會free掉。

loss.backward()

這樣就夠了么?我當時也是這么認為的結(jié)果發(fā)現(xiàn)loss_steam1還是沒有降,又愁了好久,結(jié)果發(fā)現(xiàn)梯度有了,不更新參數(shù),怎么可能有用!

optimizer_steam1.step() //這項必須加
optimizer.step()

pytorch的優(yōu)點

1.PyTorch是相當簡潔且高效快速的框架;2.設(shè)計追求最少的封裝;3.設(shè)計符合人類思維,它讓用戶盡可能地專注于實現(xiàn)自己的想法;4.與google的Tensorflow類似,F(xiàn)AIR的支持足以確保PyTorch獲得持續(xù)的開發(fā)更新;5.PyTorch作者親自維護的論壇 供用戶交流和求教問題6.入門簡單

看完上述內(nèi)容,你們掌握在pytorch中使用loss反向傳播出現(xiàn)錯誤如何解決的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI