web-dev-qa-db-fra.com

Afficher la précision de la formation et de la validation dans TensorFlow en utilisant le même graphique

J'ai un modèle TensorFlow, et une partie de ce modèle évalue la précision. Le accuracy n'est qu'un autre nœud du graphe tensorflow, qui prend en charge logits et labels.

Lorsque je veux tracer la précision de l'entraînement, c'est simple: j'ai quelque chose comme:

tf.scalar_summary("Training Accuracy", accuracy)
tf.scalar_summary("SomethingElse", foo)
summary_op = tf.merge_all_summaries()
writer = tf.train.SummaryWriter('/me/mydir/', graph=sess.graph)

Ensuite, pendant ma boucle d'entraînement, j'ai quelque chose comme:

for n in xrange(1000):
  ...
  summary, ..., ... = sess.run([summary_op, ..., ...], feed_dict)
  writer.add_summary(summary, n)
  ...

Aussi à l'intérieur de cette boucle, à chaque fois, 100 itérations, je veux évaluer la précision validation. J'ai un feed_dict séparé pour cela, et je peux très bien évaluer la précision de la validation en python.

Cependant, voici mon problème: je veux faire un autre résumé pour la précision de la validation , en utilisant le nœud accuracy. Je ne sais pas comment faire cela cependant. Comme j'ai le nœud accuracy, il est donc logique que je puisse le réutiliser, mais je ne sais pas comment le faire exactement, de sorte que je puisse également obtenir l'exactitude de la validation écrite sous la forme d'un résumé scalar_summary ...

Comment cela pourrait-il être possible?

28
Spacey

Vous pouvez réutiliser le nœud de précision, mais vous devez utiliser deux SummaryWriters différents, un pour les cycles de formation et un pour les données de test. Vous devez également affecter le résumé scalaire pour une précision à une variable.

accuracy_summary = tf.scalar_summary("Training Accuracy", accuracy)
tf.scalar_summary("SomethingElse", foo)
summary_op = tf.merge_all_summaries()
summaries_dir = '/me/mydir/'
train_writer = tf.train.SummaryWriter(summaries_dir + '/train', sess.graph)
test_writer = tf.train.SummaryWriter(summaries_dir + '/test')

Ensuite, dans votre boucle d’entraînement, vous avez l’entraînement normal et enregistrez vos résumés avec train_writer. De plus, vous exécutez le graphique sur l'ensemble de tests à chaque centième itération et n'enregistrez que le résumé de la précision avec le test_writer.

# Record train set summaries, and train
summary, _ = sess.run([summary_op, train_step], feed_dict=...)
train_writer.add_summary(summary, n)
if n % 100 == 0:  # Record summaries and test-set accuracy
  summary, acc = sess.run([accuracy_summary, accuracy], feed_dict=...)
  test_writer.add_summary(summary, n)
  print('Accuracy at step %s: %s' % (n, acc))

Vous pouvez ensuite pointer TensorBoard vers le répertoire parent (summaries_dir) et les deux ensembles de données seront chargés.

Cela se trouve également dans le HowTo de TensorFlow https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html

40
wih

Pour exécuter la même opération mais obtenir des résumés avec des données feed_dict différentes, attachez simplement deux opérations résumées à cette opération. Supposons que vous souhaitiez exécuter des opérations de précision sur les données de validation et de test et que vous souhaitiez obtenir des résumés pour les deux:

validation_acc_summary = tf.summary.scalar('validation_accuracy', accuracy)  # intended to run on validation set
test_acc_summary = tf.summary.scalar('test_accuracy', accuracy)  # intended to run on test set
with tf.Session() as sess:
    # do your thing
    # ...
    # accuracy op just needs labels y_ and input x to compute logits 
    validation_summary_str = sess.run(validation_acc_summary, feed_dict=feed_dict={x: mnist.validation.images,y_: mnist.validation.labels})
    test_summary_str = sess.run(test_acc_summary, feed_dict={x: mnist.test.images,y_: mnist.test.labels})

    # assuming you have a tf.summary.FileWriter setup
    file_writer.add_summary(validation_summary_str)
    file_writer.add_summary(test_summary_str)

Rappelez-vous également que vous pouvez toujours extraire des données brutes (scalaires) du protobuff summary_str comme this et faire votre propre journalisation.

7
Yibo Yang