2017-08-26 1 views
3

J'ai exporté un SavedModel et maintenant je dois le recharger et faire une prédiction. Il a été formé avec les caractéristiques et les étiquettes suivantes:TensorFlow: Comment prédire à partir d'un SavedModel?

F1 : FLOAT32 
F2 : FLOAT32 
F3 : FLOAT32 
L1 : FLOAT32 

dire donc je veux nourrir les valeurs 20.9, 1.8, 0.9 obtenir une seule prédiction FLOAT32. Comment puis-je accomplir cela? J'ai réussi à charger le modèle, mais je ne sais pas comment y accéder pour faire l'appel de prédiction.

with tf.Session(graph=tf.Graph()) as sess: 
    tf.saved_model.loader.load(
     sess, 
     [tf.saved_model.tag_constants.SERVING], 
     "/job/export/Servo/1503723455" 
    ) 

    # How can I predict from here? 
    # I want to do something like prediction = model.predict([20.9, 1.8, 0.9]) 

Cette question n'est pas un double de la question posée here. Cette question se concentre sur un exemple minimal d'exécution d'inférence sur un SavedModel de n'importe quelle classe de modèle (pas seulement limitée à tf.estimator) et la syntaxe de spécification des noms de nœuds d'entrée et de sortie.

+2

double possible de [Comment importer un modèle de train tensorflow enregistré à l'aide tf.estimator et prédire des données d'entrée] (https://stackoverflow.com/questions/46098863/how-to-import -an-saved-tensorflow-model-train-using-tf-estimator-and-predict-on) – rhaertel80

+0

Voir ma dernière modification pour savoir pourquoi il ne s'agit pas d'un doublon. – jshapy8

Répondre

0

Une fois le graphique chargé, il est disponible dans le contexte actuel et vous pouvez y introduire des données d'entrée pour obtenir des prédictions. Chaque cas d'utilisation est assez différente, mais l'ajout de votre code ressemblera à ceci:

with tf.Session(graph=tf.Graph()) as sess: 
    tf.saved_model.loader.load(
     sess, 
     [tf.saved_model.tag_constants.SERVING], 
     "/job/export/Servo/1503723455" 
    ) 

    prediction = sess.run(
     'prefix/predictions/Identity:0', 
     feed_dict={ 
      'Placeholder:0': [20.9], 
      'Placeholder_1:0': [1.8], 
      'Placeholder_2:0': [0.9] 
     } 
    ) 

    print(prediction) 

Ici, vous avez besoin de connaître les noms de ce que vos entrées de prédiction seront. Si vous ne leur avez pas donné une nef dans votre serving_fn, ils sont par défaut Placeholder_n, où n est la nième caractéristique.

Le premier argument de chaîne de sess.run est le nom de la cible de prédiction. Cela varie en fonction de votre cas d'utilisation.

1

En supposant que vous voulez des prédictions en Python, SavedModelPredictor est probablement le moyen le plus simple de charger un SavedModel et d'obtenir des prédictions. Supposons que vous enregistrez votre modèle comme ceci:

# Build the graph 
f1 = tf.placeholder(shape=[], dtype=tf.float32) 
f2 = tf.placeholder(shape=[], dtype=tf.float32) 
f3 = tf.placeholder(shape=[], dtype=tf.float32) 
l1 = tf.placeholder(shape=[], dtype=tf.float32) 
output = build_graph(f1, f2, f3, l1) 

# Save the model 
inputs = {'F1': f1, 'F2': f2, 'F3': f3, 'L1': l1} 
outputs = {'output': output_tensor} 
tf.contrib.simple_save(sess, export_dir, inputs, outputs) 

(Les entrées peuvent être de toute forme et ne même pas être ni espaces réservés nœuds racine dans le graphique).

Ensuite, dans le programme Python qui utilisera le SavedModel, nous pouvons obtenir des prédictions comme ceci:

from tensorflow.contrib import predictor 

predict_fn = predictor.from_saved_model(export_dir) 
predictions = predict_fn(
    {"F1": 1.0, "F2": 2.0, "F3": 3.0, "L1": 4.0}) 
print(predictions) 

This answer montre comment obtenir des prédictions en Java, C++ et Python (en dépit du fait que le question est axé sur les estimateurs, la réponse s'applique réellement indépendamment de la façon dont le SavedModel est créé).

2

Pour toute personne qui a besoin d'un exemple de travail de sauver un modèle en conserve formé et de le servir sans tensorflow portion, j'ai documenté ici https://github.com/tettusud/tensorflow-examples/tree/master/estimators

  1. Vous pouvez créer un prédicteur de tf.tensorflow.contrib.predictor.from_saved_model(exported_model_path)
  2. Préparer l'entrée

    tf.train.Example( 
        features= tf.train.Features(
         feature={ 
          'x': tf.train.Feature(
           float_list=tf.train.FloatList(value=[6.4, 3.2, 4.5, 1.5]) 
          )  
         } 
        )  
    ) 
    

Ici x est le nom de l'entrée qui a été donnée dans input_receiver_function au moment de l'exportation. pour par exemple:

feature_spec = {'x': tf.FixedLenFeature([4],tf.float32)} 

def serving_input_receiver_fn(): 
    serialized_tf_example = tf.placeholder(dtype=tf.string, 
              shape=[None], 
              name='input_tensors') 
    receiver_tensors = {'inputs': serialized_tf_example} 
    features = tf.parse_example(serialized_tf_example, feature_spec) 
    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)