Comment importer une sauvés Tensorflow modèle de train à l'aide de tf.estimateur et de prédire les données d'entrée.
J'ai enregistrer le modèle à l'aide de tf.estimateur .méthode export_savedmodel comme suit:
export_dir="exportModel/"
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
classifier.export_savedmodel(export_dir, input_receiver_fn, as_text=False, checkpoint_path="Model/model.ckpt-400")
Comment puis-je importer ce modèle enregistré et de l'utilisation des prévisions?
- Pouvez-vous nous dire un peu plus sur l'environnement dans lequel vous souhaitez effectuer des prédictions? Voulez-vous simplement à écrire un Python application qui charge le modèle dans le même processus et effectue une prédiction? Voulez-vous lancer votre propre production de qualité de service pour servir votre modèle? Voulez-vous utiliser un service géré dans le cloud?
- Maintenant, je suis en train d'écrire un script python pour charger le modèle et effectuer la prédiction.
- Exemple de export_savedmodel fonction
Vous devez vous connecter pour publier un commentaire.
J'ai essayé à la recherche d'un bon exemple de base, mais il semble que la documentation et les échantillons sont un peu dispersés pour ce sujet. Donc, nous allons commencer avec un exemple de base: la tf.estimateur démarrage rapide.
L'exemple particulier n'est pas réellement de l'exportation d'un modèle, nous allons donc le faire (pas besoin pour les cas d'utilisation 1):
Énorme astérisque sur ce code: il semble y avoir un bug dans TensorFlow 1.3 qui ne vous autorise pas à le faire ci-dessus à l'exportation sur un "boîtes" d'estimateur (comme DNNClassifier). Pour une solution de contournement, voir "Annexe: solution de Contournement" de cet article.
Le code ci-dessous des références
export_dir
(valeur de retour à partir de l'étape d'exportation) de souligner qu'il est pas "/chemin/vers/modèle", mais plutôt un sous-répertoire de ce répertoire dont le nom est un timestamp.Cas d'utilisation 1: Effectuer la prédiction dans le même processus que la formation
C'est une sci-kit d'apprendre type d'expérience, et est déjà illustré par l'exemple. À des fins d'exhaustivité, il vous suffit d'appeler
predict
sur le modèle appris:Cas d'utilisation 2: Charger un SavedModel en Python/Java/C++ et d'effectuer des prédictions
Client Python
Peut-être la chose la plus facile à utiliser si vous voulez faire de la prédiction en Python est SavedModelPredictor. Dans le programme en Python qui va utiliser le
SavedModel
, nous avons besoin de code comme ceci:Client Java
C++ Client
Vous aurez probablement envie d'utiliser
tensorflow::LoadSavedModel
avecSession
.Cas d'utilisation 3: Servir d'un modèle à l'aide de TensorFlow Servir
L'exportation des modèles d'une manière susceptible de servir un Modèle de Classification exige que l'entrée soit un
tf.Example
objet. Voici comment nous pourrions exporter un modèle pour TensorFlow portion:Le lecteur est renvoyé à TensorFlow Servir de documentation pour plus d'instructions sur la configuration de la TensorFlow Servir, donc je vais seulement fournir le code de client ici:
Noter que la clé,
examples
, qui est référencé dans lapredict_request.inputs
doit correspondre à la clé utilisée dans leserving_input_receiver_fn
à l'exportation du temps (cf. le constructeur deServingInputReceiver
dans ce code).Annexe: Travail autour de l'exportation de Conserves de Modèles TF 1.3
Il semble y avoir un bug dans TensorFlow 1.3 qui conserve les modèles à ne pas exporter correctement pour les cas d'utilisation 2 (le problème n'existe pas pour "personnalisé" des estimateurs). Ici, c'est une solution de contournement qui encapsule une DNNClassifier de faire fonctionner les choses, en particulier pour l'Iris exemple:
classes
clé contient les noms de classes correspondant à la marque dans lesscores
de sortie. Cependant, je ne crois pas que vous pouvez faire des n premiers, encore. Donc, ce que vous obtenez enclasses
est juste la liste des classes, dans l'ordre, répété pour chaque sortie. Pour obtenir le prédit de classe, vous avez deux options: (1) écrire une coutume estimateur (éventuellement emballage DNNClassifier ou similaire pour faire le travail difficile) (2) le client prendre la argmax descores
SavedModel
à.pb
format. LeSavedModel
a été exporté à l'aide deestimator.export_savedmodel
, je peux charger ce facteur prédictif à l'aide detf.contrib.predictor.from_saved_model(saved_model_dir)
.tf.estimator.export.ServingInputReceiver(features,feature_placeholders)
et d'économie d'entrée en fonction à l'aide deestimator.export_savedmodel(export_dir, csv_serving_input_fn_vtwo)
j'ai obtenu l'erreur suivante ValueError: trop de valeurs pour décompresser (prévue pour le 2)features
etfeature_placeholders
est un dict. Si vous rencontrez toujours des problèmes, compte tenu de la création d'une nouvelle question.Je ne pense pas qu'il y a un bug avec les conserves de Estimateurs (ou plutôt, si jamais il y avait un, il a été corrigé). J'ai été en mesure de réussir à l'exportation en conserve estimateur du modèle à l'aide de Python et de l'importer Java.
Voici mon code pour exporter le modèle:
D'importer le modèle en Java, j'ai utilisé le client Java code fourni par rhaertel80 ci-dessus et il fonctionne. Espérons que cela répond aussi à Ben Fowler est question ci-dessus.
Il semble que la TensorFlow de l'équipe n'est pas d'accord qu'il y a un bug dans la version 1.3 en utilisant des conserves de estimateurs pour l'exportation d'un modèle de cas d'utilisation #2. J'ai envoyé un rapport de bug ici:
https://github.com/tensorflow/tensorflow/issues/13477
La réponse que j'ai reçue de TensorFlow est que l'entrée ne doivent l'être qu'une seule chaîne de tenseur. Il semble qu'il y a peut être un moyen de regrouper plusieurs fonctions dans une seule chaîne à l'aide du tenseur de sérialisé TF.des exemples, mais je n'ai pas trouvé une méthode claire pour ce faire. Si quelqu'un a le code montrant comment le faire, je serais reconnaissant.
Vous avez besoin d'exporter le modèle enregistré à l'aide de tf.contrib.export_savedmodel et vous avez besoin de définir d'entrée de récepteur de fonction pour passer d'entrée pour.
Plus tard, vous pouvez charger le modèle enregistré ( en général épargnés.de modèle.pb) à partir du disque et de le servir.
TensorFlow: Comment prédire, à partir d'un SavedModel?