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的Supervisor进行进程监控以及自动启动
May 29 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
实践Vim配置python开发环境
Jul 02 Python
python 自动去除空行的实例
Jul 24 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
python基于opencv实现人脸识别
Jan 04 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判断字符以及字符串的包含方法属性
2008/08/30 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
jQuery实现简单弹幕效果
2019/11/28 jQuery
vue实现输入框自动跳转功能
2020/05/20 Javascript
Python中的闭包总结
2014/09/18 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
python+django加载静态网页模板解析
2017/12/12 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python django model联合主键的例子
2019/08/06 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Python读写Excel表格的方法
2021/03/02 Python
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
十八届三中全会感言
2014/03/10 职场文书
财务部总监岗位职责
2014/03/12 职场文书
体育课课后反思
2014/04/24 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书