在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 相关文章推荐
python中去空格函数的用法
Aug 21 Python
Python获取邮件地址的方法
Jul 10 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
python opencv实现运动检测
Jul 10 Python
python实现简单的单变量线性回归方法
Nov 08 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
简单分析python的类变量、实例变量
Aug 23 Python
python Shapely使用指南详解
Feb 18 Python
python logging设置level失败的解决方法
Feb 19 Python
python实现扫雷游戏
Mar 03 Python
Python数据正态性检验实现过程
Apr 18 Python
python中24小时制转换为12小时制的方法
Jun 18 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php读取xml实例代码
2010/01/28 PHP
php命名空间学习详解
2014/02/27 PHP
PHP生成压缩文件实例
2015/02/07 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
js 省地市级联选择
2010/02/07 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
Python中的闭包总结
2014/09/18 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
教师节联欢会主持词
2015/07/04 职场文书
python实现高效的遗传算法
2021/04/07 Python
OpenCV-Python实现油画效果的实例
2021/06/08 Python
swagger如何返回map字段注释
2021/07/03 Java/Android
nginx rewrite功能使用场景分析
2022/05/30 Servers