20

我有一个带有 kerasRegressor 的 scikit-learn 管道:

estimators = [
    ('standardize', StandardScaler()),
    ('mlp', KerasRegressor(build_fn=baseline_model, nb_epoch=5, batch_size=1000, verbose=1))
    ]
pipeline = Pipeline(estimators)

在训练管道之后,我正在尝试使用 joblib 保存到磁盘...

joblib.dump(pipeline, filename , compress=9)

但我收到一个错误:

RuntimeError:超出最大递归深度

您将如何将管道保存到磁盘?

4

2 回答 2

30

我在同样的问题上苦苦挣扎,因为没有直接的方法可以做到这一点。这是一个对我有用的hack。我将管道保存到两个文件中。第一个文件存储了 sklearn 管道的腌制对象,第二个文件用于存储 Keras 模型:

...
from keras.models import load_model
from sklearn.externals import joblib

...

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('estimator', KerasRegressor(build_model))
])

pipeline.fit(X_train, y_train)

# Save the Keras model first:
pipeline.named_steps['estimator'].model.save('keras_model.h5')

# This hack allows us to save the sklearn pipeline:
pipeline.named_steps['estimator'].model = None

# Finally, save the pipeline:
joblib.dump(pipeline, 'sklearn_pipeline.pkl')

del pipeline

以下是如何加载模型:

# Load the pipeline first:
pipeline = joblib.load('sklearn_pipeline.pkl')

# Then, load the Keras model:
pipeline.named_steps['estimator'].model = load_model('keras_model.h5')

y_pred = pipeline.predict(X_test)
于 2017-04-14T16:25:11.570 回答
1

Keras 与开箱即用的 pickle 不兼容。如果你愿意修补它,你可以修复它:https ://github.com/tensorflow/tensorflow/pull/39609#issuecomment-683370566 。

您还可以使用 SciKeras 库,它会为您执行此操作,并且可以替代KerasClassifierhttps ://github.com/adriangb/scikeras

披露:我是 SciKeras 以及那个 PR 的作者。

于 2020-09-02T22:05:49.770 回答