踩坑记之py2加载py3模型

用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的模型 -

参考:FAQ 常见问题解答 - Keras 中文文档

你可能感兴趣的:(踩坑记之py2加载py3模型)