欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch loss反向傳播出錯(cuò)的解決方案

 更新時(shí)間:2021年05月12日 09:36:23   作者:liguiyuan112  
這篇文章主要介紹了pytorch loss反向傳播出錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

今天在使用pytorch進(jìn)行訓(xùn)練,在運(yùn)行 loss.backward() 誤差反向傳播時(shí)出錯(cuò) :

RuntimeError: grad can be implicitly created only for scalar outputs

File "train.py", line 143, in train
loss.backward()
File "/usr/local/lib/python3.6/dist-packages/torch/tensor.py", line 198, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph)
File "/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py", line 94, in backward
grad_tensors = _make_grads(tensors, grad_tensors)
File "/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py", line 35, in _make_grads
raise RuntimeError("grad can be implicitly created only for scalar outputs")
RuntimeError: grad can be implicitly created only for scalar outputs

問題分析:

因?yàn)槲覀冊(cè)趫?zhí)行 loss.backward() 時(shí)沒帶參數(shù),這與 loss.backward(torch.Tensor(1.0)) 是相同的,參數(shù)默認(rèn)就是一個(gè)標(biāo)量。

但是由于自己的loss不是一個(gè)標(biāo)量,而是二維的張量,所以就會(huì)報(bào)錯(cuò)。

解決辦法:

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

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

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

把張量的輸出修改為標(biāo)量,比如說多多個(gè)維度的loss求和或求均值等。此方法對(duì)于某些任務(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':為默認(rèn)情況,表明對(duì)N個(gè)樣本的loss進(jìn)行求平均之后返回(相當(dāng)于reduce=True,size_average=True);

'sum':指對(duì)n個(gè)樣本的loss求和(相當(dāng)于reduce=True,size_average=False);

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

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

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

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

對(duì)于多個(gè)網(wǎng)絡(luò)交替

描述

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

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

在這里插入圖片描述

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

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

PyTorch梯度傳遞

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

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

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

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

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

解決方案

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

loss_steam1.backward( retain_graph = True) //因?yàn)槊看芜\(yùn)行一次backward時(shí),如果不加retain_graph = True,運(yùn)行完后,計(jì)算圖都會(huì)free掉。

loss.backward()

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

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

哈哈!這樣就完成了,效果也確實(shí)比以前好了很多。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • python PyTorch預(yù)訓(xùn)練示例

    python PyTorch預(yù)訓(xùn)練示例

    這篇文章主要介紹了python PyTorch預(yù)訓(xùn)練示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • python中報(bào)錯(cuò)

    python中報(bào)錯(cuò)"json.decoder.JSONDecodeError: Expecting value:"的解決

    這篇文章主要介紹了python中報(bào)錯(cuò)"json.decoder.JSONDecodeError: Expecting value:"的解決方法 ,需要的朋友可以參考下
    2019-04-04
  • Python2.7讀取PDF文件的方法示例

    Python2.7讀取PDF文件的方法示例

    這篇文章主要介紹了Python2.7讀取PDF文件的方法,結(jié)合實(shí)例形式分析了Python2.7基于PDFMiner模塊實(shí)現(xiàn)針對(duì)pdf文件的讀取功能相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • Python接口測試環(huán)境搭建過程詳解

    Python接口測試環(huán)境搭建過程詳解

    這篇文章主要介紹了Python接口測試環(huán)境搭建過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • pycharm 在windows上編輯代碼用linux執(zhí)行配置的方法

    pycharm 在windows上編輯代碼用linux執(zhí)行配置的方法

    今天小編就為大家分享一篇pycharm 在windows上編輯代碼用linux執(zhí)行配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python基于opencv實(shí)現(xiàn)的人臉識(shí)別(適合初學(xué)者)

    Python基于opencv實(shí)現(xiàn)的人臉識(shí)別(適合初學(xué)者)

    OpenCV是一個(gè)基于BSD許可開源發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫,下面這篇文章主要給大家介紹了關(guān)于Python基于opencv實(shí)現(xiàn)的人臉識(shí)別,文中通過實(shí)例代碼介紹的非常詳細(xì),本文的教程非常適合初學(xué)者,需要的朋友可以參考下
    2022-03-03
  • Python實(shí)現(xiàn)直播推流效果

    Python實(shí)現(xiàn)直播推流效果

    這篇文章主要介紹了Python實(shí)現(xiàn)直播推流效果,主要是通過opencv讀取視頻對(duì)視頻分割為幀,本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 簡單學(xué)習(xí)Python多進(jìn)程Multiprocessing

    簡單學(xué)習(xí)Python多進(jìn)程Multiprocessing

    這篇文章主要和大家一起簡單的學(xué)習(xí)Python多進(jìn)程Multiprocessing ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • python 讀取串口數(shù)據(jù)的示例

    python 讀取串口數(shù)據(jù)的示例

    這篇文章主要介紹了python 讀取串口數(shù)據(jù)的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • HTTPX入門使用教程

    HTTPX入門使用教程

    HTTPX是一款Python棧HTTP客戶端庫,它提供了比標(biāo)準(zhǔn)庫更高級(jí)別、更先進(jìn)的功能,如連接重用、連接池、超時(shí)控制、自動(dòng)繁衍請(qǐng)求,下面通過本文介紹HTTPX入門知識(shí)和基本用法,感興趣的朋友一起看看吧
    2023-12-12

最新評(píng)論