我正在尝试学习如何使用tensorflow和tensorboard.我有一个基于MNIST神经网络教程的测试项目.
在我的代码中,我构造了一个节点,用于计算正确分类的数据集中的数字部分,如下所示:
correct = tf.nn.in_top_k(self._logits, labels, 1) correct = tf.to_float(correct) accuracy = tf.reduce_mean(correct)
这self._logits
是图表的推理部分,labels
是包含正确标签的占位符.
现在,我想做的是在训练进行时评估训练集和验证集的准确性.我可以通过运行精度节点两次,使用不同的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})
这按预期工作.我可以打印这些值,我可以看到,最初,两个精度都会增加,最终验证精度会在训练精度不断提高时变平.
但是,我还想在tensorboard中得到这些值的图表,我无法弄清楚如何做到这一点.如果我只是添加一个scalar_summary
to accuracy
,则记录的值将不区分训练集和验证集.
我还尝试创建两个accuracy
具有不同名称的相同节点,并在训练集上运行一个,在验证集上运行一个.然后我scalar_summary
为每个节点添加一个.这确实在张量板中给出了两个图形,但是它们不是显示训练集精度的一个图形而是显示验证集精度的图形,而是显示与打印到终端的任何一个都不匹配的相同值.
我可能误解了如何解决这个问题.对于不同的输入,单独记录单个节点的输出的推荐方法是什么?
有几种不同的方法可以实现这一目标,但是您在创建不同tf.summary.scalar()
节点的过程中处于正确的轨道上.由于SummaryWriter.add_summary()
每次要将数量记录到事件文件时都必须显式调用,因此每次要获得培训或验证准确性时,最简单的方法可能是获取相应的摘要节点:
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"
适当.