2016-06-23 8 views
5

Ich habe eine Scikit-Learn pipline mit kerasRegressor drin:Wie speichere ich eine scikit-learn Pipline mit Keras Regressor auf der Festplatte?

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

Nach dem pipline Training, ich versuche, auf der Festplatte zu speichern JOBLIB mit ...

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

Aber ich bin immer ein Fehler:

RuntimeError: maximum recursion depth exceeded

Wie würden Sie die Pipeline auf Festplatte speichern?

+0

Sie aussehen könnte, bei Dill. Vielleicht funktioniert es https://pypi.python.org/pypi/dill – Moritz

+0

Sie sollten einfach den Wert der maximalen Rekursionstiefe erhöhen: http://stackoverflow.com/questions/3323001/maximum-recursion-depth – user1808924

Antwort

4

Ich hatte mit dem gleichen Problem zu kämpfen, da es keine direkten Möglichkeiten gibt, dies zu tun. Hier ist ein Hack, der für mich funktioniert hat. Ich habe meine Pipeline in zwei Dateien gespeichert. Die erste Datei, die eine eingelegte Aufgabe der sklearn Pipeline und die zweite gespeichert wurde verwendet, um die Keras Modell zu speichern:

... 
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 

Und hier ist, wie das Modell zurückgeladen werden:

# 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) 
+0

Ich versuchte diesen Ansatz mit KerasClassifier und ich habe Fehler: 'KerasClassifier' Objekt hat kein Attribut 'speichern'. Sind Sie sicher, dass Sie nicht wirklich pipeline.named_steps ['estimator']. Model.model.save ('keras_model.h5') ausgeführt haben? In diesem Fall scheint es jedoch, dass das KerasClassifier-Objekt erneut um das geladene Modell gewickelt werden muss. – JohnnyQ

+1

Ja, ich bin mir absolut sicher. Nur noch einmal überprüft, es funktioniert wie ein Charme :) (Python 3.5.2, Keras 2.0.8, Sklearn 0.19.1) – constt