pytorch 梯度NAN異常值的解決方案
pytorch 梯度NAN異常值
gradient 為nan可能原因:
1、梯度爆炸
2、學習率太大
3、數據本身有問題
4、backward時,某些方法造成0在分母上, 如:使用方法sqrt()
定位造成nan的代碼:
import torch # 異常檢測開啟 torch.autograd.set_detect_anomaly(True) # 反向傳播時檢測是否有異常值,定位code with torch.autograd.detect_anomaly(): loss.backward()
pytorch處理inf和nan數值
在構建網絡框架後,運行代碼,發現很多tensor出現瞭inf值或者nan,在很多博客上沒有找到對應的解決方法,大部分是基於numpy寫的,比較麻煩。
下面基於torch BIF函數實現替換這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,可能已經開啟瞭grad功能,需要把它先轉為普通tensor(使用.data)
torch.where(condition,T,F) 函數有三個輸入值,
第一個是判斷條件,
第二個是符合條件的設置值,
第三個是不符合條件的設置值
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.]])
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- PyTorch 如何自動計算梯度
- Pytorch中的backward()多個loss函數用法
- pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法
- pytorch_detach 切斷網絡反傳方式
- PyTorch梯度下降反向傳播