web-dev-qa-db-fra.com

Journal métrique de précision lors de la formation d'un tf.estimator

Quel est le moyen le plus simple d'imprimer des métriques de précision avec la perte lors de la formation d'un estimateur pré-en boîte?

La plupart des tutoriels et des documentations semblent résoudre le problème de la création d'un estimateur personnalisé, ce qui semble excessif si l'intention est d'utiliser l'un des estimateurs disponibles.

tf.contrib.learn avait quelques hooks Monitor (maintenant obsolètes). TF suggère maintenant d’utiliser l’API de hook, mais il apparaît qu’elle ne vient pas avec rien qui puisse utiliser les étiquettes et les prédictions pour générer un numéro de précision. 

6
viksit

Avez-vous essayé tf.contrib.estimator.add_metrics(estimator, metric_fn) ( doc )? Il prend un estimateur initialisé (peut être pré-enregistré) et ajoute les métriques définies par metric_fn.

Exemple d'utilisation:

def custom_metric(labels, predictions):
    # This function will be called by the Estimator, passing its predictions.
    # Let's suppose you want to add the "mean" metric...

    # Accessing the class predictions (careful, the key name may change from one canned Estimator to another)
    predicted_classes = predictions["class_ids"]  

    # Defining the metric (value and update tensors):
    custom_metric = tf.metrics.mean(labels, predicted_classes, name="custom_metric")

    # Returning as a dict:
    return {"custom_metric": custom_metric}

# Initializing your canned Estimator:
classifier = tf.estimator.DNNClassifier(feature_columns=columns_feat, hidden_units=[10, 10], n_classes=NUM_CLASSES)

# Adding your custom metrics:
classifier = tf.contrib.estimator.add_metrics(classifier, custom_metric)

# Training/Evaluating:
tf.logging.set_verbosity(tf.logging.INFO) # Just to have some logs to display for demonstration

train_spec = tf.estimator.TrainSpec(input_fn=lambda:your_train_dataset_function(),
                                    max_steps=TRAIN_STEPS)
eval_spec=tf.estimator.EvalSpec(input_fn=lambda:your_test_dataset_function(),
                                steps=EVAL_STEPS,
                                start_delay_secs=EVAL_DELAY,
                                throttle_secs=EVAL_INTERVAL)
tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec)

Journaux:

...
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [20/200]
INFO:tensorflow:Evaluation [40/200]
...
INFO:tensorflow:Evaluation [200/200]
INFO:tensorflow:Finished evaluation at 2018-04-19-09:23:03
INFO:tensorflow:Saving dict for global step 1: accuracy = 0.5668, average_loss = 0.951766, custom_metric = 1.2442, global_step = 1, loss = 95.1766
...

Comme vous pouvez le constater, le custom_metric est renvoyé avec les mesures et pertes par défaut.

6
Aldream

En plus de la réponse de @Aldream, vous pouvez également utiliser TensorBoard pour voir quelques graphiques du custom_metric. Pour ce faire, ajoutez-le à un résumé TensorFlow comme ceci:

tf.summary.scalar('custom_metric', custom_metric)

La bonne chose quand vous utilisez le tf.estimator.Estimator est qu'il n'est pas nécessaire d'ajouter les résumés à une FileWriter, car c'est fait automatiquement (les fusionner et les sauvegarder toutes les 100 étapes par défaut).

Pour voir le TensorBoard, vous devez ouvrir un nouveau terminal et taper:

tensorboard --logdir={$MODEL_DIR}

Après cela, vous pourrez voir les graphiques dans votre navigateur à localhost:6006.

2
tsveti_iko