loss
将是损失的价值before引起的更新train_op
。注意loss_op
是优化器的输入,因此它必然位于“之前”train_op
在图中。loss_op
用变量值计算一开始 of the run
手术。如果你想计算损失after train_op
,你可以这样做,例如使用tf.control_dependencies https://www.tensorflow.org/api_docs/python/tf/control_dependencies使用优化器阻止并再次计算损失,但在这种情况下,您将在每个步骤上对模型进行两次前向传递,并产生相关成本。通常,如果您只想绘制监控损失或类似的数据,则可以使用上一步中的值。
为了进一步说明,一般来说,TensorFlow 操作的执行顺序仅在这些操作相互依赖的情况下得到保证,并且与传递给的顺序无关run
。就你而言,train_op
依赖于取决于loss_op
, so 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
总是运行before 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]