Показать точность обучения и валидации в TensorFlow, используя тот же график
у меня TensorFlow модели, и одна часть этой модели оценивает точность. The accuracy
это просто еще один узел в tensorflow график, что происходит в logits
и labels
.
когда я хочу построить точность обучения, это просто: у меня есть что-то вроде:
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)
затем, во время моего цикла обучения, у меня есть что-то вроде:
for n in xrange(1000):
...
summary, ..., ... = sess.run([summary_op, ..., ...], feed_dict)
writer.add_summary(summary, n)
...
также внутри этого цикла, каждый, скажем, 100 итераций, я хочу оценить проверка точность. Для этого у меня есть отдельный feed_dict, и я могу очень хорошо оценить точность проверки в python.
, вот моя проблема: я хочу сделать еще один сводка для точности проверки, С помощьюaccuracy
узел. Я не совсем понимаю, как это сделать. Так как у меня есть accuracy
узел имеет смысл, что я должен иметь возможность повторно использовать его, но я не уверен, как это сделать точно, так что я также могу получить точность проверки, выписанную как отдельный scalar_summary...
как это возможно?
2 ответов
вы можете повторно использовать узел точность, но вам нужно использовать два разных SummaryWriters, один для учебных запусков и один для тестовых данных. Также вы должны назначить скалярную сводку для точности переменной.
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')
затем в вашем цикле обучения у вас есть нормальное обучение и записывайте свои резюме с помощью train_writer. Кроме того, вы запускаете график на тестовом наборе каждую 100-ю итерацию и записываете только сводку точности с помощью 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))
затем вы можете указать TensorBoard в родительский каталог (summaries_dir), и он загрузит оба набора данных.
Это также можно найти в TensorFlow HowTo https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html
чтобы выполнить ту же операцию, но получить сводки с разными данными feed_dict, просто прикрепите к этой операции две сводные операции. Скажем, вы хотите запустить accuracy op как для проверки, так и для тестовых данных и хотите получить сводки для обоих:
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)
также помните, что вы всегда можете вытащить необработанные (скалярные) данные из protobuff summary_str как этой и сделайте свой собственный журнал.