打印TensorFlow培训期间的损失



我正在看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})

我现在有两个问题:

  1. 假设在sess.run(train_step, ...)期间已经计算了cross_entropy,那么两次计算它似乎是低效的,需要两倍于所有训练数据的前向通过次数。在sess.run(train_step, ...)期间计算cross_entropy的值时,是否有方法访问该值?

  2. 如何打印tf.Variable?使用str(cross_entropy)时出现错误。。。

谢谢!

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

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的值之外,您还想打印一个名为Wtf.Variable的值,您可以执行以下操作:

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

不要只运行training_step,还要运行cross_entropy节点,以便将其值返回给您。记住:

var_as_a_python_value = sess.run(tensorflow_variable)

会给你想要的,所以你可以这样做:

[_, cross_entropy_py] = sess.run([train_step, cross_entropy],
                                 feed_dict={x: batch_xs, y_: batch_ys})

运行训练并在迭代过程中计算出交叉熵的值。请注意,我将sess.run的参数和返回值都变成了一个列表,这样两者都会发生。

最新更新