在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 StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
PyCharm如何导入python项目的方法
Feb 06 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
python中tab键是什么意思
Jun 18 Python
Keras搭建自编码器操作
Jul 03 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 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
极典R601SW收音机
2021/03/02 无线电
php获取地址栏信息的代码
2008/10/08 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
Python写的一个简单监控系统
2015/06/19 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
python最长回文串算法
2018/06/04 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
详解Python文件修改的两种方式
2019/08/22 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
英国著名书店:Foyles
2018/12/01 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
C#怎么让一个窗口居中显示?
2015/10/20 面试题
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
行政助理的职责
2013/11/14 职场文书
学习标兵获奖感言
2014/02/20 职场文书
化验室安全管理制度
2015/08/06 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
乔迁新居祝福语
2019/11/04 职场文书
Rust中的Struct使用示例详解
2022/08/14 Javascript