2016-06-23 9 views
5

Ho un pipline scikit-learn con kerasRegressor in esso:come salvare una pipeline di scikit-learn con keras regressor all'interno del disco?

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

Dopo, la formazione del pipline, sto cercando di salvare su disco utilizzando joblib ...

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

Ma io sono sempre un errore:

RuntimeError: maximum recursion depth exceeded

Come si salverà la pipeline su disco?

+0

Si potrebbe guardare a aneto. Forse funziona https://pypi.python.org/pypi/dill – Moritz

+0

Dovresti semplicemente aumentare il valore della profondità massima della ricorsione: http://stackoverflow.com/questions/3323001/maximum-recursion-depth – user1808924

risposta

4

Ho lottato con lo stesso problema in quanto non ci sono modi diretti per farlo. Ecco un trucco che ha funzionato per me. Ho salvato la mia pipeline in due file. Il primo file memorizzato un oggetto in salamoia del gasdotto sklearn e la seconda è stata utilizzata per memorizzare il modello 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 

Ed ecco come il modello potrebbe essere caricato di nuovo:

# 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

Ho provato questo approccio con KerasClassifier e ho ricevuto l'errore: L'oggetto 'KerasClassifier' non ha attributo 'salva'. Sei sicuro di non aver fatto pipeline.named_steps ['estimator']. Model.model.save ('keras_model.h5')? In questo caso, tuttavia, sembra che si debba avvolgere nuovamente l'oggetto KerasClassifier attorno al modello caricato. – JohnnyQ

+1

Sì, ne sono assolutamente sicuro. Appena controllato ancora una volta, funziona come un fascino :) (python 3.5.2, keras 2.0.8, sklearn 0.19.1) – constt

Problemi correlati