如何保存在sklearn/imblearn pipeline中经KerasClassifier封装的Keras模型
封装进Sklearn/Imblearn Pipeline的Keras模型保存方案说明
你提到的几种方法都是可以使用的,但是不同方法的适用场景和操作限制有区别:
- pickle/joblib
这是保存完整pipeline最简便的方案,可以直接序列化包含KerasClassifier/KerasRegressor的整个pipeline对象,不需要拆分预处理步骤和Keras模型。注意事项:该方法会同时序列化Keras模型的结构、权重以及pipeline所有步骤的参数,但是版本兼容性极差,加载环境的TensorFlow、Sklearn、Imblearn版本必须和保存时完全一致,否则大概率会出现加载报错,因此只适合临时保存同环境下复用的模型,不适合长期存档或跨环境共享。
- tf.keras.models.save_model / model.to_json()
这两类是Keras原生的模型保存方法,不能直接作用于整个pipeline,需要拆分pipeline分别保存,操作步骤如下:- 从训练完成的pipeline中提取Keras原生模型对象:
# 替换为你pipeline里KerasClassifier对应的步骤名称 keras_model = pipeline.named_steps['keras_clf'].model - 用Keras原生方法保存模型:
# 同时保存结构和权重 tf.keras.models.save_model(keras_model, "trained_keras_model.h5") # 如果用to_json方法需要额外单独保存权重 # model_json = keras_model.to_json() # with open("model_structure.json", "w") as f: # f.write(model_json) # keras_model.save_weights("model_weights.h5") - 清空Keras封装器的模型属性后,单独保存pipeline剩余部分:
pipeline.named_steps['keras_clf'].model = None joblib.dump(pipeline, "pipeline_without_keras.pkl")
model属性。注意事项:该方案保存的Keras模型兼容性更强,跨版本加载成功率远高于pickle/joblib直接序列化,更适合需要长期存档的模型。
- 从训练完成的pipeline中提取Keras原生模型对象:
内容的提问来源于stack exchange,提问作者TheodorosNikoleris
相关产品推荐
相关产品推荐

