浅谈keras.callbacks设置模型保存策略


Posted in Python onJune 18, 2020

如下所示:

keras.callbacks.ModelCheckpoint(self.checkpoint_path,
verbose=0, save_weights_only=True,mode="max",save_best_only=True),

默认是每一次poch,但是这样硬盘空间很快就会被耗光.

将save_best_only 设置为True使其只保存最好的模型,值得一提的是其记录的acc是来自于一个monitor_op,其默认为"val_loss",其实现是取self.best为 -np.Inf. 所以,第一次的训练结果总是被保存.

mode模式自动为auto 和 max一样,还有一个min的选项...应该是loss没有负号的时候用的....

https://keras.io/callbacks/ 浏览上面的文档.

# Print the batch number at the beginning of every batch.
batch_print_callback = LambdaCallback(
 on_batch_begin=lambda batch,logs: print(batch))
 
# Stream the epoch loss to a file in JSON format. The file content
# is not well-formed JSON but rather has a JSON object per line.
import json
json_log = open('loss_log.json', mode='wt', buffering=1)
json_logging_callback = LambdaCallback(
 on_epoch_end=lambda epoch, logs: json_log.write(
 json.dumps({'epoch': epoch, 'loss': logs['loss']}) + '\n'),
 on_train_end=lambda logs: json_log.close()
)
 
# Terminate some processes after having finished model training.
processes = ...
cleanup_callback = LambdaCallback(
 on_train_end=lambda logs: [
 p.terminate() for p in processes if p.is_alive()])
 
model.fit(...,
  callbacks=[batch_print_callback,
   json_logging_callback,
   cleanup_callback])

Keras的callback 一般在model.fit函数使用,由于Keras的便利性.有很多模型策略以及日志的策略.

比如 当loss不再变化时停止训练

keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto', baseline=None, restore_best_weights=False)

比如日志传送远程服务器等,以及自适应的学习率scheduler.

确实很便利....

补充知识:keras callbacks常用功能如ModelCheckpoint、ReduceLROnPlateau,EarlyStopping等

ModelCheckpoint:

keras.callbacks.ModelCheckpoint(filepath,monitor='val_loss',verbose=0,save_best_only=False, save_weights_only=False, mode='auto', period=1)

参数:

filename:字符串,保存模型的路径(可以将模型的准确率和损失等写到路径中,格式如下:)

ModelCheckpoint('model_check/'+'ep{epoch:d}-acc{acc:.3f}-val_acc{val_acc:.3f}.h5',monitor='val_loss')

还可以添加损失值等如

‘loss{loss:.3f}-val_loss{val_loss:.3f}'

monitor:需要检测的值如测试集损失或者训练集损失等

save_best_only:当设置为True时,监测值有改进时才会保存当前的模型

verbose:信息展示模式,0或1(当为1时会有如下矩形框的信息提示)

浅谈keras.callbacks设置模型保存策略

mode:‘auto',‘min',‘max'之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当监测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。

save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型

period:CheckPoint之间的间隔的epoch数

参考代码如下:

在使用时传递给fit中callbacks即可

checkpoint = ModelCheckpoint(log_dir + "ep{epoch:03d}-loss{loss:.3f}- 
        val_loss{val_loss:.3f}.h5",
        monitor='val_loss', save_weights_only=True, 
        save_best_only=True, period=1)
train_history=model.fit_generator(data_generator_wrap(),
         steps_per_epoch=max(1, num_train//batch_size),
        validation_data=data_generator_wrap(),
        validation_steps=max(1, num_val//batch_size),
        epochs=40,
        initial_epoch=0,callbacks=[logging, reduce_lr,checkpoint])

ReduceLROnPlateau:

keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)

当评价指标不在提升时,减少学习率

当学习停滞时,减少2倍或10倍的学习率常常能获得较好的效果。该回调函数检测指标的情况,如果在patience个epoch中看不到模型性能提升,则减少学习率

参数

monitor:被监测的量

factor:每次减少学习率的因子,学习率将以lr = lr*factor的形式被减少

patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发

mode:‘auto',‘min',‘max'之一,在min模式下,如果检测值触发学习率减少。在max模式下,当检测值不再上升则触发学习率减少。

epsilon:阈值,用来确定是否进入检测值的“平原区”

cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作

min_lr:学习率的下限

参考代码如下:

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)
train_history = model.fit(data(),validation_data=datae_g(),epochs=40,callbacks=[logging, reduce_lr, checkpoint])
EarlyStopping
keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')

当监测值不再改善时,该回调函数将中止训练

参数

monitor:需要监视的量

patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。

verbose:信息展示模式

mode:‘auto',‘min',‘max'之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练。

以上这篇浅谈keras.callbacks设置模型保存策略就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python文件操作类操作实例详解
Jul 11 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
django解决跨域请求的问题详解
Jan 20 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
浅谈Python中(&,|)和(and,or)之间的区别
Aug 07 Python
python 模拟贷款卡号生成规则过程解析
Aug 30 Python
python线程池如何使用
May 28 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
用python实现名片管理系统
Jun 18 #Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 #Python
python退出循环的方法
Jun 18 #Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 #Python
Python字符串格式化常用手段及注意事项
Jun 17 #Python
python代码区分大小写吗
Jun 17 #Python
python代码中怎么换行
Jun 17 #Python
You might like
用PHP连接Oracle数据库
2006/10/09 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
php 发送带附件邮件示例
2014/01/23 PHP
php生成随机颜色的方法
2014/11/13 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
新手入门常用代码集锦
2007/01/11 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
Node.js的特点详解
2017/02/03 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
高中班主任评语
2014/12/30 职场文书
党支部承诺书
2015/01/20 职场文书
百年校庆感言
2015/08/01 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python