浅谈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 流程控制实例代码
Sep 25 Python
python检测lvs real server状态
Jan 22 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
Pytest mark使用实例及原理解析
Feb 22 Python
django列表筛选功能的实现代码
Mar 27 Python
python实现简单坦克大战
Mar 27 Python
你需要学会的8个Python列表技巧
Jun 24 Python
python pillow库的基础使用教程
Jan 13 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 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中的integer类型使用分析
2010/07/27 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP中session变量的销毁
2014/02/27 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
高中毕业生的个人自我评价
2014/02/21 职场文书
校园广播稿范文
2015/08/19 职场文书
人事任命书范本
2015/09/21 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js