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正则表达式re模块详解
Jun 25 Python
跟老齐学Python之大话题小函数(2)
Oct 10 Python
Python中实现三目运算的方法
Jun 21 Python
python提取字典key列表的方法
Jul 11 Python
Python操作mongodb的9个步骤
Jun 04 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
谈谈Python中的while循环语句
Mar 10 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
python 中yaml文件用法大全
Jul 04 Python
Python中super().__init__()测试以及理解
Dec 06 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
JS数组去重的6种方法完整实例
2018/12/08 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python的另外几种语言实现
2015/01/29 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
家长会演讲稿范文
2014/01/10 职场文书
校园文化建设方案
2014/02/03 职场文书
企业内部培训方案
2014/02/04 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
文化建设工作方案
2014/05/12 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python