gpt4 book ai didi

tensorflow - 组合条件和控制依赖关系

转载 作者:行者123 更新时间:2023-12-02 21:07:38 25 4
gpt4 key购买 nike

我正在尝试执行一段条件代码,该代码又依赖于首先执行的另一个操作。这项工作的简单版本,如下所示:

x = tf.Variable(0.)
x_op = tf.assign(x, 1.)

with tf.control_dependencies([x_op]):
true_fun = lambda: tf.assign_add(x, 3.)
false_fun = lambda: tf.constant([])
pred = tf.constant(True)
cond_op = control_flow_ops.cond(pred, true_fun, false_fun)

计算 cond_op 时,按预期将 x 设置为 4.0。然而,这个更复杂的版本不起作用:

def rest(x): tf.gather(x, tf.range(1, tf.size(x)))

x = tf.Variable([0., 1.])
x_op = tf.assign(x, [0., 1., 2.], validate_shape=False)

with tf.control_dependencies([x_op]):
true_fun = lambda: tf.assign(x, rest(x), validate_shape=False)
false_fun = lambda: tf.constant([])
pred = tf.constant(True)
cond_op = control_flow_ops.cond(pred, true_fun, false_fun)

特别是 x 被分配为 [1.] 而不是 [1., 2.]。我想要的逻辑是首先将 x 分配为 [0., 1., 2.],然后然后 被修剪到[1., 2.]。顺便说一句,这似乎与 x 的大小变化有关,因为如果在初始 x_op 赋值中 x 被赋值 [ 1., 2.] 而不是 [0., 1., 2.],然后计算 cond_op 结果为 x被分配[2.],这是正确的行为。 IE。它首先更新为 [1., 2.],然后修剪为 [2.]

最佳答案

请注意,with tf.control_dependencies 仅适用于在 block 内创建的操作。当您在 block 内调用 rest(x) 时,您引用的 x 仍然是旧的 x,它是 的返回值>tf.Variable 函数,它只是保存变量初始值的Tensor。您可以通过调用 rest(x_op) 来传递新值。这是完整的工作片段:

import tensorflow as tf

def rest(x): return tf.gather(x, tf.range(1, tf.size(x)))

x = tf.Variable([0., 1.])
x_op = tf.assign(x, [0., 1., 2.], validate_shape=False)

with tf.control_dependencies([x_op]):
true_fun = lambda: tf.assign(x, rest(x_op), validate_shape=False)
false_fun = lambda: tf.constant([])
pred = tf.constant(True)
cond_op = tf.cond(pred, true_fun, false_fun)

with tf.Session(""):
x.initializer.run()
print(cond_op.eval())

关于tensorflow - 组合条件和控制依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com