pytorch 梯度NAN异常值的解决方案


Posted in Python onJune 05, 2021

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.]])

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
python 使用get_argument获取url query参数
Apr 28 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
Python识别html主要文本框过程解析
Feb 18 Python
Python流程控制语句的深入讲解
Jun 15 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
python 实现汉诺塔游戏
Nov 28 Python
pytorch 权重weight 与 梯度grad 可视化操作
PyTorch 如何检查模型梯度是否可导
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 #Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 #Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 #Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 #Python
You might like
PHP中一个控制字符串输出的函数
2006/10/09 PHP
在普通HTTP上安全地传输密码
2007/07/21 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python+django快速实现文件上传
2016/10/24 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Django URL参数Template反向解析
2020/11/24 Python
python的setattr函数实例用法
2020/12/16 Python
美国温暖商店:The Warming Store
2018/12/15 全球购物
二年级体育教学反思
2014/01/15 职场文书
中国好声音华少广告词
2014/03/17 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
ipad隐藏软件app图标方法
2022/04/19 数码科技
vue特效之翻牌动画
2022/04/20 Vue.js