Показать тренировку и точность проверки в TensorFlow с использованием того же графика

У меня есть модель TensorFlow, и одна часть этой модели оценивает точность. accuracy - это просто еще один node в графе тензорного потока, который принимает значения 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 node. Я не понимаю, как это сделать. Поскольку у меня есть accuracy node, имеет смысл, что я должен иметь возможность повторно использовать его, но я не уверен, как это сделать точно, так что я также могу получить точность проверки, выписанную как отдельный файл scalar_summary...

Как это возможно?

Ответы

Ответ 1

Вы можете повторно использовать точность node, но вам нужно использовать два разных 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

Ответ 2

Чтобы выполнить ту же операцию, но получить сводки с различными данными feed_dict, просто прикрепите два сводных ops к этому оператору. Предположим, что вы хотите выполнить точность 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, например , и сделать свой собственный журнал.