it-swarm.com.de

Wie wird das Keras-Modell eingelegt?

In offiziellen Dokumenten heißt es: "Es wird nicht empfohlen, zum Speichern eines Keras-Modells pickle oder cPickle zu verwenden."

Mein Bedarf für das Keras-Modell zum Beizen stammt jedoch aus der Hyperparameter-Optimierung mit RandomizedSearchCV (oder anderen Hyperparameter-Optimierern) von sklearn. Die Ergebnisse müssen unbedingt in einer Datei gespeichert werden, da das Skript dann in einer separaten Sitzung remote ausgeführt werden kann.

Im Wesentlichen möchte ich:

trial_search = RandomizedSearchCV( estimator=keras_model, ... )
pickle.dump( trial_search, open( "trial_search.pickle", "wb" ) )
5
Sida Zhou

Keras-Modelle sind ab sofort pickle-fähig. Wir empfehlen jedoch weiterhin die Verwendung von model.save(), um das Modell auf der Festplatte zu speichern.

4
farizrahman4u

Dies funktioniert wie ein Zauber http://zachmoshe.com/2017/04/03/pickling-keras-models.html :

import types
import tempfile
import keras.models

def make_keras_picklable():
    def __getstate__(self):
        model_str = ""
        with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
            keras.models.save_model(self, fd.name, overwrite=True)
            model_str = fd.read()
        d = { 'model_str': model_str }
        return d

    def __setstate__(self, state):
        with tempfile.NamedTemporaryFile(suffix='.hdf5', delete=True) as fd:
            fd.write(state['model_str'])
            fd.flush()
            model = keras.models.load_model(fd.name)
        self.__dict__ = model.__dict__


    cls = keras.models.Model
    cls.__getstate__ = __getstate__
    cls.__setstate__ = __setstate__

make_keras_picklable()

PS. Ich hatte einige Probleme, weil meine model.to_json() aufgrund eines Zirkelverweises TypeError('Not JSON Serializable:', obj) ausgelöst hatte, und dieser Fehler wurde durch den obigen Code verschluckt, so dass die Pickle-Funktion für immer ausgeführt wird. 

3
Sida Zhou

VERWENDEN Sie get_weights UND set_weights, UM DAS MODEL ZU SPEICHERN UND ZU LADEN, ANSTEHEN.

Schauen Sie sich diesen Link an: DataFrame kann nicht in HDF5 gespeichert werden ("Objektkopfnachricht ist zu groß")

#for heavy model architectures, .h5 file is unsupported.
weigh= model.get_weights();    pklfile= "D:/modelweights.pkl"
try:
    fpkl= open(pklfile, 'wb')    #Python 3     
    pickle.dump(weigh, fpkl, protocol= pickle.HIGHEST_PROTOCOL)
    fpkl.close()
except:
    fpkl= open(pklfile, 'w')    #Python 2      
    pickle.dump(weigh, fpkl, protocol= pickle.HIGHEST_PROTOCOL)
    fpkl.close()
1
Anurag Gupta

Sie können ein neuronales Keras-Netzwerk mit Hilfe des deploy-ml-Moduls aufnehmen, das über pip installiert werden kann 

pip install deploy-ml

Die vollständige Schulung und Bereitstellung eines kera neuronalen Netzwerks mit dem deploy-ml-Wrapper sieht folgendermaßen aus:

import pandas as pd
from deployml.keras import NeuralNetworkBase


# load data 
train = pd.read_csv('example_data.csv')

# define the moel 
NN = NeuralNetworkBase(hidden_layers = (7, 3),
                   first_layer=len(train.keys())-1, 
                   n_classes=len(train.keys())-1)

# define data for the model 
NN.data = train

# define the column in the data you're trying to predict
NN.outcome_pointer = 'paid'

# train the model, scale means that it's using a standard 
# scaler to scale the data
NN.train(scale=True, batch_size=100)

NN.show_learning_curve()

# display the recall and precision 
NN.evaluate_outcome()

# Pickle your model
NN.deploy_model(description='Keras NN',
            author="maxwell flitton", organisation='example',
            file_name='neural.sav')

Die Pickled-Datei enthält das Modell, die Metriken aus dem Test, eine Liste der Variablennamen und deren Reihenfolge, in der sie eingegeben werden müssen, die Version von Keras und Python, und wenn ein Scaler verwendet wird, wird er auch in der gespeichert Datei. Dokumentation ist hier . Das Laden und Verwenden der Datei geschieht folgendermaßen:

import pickle

# use pickle to load the model 
loaded_model = pickle.load(open("neural.sav", 'rb'))

# use the scaler to scale your data you want to input 
input_data = loaded_model['scaler'].transform([[1, 28, 0, 1, 30]])

# get the prediction 
loaded_model['model'].predict(input_data)[0][0]

Ich schätze, dass das Training etwas restriktiv sein kann. Deploy-ml unterstützt das Importieren Ihres eigenen Modells für Sk-learn, es arbeitet jedoch weiterhin an dieser Unterstützung für Keras. Ich habe jedoch herausgefunden, dass Sie ein NeuralNetworkBase-Objekt von deploy-ml erstellen, Ihr eigenes neuronales Keras-Netzwerk außerhalb von Deploy-ml definieren und es dem Modellattribut deploy-ml zuordnen können.

 NN = NeuralNetworkBase(hidden_layers = (7, 3),
               first_layer=len(train.keys())-1, 
               n_classes=len(train.keys())-1)

NN.model = neural_network_you_defined_yourself
1
max89