2016-06-23 29 views
5

Mam scikit-learn PipLine z kerasRegressor w nim:jak zapisać potrójny wykres nauki z keras regressor wewnątrz na dysk?

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

Po, szkolenie PipLine, Próbuję zapisać na dysku używając joblib ...

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

Ale jestem coraz błąd:

RuntimeError: maximum recursion depth exceeded

Jak zapisać rurociąg na dysku?

+0

Ty może wyglądać w koperku. Może to działa https://pypi.python.org/pypi/dill – Moritz

+0

Powinieneś po prostu zwiększyć wartość maksymalnej głębokości rekursji: http://stackoverflow.com/questions/3323001/maximum-recursion-depth – user1808924

Odpowiedz

4

Walczyłem z tym samym problemem, ponieważ nie ma bezpośrednich sposobów, aby to zrobić. Oto hack, który zadziałał dla mnie. Zapisałem mój potok w dwóch plikach. Pierwszy plik przechowywany jest kiszony przedmiot rurociągu sklearn a drugi był używany do przechowywania modelu 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 

A oto jak model można załadować z powrotem:

# 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

Próbowałem tego podejścia z KerasClassifier i mam błąd: Obiekt "KerasClassifier" nie ma atrybutu "zapisz". Czy jesteś pewien, że faktycznie nie robiłeś pipeline.named_steps ['estimator']. Model.model.save ('keras_model.h5')? W tym przypadku jednak wydaje się, że należałoby ponownie zawinąć obiekt KerasClassifier wokół załadowanego modelu. – JohnnyQ

+1

Tak, jestem absolutnie pewien. Po prostu sprawdzone po raz kolejny, działa jak urok :) (python 3.5.2, keras 2.0.8, sklearn 0.19.1) – constt