记录模型训练时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实现基于权重的随机数2种方法
Apr 28 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
python非递归全排列实现方法
Apr 10 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
python如何在循环引用中管理内存
Mar 20 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python实现二维数组的对角线遍历
Mar 02 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
Python使用Excel将数据写入多个sheet
May 16 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 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
一次编写,随处运行
2006/10/09 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
JS中的异常处理方法分享
2013/12/22 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
PyQt5组件读取参数的实例
2019/06/25 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Python多线程thread及模块使用实例
2020/04/28 Python
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
大一期末自我鉴定
2013/12/13 职场文书
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
国际贸易专业求职信
2014/06/04 职场文书
计划生育证明格式范本
2014/09/12 职场文书
企业党员个人自我评价
2014/09/20 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
2015年招生工作总结
2015/05/04 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏