我正在看TensorFlow“MNIST For ML Beginners”教程,我想在每个训练步骤之后打印出训练损失。

我的训练循环目前看起来像这样:

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

现在,train_step定义为:
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
cross_entropy是我要打印的损失:
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

一种打印方法是在训练循环中显式计算cross_entropy:
for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    print 'loss = ' + str(cross_entropy)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

我现在有两个问题:
  • 鉴于cross_entropy已在sess.run(train_step, ...)期间进行了计算,因此对其进行两次计算似乎效率不高,这需要所有训练数据的前向通过次数的两倍。在cross_entropy期间计算得出sess.run(train_step, ...)的值时,是否有办法访问它?
  • 我什至如何打印tf.Variable?使用str(cross_entropy)给我一个错误...

  • 谢谢!

    最佳答案

    您可以通过将cross_entropy的值添加到sess.run(...)的参数列表中来获取该值。例如,您的for -loop可以重写如下:

    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
    

    可以使用相同的方法来打印变量的当前值。假设,除了cross_entropy的值之外,您还想打印一个称为tf.VariableW的值,您可以执行以下操作:
    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, W_val = sess.run([train_step, cross_entropy, W],
                                      feed_dict={x: batch_xs, y_: batch_ys})
        print 'loss = %s' % loss_val
        print 'W = %s' % W_val
    

    关于python - 在TensorFlow培训期间打印损失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33833818/

    10-12 12:33
    查看更多