一文詳解loss.item()用法和注意事項(xiàng)
loss.item()用法
.item()方法是,取一個(gè)元素張量里面的具體元素值并返回該值,可以將一個(gè)零維張量轉(zhuǎn)換成int型或者float型,在計(jì)算loss,accuracy時(shí)常用到。
作用:
1.item()取出張量具體位置的元素元素值
2.并且返回的是該位置元素值的高精度值
3.保持原元素類型不變;必須指定位置4.節(jié)省內(nèi)存(不會(huì)計(jì)入計(jì)算圖)
import torch loss = torch.randn(2, 2) print(loss) print(loss[1,1]) print(loss[1,1].item())
輸出結(jié)果
tensor([[-2.0274, -1.5974],
[-1.4775, 1.9320]])
tensor(1.9320)
1.9319512844085693
其它:
loss = criterion(out, label)
loss_sum += loss # <--- 這里運(yùn)行著就發(fā)現(xiàn)顯存炸了,觀察發(fā)現(xiàn)隨著每個(gè)batch顯存消耗在不斷增大…因?yàn)檩敵龅膌oss的數(shù)據(jù)類型是Variable。PyTorch的動(dòng)態(tài)圖機(jī)制就是通過Variable來構(gòu)建圖。主要是使用Variable計(jì)算的時(shí)候,會(huì)記錄下新產(chǎn)生的Variable的運(yùn)算符號(hào),在反向傳播求導(dǎo)的時(shí)候進(jìn)行使用。如果這里直接將loss加起來,系統(tǒng)會(huì)認(rèn)為這里也是計(jì)算圖的一部分,也就是說網(wǎng)絡(luò)會(huì)一直延伸變大,那么消耗的顯存也就越來越大。
正確的loss一般是這樣寫
loss_sum += loss.data[0]
其它注意事項(xiàng):
使用loss += loss.detach()來獲取不需要梯度回傳的部分。
使用loss.item()直接獲得對(duì)應(yīng)的python數(shù)據(jù)類型。
補(bǔ)充閱讀,pytorch 計(jì)算圖
Pytorch的計(jì)算圖由節(jié)點(diǎn)和邊組成,節(jié)點(diǎn)表示張量或者Function,邊表示張量和Function之間的依賴關(guān)系。
Pytorch中的計(jì)算圖是動(dòng)態(tài)圖。這里的動(dòng)態(tài)主要有兩重含義。
第一層含義是:計(jì)算圖的正向傳播是立即執(zhí)行的。無需等待完整的計(jì)算圖創(chuàng)建完畢,每條語句都會(huì)在計(jì)算圖中動(dòng)態(tài)添加節(jié)點(diǎn)和邊,并立即執(zhí)行正向傳播得到計(jì)算結(jié)果。
第二層含義是:計(jì)算圖在反向傳播后立即銷毀。下次調(diào)用需要重新構(gòu)建計(jì)算圖。如果在程序中使用了backward方法執(zhí)行了反向傳播,或者利用torch.autograd.grad方法計(jì)算了梯度,那么創(chuàng)建的計(jì)算圖會(huì)被立即銷毀,釋放存儲(chǔ)空間,下次調(diào)用需要重新創(chuàng)建。
1,計(jì)算圖的正向傳播是立即執(zhí)行的。
import torch w = torch.tensor([[3.0,1.0]],requires_grad=True) b = torch.tensor([[3.0]],requires_grad=True) X = torch.randn(10,2) Y = torch.randn(10,1) Y_hat = X@w.t() + b # Y_hat定義后其正向傳播被立即執(zhí)行,與其后面的loss創(chuàng)建語句無關(guān) loss = torch.mean(torch.pow(Y_hat-Y,2)) print(loss.data) print(Y_hat.data)
tensor(17.8969)
tensor([[3.2613],
[4.7322],
[4.5037],
[7.5899],
[7.0973],
[1.3287],
[6.1473],
[1.3492],
[1.3911],
[1.2150]])
2,計(jì)算圖在反向傳播后立即銷毀。
import torch w = torch.tensor([[3.0,1.0]],requires_grad=True) b = torch.tensor([[3.0]],requires_grad=True) X = torch.randn(10,2) Y = torch.randn(10,1) Y_hat = X@w.t() + b # Y_hat定義后其正向傳播被立即執(zhí)行,與其后面的loss創(chuàng)建語句無關(guān) loss = torch.mean(torch.pow(Y_hat-Y,2)) #計(jì)算圖在反向傳播后立即銷毀,如果需要保留計(jì)算圖, 需要設(shè)置retain_graph = True loss.backward() #loss.backward(retain_graph = True) #loss.backward() #如果再次執(zhí)行反向傳播將報(bào)錯(cuò)
參考鏈接:
- https://www.zhihu.com/question/67209417/answer/344752405
- https://blog.csdn.net/cs111211/article/details/126221102
總結(jié)
到此這篇關(guān)于loss.item()用法和注意事項(xiàng)的文章就介紹到這了,更多相關(guān)loss.item()用法和注意事項(xiàng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python面向?qū)ο笾惖膬?nèi)置attr屬性示例
這篇文章主要介紹了Python面向?qū)ο笾惖膬?nèi)置attr屬性,結(jié)合實(shí)例形式分析了Python面向?qū)ο笾蓄惖膶傩韵嚓P(guān)定義、賦值、修改等操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12
python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析
這篇文章主要介紹了python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析的實(shí)例,幫助大家更好的理解和學(xué)習(xí)使用python。感興趣的朋友可以了解下2021-04-04
python自制簡(jiǎn)易mysql連接池的實(shí)現(xiàn)示例
本文主要介紹了python自制簡(jiǎn)易mysql連接池的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
PyTorch模型容器與AlexNet構(gòu)建示例詳解
這篇文章主要為大家介紹了PyTorch模型容器與AlexNet構(gòu)建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
python遞歸法實(shí)現(xiàn)簡(jiǎn)易連連看小游戲
這篇文章主要為大家詳細(xì)介紹了python遞歸法實(shí)現(xiàn)簡(jiǎn)易連連看小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
python+pytest接口自動(dòng)化之session會(huì)話保持的實(shí)現(xiàn)
在接口測(cè)試的過程中,經(jīng)常會(huì)遇到有些接口需要在登錄的狀態(tài)下才能請(qǐng)求,本文主要介紹了python+pytest接口自動(dòng)化之session會(huì)話保持的實(shí)現(xiàn),感興趣的可以了解一下2022-06-06
Python統(tǒng)計(jì)節(jié)假日剩余天數(shù)的腳本
過完春節(jié),盼著下一個(gè)節(jié)日,那么如何判斷距離節(jié)假日還有多少天呢?今天小編給大家介紹使用python腳本來解決這個(gè)問題,對(duì)Python統(tǒng)計(jì)節(jié)假日倒計(jì)時(shí)腳本感興趣的朋友一起看看吧2022-02-02

