我想知道sess.run中op列表的运行顺序是什么(ops_list,.)。例如:对于典型的分类场景:_, loss = sess.run([train_op, loss_op]),如果train_op先运行,那么损失就是当前备份后的损失。但是,如果loss先运行,那么损失就是当前反向支撑之前的损失。有人帮我吗?谢谢。
发布于 2018-11-06 10:45:08
loss将是由train_op造成的更新之前丢失的值。请注意,loss_op是优化器的输入,因此它必须在图中“先于”train_op。loss_op是在run操作开始时使用变量值计算的。如果您想在train_op之后计算损失,您可以这样做--例如,使用带有优化器的tf.control_dependencies块并再次计算损失,但在这种情况下,您将在每个步骤中对模型进行两次前向传递,并计算相关的成本。通常,如果您只想绘制用于监视的损失或类似的内容,则可以使用上一步中的值。
为了进一步解释,通常TensorFlow操作的执行顺序仅在这些操作相互依赖的程度上得到保证,而与传递给run的顺序无关。在您的例子中,train_op依赖于loss_op,因此loss_op必须首先使用。然而,在其他情况下,操作并不直接相互依赖,在这种情况下,订单得不到保证。很多时候,这并不重要,但在某些情况下确实如此。考虑下一个例子:
import tensorflow as tf
v = tf.Variable(0)
v2 = 2 * v
v_update = v.assign(v + 1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(5):
print(sess.run([v_update, v2]))在我的计算机中运行产生了以下输出:
[1, 0]
[2, 2]
[3, 4]
[4, 8]
[5, 10]正如您所看到的,v2有时是更新值的两倍,有时是未更新值的两倍。例如,如果我们希望确保v2总是在v_update之前运行,我们可以这样做:
import tensorflow as tf
v = tf.Variable(0)
v2 = 2 * v
with tf.control_dependencies([v2]):
v_update = v.assign(v + 1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(5):
print(sess.run([v_update, v2]))持续不断地产生:
[1, 0]
[2, 2]
[3, 4]
[4, 6]
[5, 8]https://stackoverflow.com/questions/53165418
复制相似问题