gpt4 book ai didi

python - 如何使用 global_step 计算调用 tf.cond 的谓词?

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

我想根据全局步骤的值执行不同的计算。这是我正在尝试做的一个最小示例:

import tensorflow as tf

global_step = tf.train.get_or_create_global_step()
incr_global_step = global_step.assign(global_step + 1)

w = tf.cond(tf.equal(tf.mod(global_step, 2), 0),
lambda : tf.get_variable('w1', initializer=tf.zeros([], dtype=tf.int32)),
lambda : tf.get_variable('w2', initializer=tf.ones([], dtype=tf.int32)))

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(4):
print(sess.run([w, incr_global_step]))

我收到以下错误:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value global_step
[[Node: global_step/read = Identity[T=DT_INT64, _class=["loc:@global_step"], _device="/job:localhost/replica:0/task:0/cpu:0"](global_step)]]

这是预期的行为吗?如果是这样,我做错了什么?

我使用的是tensorflow 1.2

最佳答案

所以,是的,这确实很奇怪。我能够通过以下修改运行您的代码:

import tensorflow as tf

global_step = tf.train.get_or_create_global_step()
incr_global_step = global_step.assign(global_step + 1)

w = tf.cond(tf.equal(tf.mod(global_step.initialized_value(), 2), 0),
lambda : tf.get_variable('w1', initializer=tf.zeros([], dtype=tf.int32)),
lambda : tf.get_variable('w2', initializer=tf.ones([], dtype=tf.int32)).initialized_value())

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(4):
print(sess.run([w, incr_global_step]))

请注意,我必须添加 initialized_valueglobal_steptf.cond 中的变量 'w2',但不知何故'w1 ' (你也可以把它放进去,它会起作用,但如果你不这样做,显然它不会归档)。正如文档中提到的,通常不需要此方法,它只是提供变量的“ View ”,保证在初始化后使用该变量。为什么 tf.cond 要求您使用它,以及为什么以如此不一致的方式,我不知道。

除此之外,请注意,运行代码的方式实际上是不确定的。一般来说,你会得到这个:

[1, 1]
[0, 2]
[1, 3]
[0, 4]

但并非总是如此。这是我刚刚得到的输出:

[0, 1]
[0, 2]
[1, 3]
[0, 4]

这是因为增量和条件的运行顺序不确定。最好明确相关依赖关系,因此如果您希望 w 在增量之后运行,您可以这样做:

import tensorflow as tf

global_step = tf.train.get_or_create_global_step()
incr_global_step = global_step.assign(global_step + 1)

with tf.control_dependencies([incr_global_step]):
w = tf.cond(tf.equal(tf.mod(global_step.initialized_value(), 2), 0),
lambda : tf.get_variable('w1', initializer=tf.zeros([], dtype=tf.int32)).initialized_value(),
lambda : tf.get_variable('w2', initializer=tf.ones([], dtype=tf.int32)).initialized_value())

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(4):
print(sess.run([w, incr_global_step]))

这令人惊讶地需要我为 'w1' 添加 initialized_value 。这确实很不矛盾。另外,这种情况下的输出是:

[0, 2]
[1, 3]
[0, 4]
[1, 5]

现在,增量的结果从 2 开始,这让我很恼火。看起来增量运行的次数比预期多了一次。所以我觉得 tf.cond 以某种方式强制执行一次额外的第一次运行,这将是其奇怪行为的原因。

如果您想要相反的情况,请让 w 在增量之前运行,您可以这样做:

import tensorflow as tf

w = tf.cond(tf.equal(tf.mod(global_step.initialized_value(), 2), 0),
lambda : tf.get_variable('w1', initializer=tf.zeros([], dtype=tf.int32)),
lambda : tf.get_variable('w2', initializer=tf.ones([], dtype=tf.int32)).initialized_value())

with tf.control_dependencies([w]):
incr_global_step = global_step.assign(global_step + 1)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(4):
print(sess.run([w, incr_global_step]))

是的,我不再需要 'w1'initialized_value 了。这会产生:

[0, 1]
[1, 2]
[0, 3]
[1, 4]

我认为这里的增量是有意义的。

关于python - 如何使用 global_step 计算调用 tf.cond 的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45549625/

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