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" ) )
À 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.
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.
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()
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