Montrer 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 est juste un autre noeud dans le graphique de tensorflow, qui prend logits et labels .

quand 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)

alors, pendant ma boucle de formation, 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 disons, 100 itérations, je veux évaluer la précision validation . J'ai un feed_dict séparé pour cela, et je suis capable d'évaluer la précision de la validation très bien en python.

cependant, voici mon problème: je veux faire un autre résumé pour la précision de validation , en utilisant le noeud accuracy . Je ne suis pas clair sur la façon de faire cela. Depuis que j'ai le noeud accuracy il est logique que je devrais être en mesure de réutiliser il, mais je ne sais pas comment faire exactement, de sorte que je peux également obtenir la précision de validation écrit en tant que scalar_summary séparé...

comment cela pourrait-il être possible?

21
demandé sur Spacey 2016-10-20 08:50:58

2 réponses

vous pouvez réutiliser le noeud de précision mais vous avez besoin d'utiliser deux rédacteurs de résumé différents, un pour les essais de formation et un pour les données de test. Aussi, vous devez assigner le résumé scalaire pour la 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 de formation vous avez la formation normale et enregistrez vos résumés avec le train_writer. De plus, vous exécutez le graphique sur le test défini à chaque 100e itération et n'Enregistrez que le sommaire 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 alors pointer TensorBoard vers le répertoire parent (summaries_dir) et il chargera les deux ensembles de données.

cela se trouve aussi dans le TensorFlow HowTo https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html

30
répondu wih 2016-10-20 23:13:09

pour exécuter la même opération mais obtenir des résumés avec des données feed_dict différentes, il suffit de joindre deux résumés ops à cette opération. Dites que vous voulez exécuter accuracy op à la fois sur les données de validation et de test et que vous voulez 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 aussi que vous pouvez toujours extraire des données brutes (scalaires) du résumé de protobuff_str comme ce et faire votre propre journalisation.

7
répondu Yibo Yang 2017-06-12 07:14:11