web-dev-qa-db-fra.com

Comment décaper le modèle Keras?

Les documents officiels indiquent qu '"il n'est pas recommandé d'utiliser pickle ou cPickle pour enregistrer un modèle Keras."

Cependant, mon besoin de décaper le modèle de Keras découle de l'optimisation de l'hyperparamètre en utilisant RandomizedSearchCV de Sklearn (ou de tout autre optimiseur d'hyperparamètre). Il est essentiel de sauvegarder les résultats dans un fichier, car le script peut alors être exécuté à distance dans une session détachée, etc.

Essentiellement, je veux:

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

À partir de maintenant, les modèles Keras sont décapables. Mais nous recommandons toujours d'utiliser model.save() pour enregistrer le modèle sur le disque.

4
farizrahman4u

Cela fonctionne comme un charme 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. J'ai eu quelques problèmes, dus à ma model.to_json() soulevé TypeError('Not JSON Serializable:', obj) en raison d'une référence circulaire, et cette erreur a été avalée d'une manière ou d'une autre par le code ci-dessus, ce qui a pour conséquence que la fonction pickle est exécutée à jamais. 

3
Sida Zhou

UTILISEZ get_weights AND set_weights POUR SAUVER ET CHARGER LE MODÈLE, RESPECTIVEMENT.

Consultez ce lien: Impossible d’enregistrer DataFrame sur HDF5 ("le message d’en-tête de l’objet est trop volumineux")

#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

Vous pouvez choisir un réseau neuronal Keras en utilisant le module deploy-ml qui peut être installé via 

pip install deploy-ml

La formation complète et le déploiement d’un réseau de neurones kera à l’aide du wrapper deploy-ml se présentent comme suit:

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')

Le fichier Pickled contient le modèle, les métriques du test, une liste de noms de variables et leur ordre de saisie, la version de Keras et de python utilisée, et si un scaler est utilisé, il sera également stocké dans le fichier. fichier. La documentation est ici . Le chargement et l’utilisation du fichier se font comme suit:

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]

Je comprends que la formation peut être un peu restrictive. Deploy-ml prend en charge l’importation de votre propre modèle pour Sk-learn, mais cela fonctionne toujours sur cette prise en charge pour Keras. Cependant, j'ai découvert que vous pouvez créer un objet NeuralNetworkBase de type deploy-ml, définir votre propre réseau neuronal Keras en dehors de Deploy-ml et l'attribuer à l'attribut de modèle deploy-ml, ce qui fonctionne parfaitement:

 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