web-dev-qa-db-fra.com

Enregistrement de la formation et de la perte de validation dans le tensorboard

J'essaie d'apprendre à utiliser tensorflow et tensorboard. J'ai un projet de test basé sur le MNIST neural net tutorial .

Dans mon code, je construis un nœud qui calcule la fraction de chiffres dans un ensemble de données qui sont correctement classés, comme ceci:

correct = tf.nn.in_top_k(self._logits, labels, 1)
correct = tf.to_float(correct)
accuracy = tf.reduce_mean(correct)

Ici, self._logits est la partie inférence du graphique, et labels est un espace réservé qui contient les étiquettes correctes.

Maintenant, ce que je voudrais faire, c'est évaluer la précision à la fois de l'ensemble de formation et de l'ensemble de validation au fur et à mesure de la formation. Je peux le faire en exécutant le nœud de précision deux fois, avec différents feed_dicts:

train_acc = tf.run(accuracy, feed_dict={images : training_set.images, labels : training_set.labels})
valid_acc = tf.run(accuracy, feed_dict={images : validation_set.images, labels : validation_set.labels})

Cela fonctionne comme prévu. Je peux imprimer les valeurs, et je peux voir qu'au départ, les deux précisions augmenteront toutes les deux, et finalement la précision de validation s'aplatira tandis que la précision de la formation continuera d'augmenter.

Cependant, je voudrais également obtenir des graphiques de ces valeurs dans tensorboard, et je ne peux pas comprendre comment le faire. Si j'ajoute simplement un scalar_summary à accuracy, les valeurs consignées ne feront pas de distinction entre l'ensemble d'apprentissage et l'ensemble de validation.

J'ai également essayé de créer deux nœuds accuracy identiques avec des noms différents et d'en exécuter un sur l'ensemble de formation et un sur l'ensemble de validation. J'ajoute ensuite un scalar_summary à chacun de ces nœuds. Cela me donne deux graphiques dans le tensorboard, mais au lieu d'un graphique montrant la précision du jeu d'entraînement et un montrant la précision du jeu de validation, ils affichent tous les deux des valeurs identiques qui ne correspondent à aucun de ceux imprimés sur le terminal.

Je ne comprends probablement pas comment résoudre ce problème. Quelle est la méthode recommandée pour enregistrer séparément la sortie d'un seul nœud pour différentes entrées?

35
user3468216

Il existe plusieurs façons différentes d'y parvenir, mais vous êtes sur la bonne voie en créant différents nœuds tf.summary.scalar() . Étant donné que vous devez explicitement appeler SummaryWriter.add_summary() chaque fois que vous souhaitez enregistrer une quantité dans le fichier d'événements, l'approche la plus simple consiste probablement à récupérer le nœud de résumé approprié chaque fois que vous souhaitez obtenir le formation ou précision de validation:

accuracy = tf.reduce_mean(correct)

training_summary = tf.summary.scalar("training_accuracy", accuracy)
validation_summary = tf.summary.scalar("validation_accuracy", accuracy)


summary_writer = tf.summary.FileWriter(...)

for step in xrange(NUM_STEPS):

  # Perform a training step....

  if step % LOG_PERIOD == 0:

    # To log training accuracy.
    train_acc, train_summ = sess.run(
        [accuracy, training_summary], 
        feed_dict={images : training_set.images, labels : training_set.labels})
    writer.add_summary(train_summ, step) 

    # To log validation accuracy.
    valid_acc, valid_summ = sess.run(
        [accuracy, validation_summary],
        feed_dict={images : validation_set.images, labels : validation_set.labels})
    writer.add_summary(valid_summ, step)

Vous pouvez également créer une seule opération récapitulative dont la balise est tf.placeholder(tf.string, []) et alimenter la chaîne "training_accuracy" Ou "validation_accuracy" Selon le cas.

50
mrry

Une autre façon de le faire est d'utiliser un deuxième écrivain de fichiers. Vous pouvez donc utiliser la commande merge_summaries.

train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train',
                                      sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')
tf.global_variables_initializer().run()

Voici la documentation complète. Cela fonctionne bien pour moi: TensorBoard: Visualizing Learning

4
stillPatrick