Подтвердить что ты не робот

Обучение регистрации и проверка достоверности в тензокартоне

Я пытаюсь узнать, как использовать тензорный поток и тензограмму. У меня есть тестовый проект, основанный на учебнике по нейронной сети MNIST (https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html).

В моем коде я построил node, который вычисляет долю цифр в наборе данных, которые были правильно классифицированы, например:

correct = tf.nn.in_top_k(self._logits, labels, 1)
correct = tf.to_float(correct)
accuracy = tf.reduce_mean(correct)

Здесь self._logits является частью вывода из графика, а labels является заполнителем, который содержит правильные метки.

Теперь то, что я хотел бы сделать, - это оценить точность как для набора тренировок, так и для проверки, установленной в процессе обучения. Я могу сделать это, дважды используя точность node, с разными feed_dicts:

train_acc = tf.run(accuracy, feed_dict={images : training_set.images, labels : training_set.labels})
valid_acc = tf.run(accuracy, feed_dict={images : validation_set.images, labels : validation_set.labels})

Это работает по назначению. Я могу распечатать значения, и я вижу, что изначально две точности будут увеличиваться, и в конечном итоге точность проверки будет сглажена, а точность обучения будет увеличиваться.

Тем не менее, я также хотел бы получить графики этих значений в тензограмме, и я не могу понять, как это сделать. Если я просто добавлю scalar_summary в accuracy, зарегистрированные значения не будут различать набор тренировок и набор проверки.

Я также попытался создать два идентичных узла accuracy с разными именами и запустить их на обучающем наборе и один на набор проверки. Затем я добавляю scalar_summary к каждому из этих узлов. Это дает мне два графика в тензограмме, но вместо одного графика, показывающего точность набора тренировок, и один, показывающий точность установки проверки, они оба показывают одинаковые значения, которые не соответствуют ни тем, которые были напечатаны на терминале.

Я, вероятно, не понимаю, как решить эту проблему. Каков рекомендуемый способ отдельного протоколирования вывода из одного node для разных входов?

4b9b3361

Ответ 1

Существует несколько способов достижения этого, но вы на правильном пути, создавая различные узлы tf.summary.scalar(). Поскольку вы должны явно называть SummaryWriter.add_summary() каждый раз, когда хотите записать количество в файл события, самый простой подход - это, вероятно, получить соответствующее резюме node каждый раз, когда вы хотите получить точность обучения или проверки:

accuracy = tf.reduce_mean(correct)

training_summary = tf.summary.scalar("training_accuracy", accuracy)
validation_summary = tf.summary.scalar("validation_accuracy", accuracy)


summary_writer = tf.summary.FileWriter(...)

for step in xrange(NUM_STEPS):

  # Perform a training step....

  if step % LOG_PERIOD == 0:

    # To log training accuracy.
    train_acc, train_summ = sess.run(
        [accuracy, training_summary], 
        feed_dict={images : training_set.images, labels : training_set.labels})
    writer.add_summary(train_summ, step) 

    # To log validation accuracy.
    valid_acc, valid_summ = sess.run(
        [accuracy, validation_summary],
        feed_dict={images : validation_set.images, labels : validation_set.labels})
    writer.add_summary(valid_summ, step)

В качестве альтернативы вы можете создать единый итоговый оператор, чей тег tf.placeholder(tf.string, []) и передать строку "training_accuracy" или "validation_accuracy" как необходимо.