记录模型训练时loss值的变化情况


Posted in Python onJune 16, 2020

记录训练过程中的每一步的loss变化

if verbose and step % verbose == 0:
 sys.stdout.write('\r{} / {} : loss = {}'.format(
  step, total_steps, np.mean(total_loss)))
 sys.stdout.flush()
 if verbose:
 sys.stdout.write('\r') 
 sys.stdout.flush()

一般我们在训练神经网络模型的时候,都是每隔多少步,输出打印一下loss或者每一步打印一下loss,今天发现了另一种记录loss变化的方法,就是用

sys.stdout.write('\r{} / {} : loss = {}')

如图上的代码,可以记录每一个在每个epoch中记录用一行输出就可以记录每个step的loss值变化,

\r就是输出不会换行,因此如果你想同一样输出多次,在需要输出的字符串对象里面加上"\r",就可以回到行首了。

sys.stdout.flush() #一秒输出了一个数字

具体的实现就是下面的图:

记录模型训练时loss值的变化情况

这样在每个epoch中也可以观察loss变化,但是只需要打印一行,而不是每一行都输出。

补充知识:训练模型中损失(loss)异常分析

前言

训练模型过程中随时都要注意目标函数值(loss)的大小变化。一个正常的模型loss应该随训练轮数(epoch)的增加而缓慢下降,然后趋于稳定。虽然在模型训练的初始阶段,loss有可能会出现大幅度震荡变化,但是只要数据量充分,模型正确,训练的轮数足够长,模型最终会达到收敛状态,接近最优值或者找到了某个局部最优值。在模型实际训练过程中,可能会得到一些异常loss值,如loss等于nan;loss值忽大忽小,不收敛等。

下面根据自己使用Pythorh训练模型的经验,分析出一些具体原因和给出对应的解决办法。

一、输入数据

1. 数据的预处理

输入到模型的数据一般都是经过了预处理的,如用pandas先进行数据处理,尤其要注意空值,缺失值,异常值。

缺失值:数值类型(NaN),对象类型(None, NaN),时间类型(NaT)

空值:""

异常值:不再正常区间范围的值

例如对缺失值可以进行判断df.isnull()或者df.isna();丢弃df.dropna();填充df.fillna()等操作。

输入到模型中的数据一般而言都是数值类型的值,一定要保证不能出现NaN, numpy中的nan是一种特殊的float,该值数值运算的结果是不正常的,所以可能会导致loss值等于nan。可以用numpy.any(numpy.isnan(x))检查一下input和target。

2. 数据的读写

例如使用Pandas读取.csv类型的数据得到的DataFrame会添加默认的index,再写回到磁盘会多一列。如果用其他读取方式再读入,可能会导致数据有问题,读取到NaN。

import pandas as pd
 
Output = pd.read_csv('./data/diabetes/Output.csv')
trainOutput, testOutput = Output[:6000], Output[6000:]
trainOutput.to_csv('./data/diabetes/trainOutput.csv')
testOutput.to_csv('./data/diabetes/testOutput.csv')

记录模型训练时loss值的变化情况

3. 数据的格式

Pythorch中的 torch.utils.data.Dataset 类是一个表示数据集的抽象类。自己数据集的类应该继承自 Dataset 并且重写__len__方法和__getitem__方法:

__len__ : len(dataset) 返回数据集的大小

__getitem__ :用以支持索引操作, dataset[idx]能够返回第idx个样本数据

然后使用torch.utils.data.DataLoader 这个迭代器(iterator)来遍历所有的特征。具体可以参见这里

在构造自己Dataset类时,需要注意返回的数据格式和类型,一般不会出现NaN的情况但是可能会导致数据float, int, long这几种类型的不兼容,注意转换。

二、学习率

基于梯度下降的优化方法,当学习率太高时会导致loss值不收敛,太低则下降缓慢。需要对学习率等超参数进行调参如使用网格搜索,随机搜索等。

三、除零错

对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决。类似于计算概率时进行的平滑修正,下面的代码片段中loss使用交叉混合熵(CossEntropy),计算3分类问题的AUC值,为了避免概率计算出现NaN而采取了相应的平滑处理。

from sklearn.metrics import roc_auc_score
 
model_ft, y_true, losslists = test_model(model_ft, criterion, optimizer)
n_class = 3
y_one_hot = np.eye(n_class)[y_true.reshape(-1)]
# solve divide zero errot
eps = 0.0000001
y_scores = losslists / (losslists.sum(axis=1, keepdims=True)+eps)
#print(y_scores)
#print(np.isnan(y_scores))
"""
metrics.roc_auc_score(y_one_hot, y_pred)
"""
print("auc: ")
roc_auc_score(y_one_hot, y_scores)

四、loss函数

loss函数代码编写不正确或者已经编写好的loss函数API使用不清楚

五、某些易错代码

Pytorch在进行自动微分的时候,默认梯度是会累加的,所以需要在每个epoch的每个batch中对梯度清零,否则可能会导致loss值不收敛。不要忘记添加如下代码

optimizer.zero_grad()

以上这篇记录模型训练时loss值的变化情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
Python实现代码统计工具(终极篇)
Jul 04 Python
详解Django rest_framework实现RESTful API
May 24 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
numpy np.newaxis 的实用分享
Nov 30 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
python爬虫实例之获取动漫截图
May 31 Python
Python requests模块安装及使用教程图解
Jun 30 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 Python
python实现批量转换图片为黑白
Jun 16 #Python
在keras中实现查看其训练loss值
Jun 16 #Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 #Python
Keras在训练期间可视化训练误差和测试误差实例
Jun 16 #Python
如何在Windows中安装多个python解释器
Jun 16 #Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 #Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 #Python
You might like
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
Python正则表达式经典入门教程
2017/05/22 Python
Python实现的弹球小游戏示例
2017/08/01 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
pandas中去除指定字符的实例
2018/05/18 Python
python 循环数据赋值实例
2019/12/02 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
我的教育故事演讲稿
2014/05/04 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
预备党员群众意见
2015/06/01 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
初中军训感言
2015/08/01 职场文书
2016年第二十届“母亲节暨幸福工程救助贫困母亲活动日”活动总结
2016/04/06 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers