如何在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_model
, model_from_json
, model_from_yaml
:
定制化对象处理 的工作方式起来跟 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})