佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > pytorch loss反向傳播出錯(cuò)的解決方案

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

熱門(mén)標(biāo)簽:電話(huà)運(yùn)營(yíng)中心 硅谷的囚徒呼叫中心 呼叫中心市場(chǎng)需求 客戶(hù)服務(wù) Win7旗艦版 語(yǔ)音系統(tǒng) 企業(yè)做大做強(qiáng) 百度AI接口

今天在使用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

問(wèn)題分析:

因?yàn)槲覀冊(cè)趫?zhí)行 loss.backward() 時(shí)沒(méi)帶參數(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)量,比如說(shuō)多多個(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ī)視覺(jué)方面,現(xiàn)在也在嘗試實(shí)現(xiàn)自己的idea,從中也遇見(jiàn)了一些問(wèn)題,這次就專(zhuān)門(mén)寫(xiě)一下,自己由于在反向傳播(backward)過(guò)程中參數(shù)沒(méi)有設(shè)置好,而導(dǎo)致的loss不下降的原因。

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

描述

簡(jiǎn)單描述一下我的網(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)到第二路,通過(guò)網(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è)問(wèn)題確實(shí)折麼自己一段時(shí)間,結(jié)果發(fā)現(xiàn)自己出現(xiàn)了一個(gè)問(wèn)題,下面將對(duì)這個(gè)問(wèn)題進(jìn)行分析和解答:

PyTorch梯度傳遞

在PyTorch中,傳入網(wǎng)絡(luò)計(jì)算的數(shù)據(jù)類(lèi)型必須是Variable類(lèi)型, Variable包裝了一個(gè)Tensor,并且保存著梯度和創(chuàng)建這個(gè)Variablefunction的引用,換句話(huà)說(shuō),就是記錄網(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ù)

解決方案

自己在寫(xiě)代碼的時(shí)候,還是沒(méi)有對(duì)自己的代碼搞明白。在反向求解梯度時(shí),對(duì)第一路沒(méi)有進(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還是沒(méi)有降,又愁了好久,結(jié)果發(fā)現(xiàn)梯度有了,不更新參數(shù),怎么可能有用!

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

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

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

您可能感興趣的文章:
  • pytorch 多個(gè)反向傳播操作
  • pytorch中的自定義反向傳播,求導(dǎo)實(shí)例
  • pytorch .detach() .detach_() 和 .data用于切斷反向傳播的實(shí)現(xiàn)
  • PyTorch: 梯度下降及反向傳播的實(shí)例詳解

標(biāo)簽:山西 崇左 安康 山西 長(zhǎng)沙 海南 喀什 濟(jì)南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pytorch loss反向傳播出錯(cuò)的解決方案》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266
    九龙城区| 吉林市| 莱阳市| 三都| 寿阳县| 镶黄旗| 手游| 张家界市| 汉川市| 芮城县| 堆龙德庆县| 稻城县| 铜鼓县| 奈曼旗| 新津县| 襄汾县| 黎川县| 河间市| 平阴县| 炎陵县| 华阴市| 柯坪县| 大安市| 香河县| 伽师县| 罗平县| 南部县| 株洲市| 德清县| 鹿泉市| 青冈县| 怀来县| 辽源市| 玉龙| 玉门市| 平顶山市| 方正县| 泸西县| 和硕县| 阿拉善盟| 孝感市|