在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中bisect模块用法实例
Sep 25 Python
Python二分查找详解
Sep 13 Python
Python的条件语句与运算符优先级详解
Oct 13 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
Python generator生成器和yield表达式详解
Aug 08 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
教你用python实现12306余票查询
Jun 30 Python
Python实现打乒乓小游戏
Sep 25 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
详解python中的线程
2018/02/10 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
公益活动策划方案
2014/01/09 职场文书
小学生读书感言
2014/02/12 职场文书
小学评语大全
2014/04/22 职场文书
护士节活动总结
2014/08/29 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
浅析Python中的套接字编程
2021/06/22 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL