用Python3训练了一个模型,然后需要在Python2代码中加载这个模型。
通常情况下(只用Python2或者Python3),Keras保存和加载模型的方式
1、直接保存、加载
from keras.models import load_model
model.save('my_model.h5') # 创建 HDF5 文件 'my_model.h5'
del model # 删除现有模型
# 返回一个编译好的模型
# 与之前那个相同model = load_model('my_model.h5')
2、模型和权重分开保存
保存、加载模型
# 保存为 JSON
json_string = model.to_json()
# 保存为 YAML
yaml_string = model.to_yaml()
# 从 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)
保存、加载权重
model.save_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5')
现在的情况是:
模型是用Python3训练的,含有一个自定义Layer,要在Python2代码中加载这个模型
a、用第1种方法,报错 bad marshal
b、用第二种方法,在加载模型的时候同样报错 bad marshal
c、尝试使用joblib 在Python3代码中直接保存model对象,然后在Python2代码中load. joblib dump 时设置 protocol=2。但是在dump时报错,具体错误信息忘了
d、在Python2中使用model.to_json()保存一份模型(有用Python2训练的其他低分模型),然后在加载代码中,使用model_from_json加载模型,再使用model.load_weights 加载高分模型的权重。 这种方法成功。
注:Keras中加载含有自定义层的模型,要在 load_model或者model_from_json等函数中加入custom_objects参数,详见:Keras加载含有自定义Layer的模型 - 简书