在 TensorFlow 训练期间打印损失
Printing the loss during TensorFlow training
我正在看 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, ...)
期间计算过,计算两次似乎效率不高,需要所有训练数据的前向传递次数的两倍。在 sess.run(train_step, ...)
期间计算的 cross_entropy
的值有没有办法访问?
如何打印 tf.Variable
?使用 str(cross_entropy)
给我一个错误...
谢谢!
不仅 运行 连接 training_step,运行 还连接 cross_entropy 节点,这样它的值就可以 return 发送给您。请记住:
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 的参数和 return 值都变成了一个列表,以便两者都发生。
您可以通过将 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
的值之外,您还想打印名为 W
的 tf.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
我正在看 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, ...)
期间计算过,计算两次似乎效率不高,需要所有训练数据的前向传递次数的两倍。在sess.run(train_step, ...)
期间计算的cross_entropy
的值有没有办法访问?如何打印
tf.Variable
?使用str(cross_entropy)
给我一个错误...
谢谢!
不仅 运行 连接 training_step,运行 还连接 cross_entropy 节点,这样它的值就可以 return 发送给您。请记住:
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 的参数和 return 值都变成了一个列表,以便两者都发生。
您可以通过将 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
的值之外,您还想打印名为 W
的 tf.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