前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Keras学习笔记(七)——如何保存、加载Keras模型?如何单独保存/加载权重、结构?

Keras学习笔记(七)——如何保存、加载Keras模型?如何单独保存/加载权重、结构?

作者头像
种花家的奋斗兔
发布2020-11-13 11:01:42
5.8K0
发布2020-11-13 11:01:42
举报
文章被收录于专栏:NLP小白的学习历程

一、如何保存 Keras 模型?

1.保存/加载整个模型(结构 + 权重 + 优化器状态)

不建议使用 pickle 或 cPickle 来保存 Keras 模型。

你可以使用 model.save(filepath) 将 Keras 模型保存到单个 HDF5 文件中,该文件将包含:

  • 模型的结构,允许重新创建模型
  • 模型的权重
  • 训练配置项(损失函数,优化器)
  • 优化器状态,允许准确地从你上次结束的地方继续训练。

你可以使用 keras.models.load_model(filepath) 重新实例化模型。load_model 还将负责使用保存的训练配置项来编译模型(除非模型从未编译过)。

例子:

代码语言:javascript
复制
from keras.models import load_model

model.save('my_model.h5')  # 创建 HDF5 文件 'my_model.h5'
del model  # 删除现有模型

# 返回一个编译好的模型
# 与之前那个相同
model = load_model('my_model.h5')

另请参阅如何安装 HDF5 或 h5py 以在 Keras 中保存我的模型?,查看有关如何安装 h5py 的说明。

2.只保存/加载模型的结构

如果您只需要保存模型的结构,而非其权重或训练配置项,则可以执行以下操作:

代码语言:javascript
复制
# 保存为 JSON
json_string = model.to_json()

# 保存为 YAML
yaml_string = model.to_yaml()

生成的 JSON/YAML 文件是人类可读的,如果需要还可以手动编辑。

你可以从这些数据建立一个新的模型:

代码语言:javascript
复制
# 从 JSON 重建模型:
from keras.models import model_from_json
model = model_from_json(json_string)

# 从 YAML 重建模型:
from keras.models import model_from_yaml
model = model_from_yaml(yaml_string)

3. 只保存/加载模型的权重

如果您只需要 模型的权重,可以使用下面的代码以 HDF5 格式进行保存。

请注意,我们首先需要安装 HDF5 和 Python 库 h5py,它们不包含在 Keras 中。

代码语言:javascript
复制
model.save_weights('my_model_weights.h5')

假设你有用于实例化模型的代码,则可以将保存的权重加载到具有相同结构的模型中:

代码语言:javascript
复制
model.load_weights('my_model_weights.h5')

如果你需要将权重加载到不同的结构(有一些共同层)的模型中,例如微调或迁移学习,则可以按层的名字来加载权重:

代码语言:javascript
复制
model.load_weights('my_model_weights.h5', by_name=True)

例子:

代码语言:javascript
复制
"""
假设原始模型如下所示:
    model = Sequential()
    model.add(Dense(2, input_dim=3, name='dense_1'))
    model.add(Dense(3, name='dense_2'))
    ...
    model.save_weights(fname)
"""

# 新模型
model = Sequential()
model.add(Dense(2, input_dim=3, name='dense_1'))  # 将被加载
model.add(Dense(10, name='new_dense'))  # 将不被加载

# 从第一个模型加载权重;只会影响第一层,dense_1
model.load_weights(fname, by_name=True)

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

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

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

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

代码语言:javascript
复制
from keras.utils import CustomObjectScope

with CustomObjectScope({'AttentionLayer': AttentionLayer}):
    model = load_model('my_model.h5')

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

代码语言:javascript
复制
from keras.models import model_from_json
model = model_from_json(json_string, custom_objects={'AttentionLayer': AttentionLayer})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、如何保存 Keras 模型?
    • 1.保存/加载整个模型(结构 + 权重 + 优化器状态)
      • 2.只保存/加载模型的结构
        • 3. 只保存/加载模型的权重
          • 4. 处理已保存模型中的自定义层(或其他自定义对象)
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档