2016-10-20 1 views
16

У меня есть модель TensorFlow, и одна часть этой модели оценивает точность. accuracy является еще одним узлом графика тензорного потока, который принимает значения logits и labels.Показать тренировку и точность проверки в TensorFlow с использованием того же графика

Когда я хочу построить точность обучения, это просто: у меня есть что-то вроде:

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 ...

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

+0

Для некоторых других решений у меня был аналогичный вопрос [здесь] (http://stackoverflow.com/questions/37146614/tensorboard-plot-training-and-validation-losses-on-the-same-graph). – golmschenk

+0

Это может ответить на ваши вопросы (не устанавливая два сводных каталога): http://stackoverflow.com/questions/34471563/logging-training-and-validation-loss-in-tensorboard –

ответ

22

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

+0

Спасибо, что позволил мне попробовать это ... будет отчитываться. – Spacey

+0

Итак, я думаю, что это проблема: «summary_op» содержит объединенные резюме некоторых вещей. Однако я просто хочу «резюме» для validation_error ... это имеет смысл? Например, если я снова прохожу в «summary_op» внутри цикла n% 100 и получаю «резюме», тогда похоже, что он «запускает» ВСЕ резюме. (Все те, которые были объединены).Но я просто хочу, чтобы узел точности был запущен ... – Spacey

+0

Кроме того, почему у test_writer нет «sess.graph»? – Spacey

4

Чтобы запустить ту же операцию, но и получать сводки с различными данными feed_dict, просто прикрепить два сводных опа к этому цит. Допустим, вы хотите запустить точность цит на обеих проверочных и тестовых данных, и вы хотите получить резюме для обоих:

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 как this и сделать свой собственный Ведение журнала.

Смежные вопросы