pytorch 梯度NAN異常值的解決方案
pytorch 梯度NAN異常值
gradient 為nan可能原因:
1、梯度爆炸
2、學(xué)習(xí)率太大
3、數(shù)據(jù)本身有問(wèn)題
4、backward時(shí),某些方法造成0在分母上, 如:使用方法sqrt()
定位造成nan的代碼:
import torch # 異常檢測(cè)開(kāi)啟 torch.autograd.set_detect_anomaly(True) # 反向傳播時(shí)檢測(cè)是否有異常值,定位code with torch.autograd.detect_anomaly(): loss.backward()
pytorch處理inf和nan數(shù)值
在構(gòu)建網(wǎng)絡(luò)框架后,運(yùn)行代碼,發(fā)現(xiàn)很多tensor出現(xiàn)了inf值或者nan,在很多博客上沒(méi)有找到對(duì)應(yīng)的解決方法,大部分是基于numpy寫(xiě)的,比較麻煩。
下面基于torch BIF函數(shù)實(shí)現(xiàn)替換這2個(gè)值。
a = torch.Tensor([[1, 2, np.nan], [np.inf, np.nan, 4], [3, 4, 5]]) a Out[158]: tensor([[1., 2., nan], [inf, nan, 4.], [3., 4., 5.]])
下面把nan值還為0:
a = torch.where(torch.isnan(a), torch.full_like(a, 0), a) a Out[160]: tensor([[1., 2., 0.], [inf, 0., 4.], [3., 4., 5.]])
接著把inf替換為1:
a = torch.where(torch.isinf(a), torch.full_like(a, 0), a) a Out[162]: tensor([[1., 2., 0.], [0., 0., 4.], [3., 4., 5.]])
簡(jiǎn)單回顧
tips:對(duì)于某些tensor,可能已經(jīng)開(kāi)啟了grad功能,需要把它先轉(zhuǎn)為普通tensor(使用.data)
torch.where(condition,T,F) 函數(shù)有三個(gè)輸入值,
第一個(gè)是判斷條件,
第二個(gè)是符合條件的設(shè)置值,
第三個(gè)是不符合條件的設(shè)置值
torch.full_like(input, fill_value, …) 返回與input相同size,單位值為fill_value的矩陣 #如下面這個(gè)例子,a為3*3的tensor b =torch.full_like(a, 0,) b Out[165]: tensor([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Windows下使Python2.x版本的解釋器與3.x共存的方法
這篇文章主要介紹了Windows下使Python2.x版本的解釋器與3.x共存的方法,命令行中調(diào)用起來(lái)很方便,需要的朋友可以參考下2015-10-10Python數(shù)據(jù)分析matplotlib折線圖案例處理
這篇文章主要介紹了Python數(shù)據(jù)分析matplotlib折線圖案例處理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08解決PySide+Python子線程更新UI線程的問(wèn)題
今天小編就為大家分享一篇解決PySide+Python子線程更新UI線程的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Pandas實(shí)現(xiàn)數(shù)據(jù)類(lèi)型轉(zhuǎn)換的一些小技巧匯總
這篇文章主要給大家匯總介紹了關(guān)于Pandas實(shí)現(xiàn)數(shù)據(jù)類(lèi)型轉(zhuǎn)換的一些小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05淺談python內(nèi)置函數(shù)callable的用法
這篇文章主要介紹了淺談python內(nèi)置函數(shù)callable的用法, callable函數(shù)可用于判斷一個(gè)對(duì)象是否可以被調(diào)用,若對(duì)象可以被調(diào)用則返回True,反之則返回False,需要的朋友可以參考下2023-04-04