最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch loss反向傳播出錯的解決方案

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

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

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

問題分析:

因為我們在執(zhí)行 loss.backward() 時沒帶參數(shù),這與 loss.backward(torch.Tensor(1.0)) 是相同的,參數(shù)默認(rèn)就是一個標(biāo)量。

但是由于自己的loss不是一個標(biāo)量,而是二維的張量,所以就會報錯。

解決辦法:

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

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

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

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

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

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

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

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

剛剛接觸深度學(xué)習(xí)一段時間,一直在研究計算機(jī)視覺方面,現(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ò)進(jìn)行訓(xùn)練,使用groud truth對這一路的結(jié)果進(jìn)行監(jiān)督loss_steam1,得到訓(xùn)練好的feature.然后再將得到的feature級聯(lián)到第二路,通過網(wǎng)絡(luò)得到最后的結(jié)果,再用groud truth進(jìn)行監(jiān)督loss。

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

在這里插入圖片描述

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

這個問題確實折麼自己一段時間,結(jié)果發(fā)現(xiàn)自己出現(xiàn)了一個問題,下面將對這個問題進(jì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ù)

解決方案

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

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

loss.backward()

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

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

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

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

相關(guān)文章

  • python實現(xiàn)人民幣大寫轉(zhuǎn)換

    python實現(xiàn)人民幣大寫轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)人民幣大寫轉(zhuǎn)換的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 用python實現(xiàn)批量重命名文件的代碼

    用python實現(xiàn)批量重命名文件的代碼

    任務(wù)很簡單,某個目錄下面有幾千個文件,某些文件沒有后綴名,現(xiàn)在的任務(wù)就是將所有的沒有后綴名的文件加上后綴名,python有現(xiàn)成的函數(shù)可以實現(xiàn),但是在實現(xiàn)過程中遇到幾個問題,分享一下解決方法
    2012-05-05
  • 在pycharm創(chuàng)建scrapy項目的實現(xiàn)步驟

    在pycharm創(chuàng)建scrapy項目的實現(xiàn)步驟

    這篇文章主要介紹了在pycharm創(chuàng)建scrapy項目的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • django初始化數(shù)據(jù)庫的實例

    django初始化數(shù)據(jù)庫的實例

    今天小編就為大家分享一篇django初始化數(shù)據(jù)庫的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 基于Python手寫拼音識別

    基于Python手寫拼音識別

    這篇文章主要介紹了基于Python手寫拼音識別,因項目組需要使用到拼寫識別,考慮到每個字母的復(fù)雜度不高,所以使用KNN算法來嘗試實現(xiàn),下面來看看具體實現(xiàn)詳情吧,需要的小伙伴也可以參考一下
    2022-01-01
  • 基于opencv實現(xiàn)手勢控制音量(案例詳解)

    基于opencv實現(xiàn)手勢控制音量(案例詳解)

    這篇文章主要介紹了基于opencv的手勢控制音量和ai換臉,通過定義了一個名為 handDetector 的類,用于檢測和跟蹤手部,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 利用python爬取古詩文網(wǎng)中各類古詩的方法

    利用python爬取古詩文網(wǎng)中各類古詩的方法

    這篇文章主要介紹了利用python爬取古詩文網(wǎng)中各類古詩的方法,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • python中reload(module)的用法示例詳解

    python中reload(module)的用法示例詳解

    與from和import相比,reload是內(nèi)置函數(shù),而不是語句,下面這篇文章主要給大家介紹了關(guān)于python中reload(module)用法的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-09-09
  • Django模型序列化返回自然主鍵值示例代碼

    Django模型序列化返回自然主鍵值示例代碼

    這篇文章主要給大家介紹了關(guān)于Django模型序列化返回自然主鍵值的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python3中字符串的常用操作方法及查找方法

    Python3中字符串的常用操作方法及查找方法

    這篇文章主要介紹了Python3中字符串的常用操作方法及查找方法,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

江阴市| 沂源县| 天门市| 东海县| 长岛县| 浦东新区| 合肥市| 沁水县| 中超| 普兰店市| 枣强县| 上思县| 堆龙德庆县| 北川| 桑日县| 太仓市| 盐山县| 海阳市| 鹰潭市| 景宁| 文成县| 东阿县| 阿鲁科尔沁旗| 清镇市| 鄂温| 东阳市| 根河市| 曲沃县| 巧家县| 苏尼特右旗| 石林| 乌兰县| 衡山县| 锡林郭勒盟| 环江| 嵩明县| 张家界市| 衡阳县| 哈巴河县| 龙州县| 甘泉县|