如何查看在训练带有dropout的TensorFlow神经网络时实际使用的dropouts的准确性和成本?
正如预期的那样,每次我运行一个摘要时,例如使用
train_writer.add_summary(sess.run(merged, feed_dict=foo), step)
或者
print(sess.run(accuracy, feed_dict=foo))
如果网络包含dropout,并且foo
提供了一个不是1.0的“保留概率”,我会得到不同的值,因此,例如,每次我得到的损失或准确性都不同——例如,使用
print(sess.run(accuracy, feed_dict=foo))print(sess.run(accuracy, feed_dict=foo))print(sess.run(accuracy, feed_dict=foo))
进行的三个连续计算可能会得到类似于
75.80875.64675.770
尽管这些值大致相同,但它们并不完全相同,可能是因为每次评估时,网络会丢弃不同的节点。因此,这必然导致我无法看到训练过程中实际遇到的成本。
如何记录或查看在训练带有dropout的TensorFlow神经网络时实际使用的成本(或其他使用网络计算的摘要值)?
回答:
问题出在哪里呢?你在调用三次随机网络时应该得到三个不同的值。当你记录网络的损失时,你记录的是训练过程中实际使用的损失。基本上,你可以直接从计算图中读取值,例如:
for i in range(100): batch_xs, batch_ys = mnist.train.next_batch(100) cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) _, loss_val = sess.run([train_step, cross_entropy], feed_dict={x: batch_xs, y_: batch_ys}) print 'loss = ' + loss_val
这将打印在训练步骤中计算出的损失(它不会再次计算,因此dropout输出掩码不会被重新采样)。
如果你想查看“如果我现在停止学习,训练集上的准确性会是什么”,你需要一个评估图 https://www.tensorflow.org/versions/r0.8/tutorials/mnist/tf/index.html#evaluate-the-model,它会告诉你的网络,现在是时候将dropout单元从随机切换到缩放/平均结果了。