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切换hosts文件代码示例
Dec 31 Python
python 生成器协程运算实例
Sep 04 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
python中property和setter装饰器用法
Dec 19 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
Python 合并拼接字符串的方法
Jul 28 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
分享一个python的aes加密代码
Dec 22 Python
python_tkinter弹出对话框创建
Mar 20 Python
深入理解pytorch库的dockerfile
Jun 10 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读MYSQL中文乱码的解决方法
2006/12/17 PHP
php 远程关机操作的代码
2008/12/05 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
JavaScript 的继承
2011/10/01 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
Java中compareTo和compare的区别
2016/04/12 面试题
高中生毕业学习总结的自我评价
2013/11/14 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
2019各种承诺书范文
2019/06/24 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL