在Keras中实现保存和加载权重及模型结构


Posted in Python onJune 15, 2020

1. 保存和加载模型结构

(1)保存为JSON字串

json_string = model.to_json()

(2)从JSON字串重构模型

from keras.models import model_from_json
model = model_from_json(json_string)

(3)保存为YAML字串

yaml_string = model.to_yaml()

(4)从YAML字串重构模型

model = model_from_yaml(yaml_string)

2. 保存和加载模型权重(参数)

from keras.models import load_model
 
# 创建HDF5文件'my_model.h5',保存模型参数
model.save('my_model.h5')
 
# 加载模型参数
load_model('my_model.h5')

2.1 处理已保存模型中的自定义层(或其他自定义对象)

如果要加载的模型包含自定义层或其他自定义类或函数,则可以通过 custom_objects 参数将它们传递给加载机制:

from keras.models import load_model
 
# 假设你的模型包含一个 AttentionLayer 类的实例
model = load_model('my_model.h5', custom_objects={'AttentionLayer': AttentionLayer})

或者,你可以使用 自定义对象作用域:

from keras.utils import CustomObjectScope
with CustomObjectScope({'AttentionLayer': AttentionLayer}):
  model = load_model('my_model.h5')

自定义对象的处理与 load_model, model_from_json, model_from_yaml 的工作方式相同:

from keras.models import model_from_json
model = model_from_json(json_string, custom_objects={'AttentionLayer': AttentionLayer})

2019年6月1号更新:

更详细的使用方法:

如何保存Keras模型?

(1)一个HDF5文件即保存模型的结构又保存模型的权重

我们不推荐使用pickle或cPickle来保存Keras模型。

你可以使用model.save(filepath)将Keras模型和权重保存在一个HDF5文件中,该文件将包含:

模型的结构,以便重构该模型

模型的权重

训练配置(损失函数,优化器等)

优化器的状态,以便于从上次训练中断的地方开始

使用keras.models.load_model(filepath)来重新实例化你的模型,如果文件中存储了训练配置的话,该函数还会同时完成模型的编译。

例子:

from keras.models import load_model
 
model.save('my_model.h5') # creates a HDF5 file 'my_model.h5'
del model # deletes the existing model
 
# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')

(2)只保存模型的结构

如果你只是希望保存模型的结构,而不包含其权重或配置信息,可以使用:

# save as JSON
json_string = model.to_json()
 
# save as YAML
yaml_string = model.to_yaml()

这项操作将把模型序列化为json或yaml文件,这些文件对人而言也是友好的,如果需要的话你甚至可以手动打开这些文件并进行编辑。

当然,你也可以从保存好的json文件或yaml文件中载入模型:

# model reconstruction from JSON:
from keras.models import model_from_json
model = model_from_json(json_string)
 
# model reconstruction from YAML
model = model_from_yaml(yaml_string)

(3)只保存模型的权重

如果需要保存模型的权重,可通过下面的代码利用HDF5进行保存。注意,在使用前需要确保你已安装了HDF5和其Python库h5py。

model.save_weights('my_model_weights.h5')

如果你需要在代码中初始化一个完全相同的模型,请使用:

model.load_weights('my_model_weights.h5')

如果你需要加载权重到不同的网络结构(有些层一样)中,例如fine-tune或transfer-learning,你可以通过层名字来加载模型:

model.load_weights('my_model_weights.h5', by_name=True)

例如:

"""
假如原模型为:
  model = Sequential()
  model.add(Dense(2, input_dim=3, name="dense_1"))
  model.add(Dense(3, name="dense_2"))
  ...
  model.save_weights(fname)
"""
# new model
model = Sequential()
model.add(Dense(2, input_dim=3, name="dense_1")) # will be loaded
model.add(Dense(10, name="new_dense")) # will not be loaded
 
# load weights from first model; will only affect the first layer, dense_1.
model.load_weights(fname, by_name=True)

以上这篇在Keras中实现保存和加载权重及模型结构就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
Python的多态性实例分析
Jul 07 Python
用Python实现KNN分类算法
Dec 22 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
TensorFlow损失函数专题详解
Apr 26 Python
python 正确保留多位小数的实例
Jul 16 Python
Django框架验证码用法实例分析
May 10 Python
python用for循环求和的方法总结
Jul 08 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
简单了解Python多态与属性运行原理
Jun 15 #Python
Python类super()及私有属性原理解析
Jun 15 #Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 #Python
Python StringIO及BytesIO包使用方法解析
Jun 15 #Python
Python smtp邮件发送模块用法教程
Jun 15 #Python
pandas数据处理之绘图的实现
Jun 15 #Python
keras中的loss、optimizer、metrics用法
Jun 15 #Python
You might like
PHP正确配置mysql(apache环境)
2011/08/28 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
跟老齐学Python之用while来循环
2014/10/02 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
化工工艺专业求职信
2013/09/22 职场文书
自荐书范文
2013/12/08 职场文书
初中学生操行评语
2014/12/26 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
稽核岗位职责范本
2015/04/13 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
初中政治教师教学反思
2016/02/23 职场文书
详解python字符串驻留技术
2021/05/21 Python
Django使用redis配置缓存的方法
2021/06/01 Redis