pytorch 梯度NAN異常值的解決方案
pytorch 梯度NAN異常值
gradient 為nan可能原因:
1、梯度爆炸
2、學(xué)習(xí)率太大
3、數(shù)據(jù)本身有問題
4、backward時,某些方法造成0在分母上, 如:使用方法sqrt()
定位造成nan的代碼:
import torch # 異常檢測開啟 torch.autograd.set_detect_anomaly(True) # 反向傳播時檢測是否有異常值,定位code with torch.autograd.detect_anomaly(): loss.backward()
pytorch處理inf和nan數(shù)值
在構(gòu)建網(wǎng)絡(luò)框架后,運行代碼,發(fā)現(xiàn)很多tensor出現(xiàn)了inf值或者nan,在很多博客上沒有找到對應(yīng)的解決方法,大部分是基于numpy寫的,比較麻煩。
下面基于torch BIF函數(shù)實現(xiàn)替換這2個值。
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.]])
簡單回顧
tips:對于某些tensor,可能已經(jīng)開啟了grad功能,需要把它先轉(zhuǎn)為普通tensor(使用.data)
torch.where(condition,T,F) 函數(shù)有三個輸入值,
第一個是判斷條件,
第二個是符合條件的設(shè)置值,
第三個是不符合條件的設(shè)置值
torch.full_like(input, fill_value, …) 返回與input相同size,單位值為fill_value的矩陣
#如下面這個例子,a為3*3的tensor
b =torch.full_like(a, 0,)
b
Out[165]:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
TensorFlow實現(xiàn)AutoEncoder自編碼器
這篇文章主要為大家詳細(xì)介紹了TensorFlow實現(xiàn)AutoEncoder自編碼器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
python人工智能tensorflow函數(shù)np.random模塊使用
這篇文章主要為大家介紹了python人工智能tensorflow函數(shù)np.random模塊使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python內(nèi)置數(shù)學(xué)函數(shù)和math模塊使用指南
這篇文章主要為大家介紹了Python數(shù)學(xué)函數(shù)math模塊使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
PyTorch 導(dǎo)數(shù)應(yīng)用的使用教程
這篇文章主要介紹了PyTorch 導(dǎo)數(shù)應(yīng)用的使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

