首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sess.run([op1,op2.])Tensorflow

sess.run([op1,op2.])Tensorflow
EN

Stack Overflow用户
提问于 2018-11-06 03:38:05
回答 1查看 1.3K关注 0票数 6

我想知道sess.run中op列表的运行顺序是什么(ops_list,.)。例如:对于典型的分类场景:_, loss = sess.run([train_op, loss_op]),如果train_op先运行,那么损失就是当前备份后的损失。但是,如果loss先运行,那么损失就是当前反向支撑之前的损失。有人帮我吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-11-06 10:45:08

loss将是由train_op造成的更新之前丢失的值。请注意,loss_op是优化器的输入,因此它必须在图中“先于”train_oploss_op是在run操作开始时使用变量值计算的。如果您想在train_op之后计算损失,您可以这样做--例如,使用带有优化器的tf.control_dependencies块并再次计算损失,但在这种情况下,您将在每个步骤中对模型进行两次前向传递,并计算相关的成本。通常,如果您只想绘制用于监视的损失或类似的内容,则可以使用上一步中的值。

为了进一步解释,通常TensorFlow操作的执行顺序仅在这些操作相互依赖的程度上得到保证,而与传递给run的顺序无关。在您的例子中,train_op依赖于loss_op,因此loss_op必须首先使用。然而,在其他情况下,操作并不直接相互依赖,在这种情况下,订单得不到保证。很多时候,这并不重要,但在某些情况下确实如此。考虑下一个例子:

代码语言:javascript
复制
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]))

在我的计算机中运行产生了以下输出:

代码语言:javascript
复制
[1, 0]
[2, 2]
[3, 4]
[4, 8]
[5, 10]

正如您所看到的,v2有时是更新值的两倍,有时是未更新值的两倍。例如,如果我们希望确保v2总是在v_update之前运行,我们可以这样做:

代码语言:javascript
复制
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]))

持续不断地产生:

代码语言:javascript
复制
[1, 0]
[2, 2]
[3, 4]
[4, 6]
[5, 8]
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53165418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档