在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语言的12个基础知识点小结
Jul 10 Python
Python安装第三方库的3种方法
Jun 21 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
python音频处理用到的操作的示例代码
Oct 27 Python
Python实现的生成格雷码功能示例
Jan 24 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
python async with和async for的使用
Jun 20 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
python Django框架快速入门教程(后台管理)
Jul 21 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
python的id()函数介绍
2013/02/10 Python
python生成验证码图片代码分享
2016/01/28 Python
Python字符串切片操作知识详解
2016/03/28 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
Java的五个基础面试题
2016/02/26 面试题
android面试问题与答案
2016/12/27 面试题
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
法制教育演讲稿
2014/09/10 职场文书
2015选调生工作总结
2015/07/24 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书