机器学习系列 八 - 3.How can I save a Keras model

如何在Keras中保存一个模型?

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

保存Keras 模型不推荐使用pickle 或者cPickle

你可以使用 model.save(filepath) 来保存一个Keras 模型到一个单独的HDF5文件中,它将包含如下:

  • 模型的结构, 允许重新创建模型
  • 模型的权重
  • training的配置(loss function, 优化器optimizer)
  • 优化器状态, 允许从之前停下的地方重新开始训练。

可以使用 keras.models.load_model(filepath) 来重新初始化你的模型。 load_model  将同样保证编译模型使用之前保存的training 配置(除非从未被编译过)

例子:

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')
保存、加载 模型的架构

如果你只想要保存一个模型的架构,而不包括权重和训练配置,你可以这么做:

# save as JSON
json_string = model.to_json()

# save as YAML
yaml_string = model.to_yaml()

生成JSON/ YAML 文件是人类可读文件,并且可编辑,如果需要的话。

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

# model reconstruction from JSON:
from keras.models import model_from_json
model = model_from_json(json_string)

# model reconstruction from YAML
from keras.models import model_from_yaml
model = model_from_yaml(yaml_string)
保存、加载仅模型的权重

如果你仅需要保存模型的权重,你可以在HDF5文件中使用如下代码

请注意你需要首先安装HDF5 并且包含python的h5py lib, 这些并没有在Keras中内建。

model.save_weights('my_model_weights.h5')

假设你有代码去厨师话你的模型,那么你这是可以加载你的权重用相同的架构:

model.load_weights('my_model_weights.h5')

如果你需要加载权重到一个不同的架构(拥有相同的层数),例如 微调 或者 转移学习, 你可以通过layer name来加载权重。

model.load_weights('my_model_weights.h5', by_name=True)

例如:

"""
Assuming the original model looks like this:
    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)
处理定制化layer(或其他定制化对象)在已经保存了的模型中

If the model you want to load includes custom layers or other custom classes or functions, you can pass them to the loading mechanism via the custom_objects argument:

如果你想要加载的模型包含了定制化的layers或者其他定制化对象或者方法,你可以把他们传递给加载机制 通过 custom_objects 参数。

from keras.models import load_model
# Assuming your model includes instance of an "AttentionLayer" class
model = load_model('my_model.h5', custom_objects={'AttentionLayer': AttentionLayer})

Alternatively, you can use a custom object scope:

作为一种选择,你可以使用定制化对象范围:

from keras.utils import CustomObjectScope

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

Custom objects handling works the same way for load_modelmodel_from_jsonmodel_from_yaml:

定制化对象处理 的工作方式起来跟 load_modelmodel_from_jsonmodel_from_yaml是一样的:

from keras.models import model_from_json
model = model_from_json(json_string, custom_objects={'AttentionLayer': AttentionLayer})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值