web-dev-qa-db-fra.com

TensorFlow: Comment prédire à partir d'un modèle enregistré?

J'ai exporté une SavedModel et maintenant je veux la recharger et faire une prédiction. Il a été formé avec les caractéristiques et les étiquettes suivantes:

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

Donc, disons que je veux introduire 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 effectuer 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 duplicata de la question affichée ici . Cette question porte sur un exemple minimal de déduction sur une variable SavedModel de toute classe de modèle (et pas uniquement sur tf.estimator), ainsi que sur la syntaxe de spécification des noms de nœud d'entrée et de sortie.

8
jshapy8

Une fois le graphique chargé, il est disponible dans le contexte actuel et vous pouvez y insérer des données d'entrée pour obtenir des prédictions. Chaque cas d'utilisation est assez différent, mais l'ajout à 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 devez connaître le nom de vos entrées de prédiction. Si vous ne leur avez pas donné de nef dans votre serving_fn, ils utilisent par défaut Placeholder_n, où n est la nième fonctionnalité. 

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.

2
jshapy8

En supposant que vous souhaitiez 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 sauvegardiez votre modèle comme suit:

# 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 avoir n'importe quelle forme et n'ont même pas besoin d'être des espaces réservés ni des noeuds racine dans le graphique).

Ensuite, dans le programme Python qui utilisera la 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)

Cette réponse montre comment obtenir des prédictions en Java, C++ et Python (malgré le fait que la question est centrée sur les estimateurs, la réponse s'applique en fait indépendamment de la manière dont la variable SavedModel est créée).

7
rhaertel80

Pour ceux qui ont besoin d'un exemple concret de sauvegarde d'un modèle en conserve formé et de servir sans tensorflow, j'ai documenté ici https://github.com/tettusud/tensorflow-examples/tree/master/estimators

  1. Vous pouvez créer un prédicteur à partir 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)
5
sudharsan tk

Le constructeur de tf.estimator.DNNClassifier a un argument appelé warm_start_from. Vous pouvez lui donner le nom du dossier SavedModel et il récupérera votre session.

0
user1392871