Python 如何获得全局步长变量的确定值(严格在增量之后或之前)

Python 如何获得全局步长变量的确定值(严格在增量之后或之前),python,tensorflow,Python,Tensorflow,考虑以下代码: import tensorflow as tf global_step = tf.train.create_global_step() x = tf.Variable(100.0) optimizer = tf.train.AdamOptimizer() train_op = optimizer.minimize(x, global_step=global_step) with tf.Session() as sess: sess.run(tf.global_vari

考虑以下代码:

import tensorflow as tf

global_step = tf.train.create_global_step()
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
train_op = optimizer.minimize(x, global_step=global_step)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    step, _ = sess.run([global_step, train_op])
    print(step)
我得到的输出是“1”,但我认为没有什么能阻止Tensorflow转而给我“0”,即“赋值”op之前的全局步长变量的值,该值在
训练op
中递增。实际上,我还有另一个更复杂的Tensorflow程序,它展示了这种行为,我从
Session.run([global\u step,train\u op])
中得到的全局步长值在我运行它的两台机器之间被一个关闭

对于全局步长变量,如何从
train_op
之前或
train_op
之后最终获取其值

我知道我可以在
sess.run([global_step])
之前或之后分别运行
sess.run([train_op])
,但如果不使代码过于复杂,我希望在单个
会话中尽可能多地运行(
)。我知道我可以通过将
global\u step
分配给另一个变量并在
tf.assign
train\u op
之间建立控制依赖关系来获得预增量值:

import tensorflow as tf

global_step = tf.train.create_global_step()
global_step2 = tf.get_variable('step-mirror', dtype=global_step.dtype, 
shape=global_step.shape)
global_step2 = tf.assign(global_step2, global_step)
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
with tf.control_dependencies([global_step2]):
    train_op = optimizer.minimize(x, global_step=global_step)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    step, _ = sess.run([global_step2, train_op])
    print(step)
但我正在寻找一种更简单的方法,也许是一个Tensorflow特性,我在指定变量赋值之前就缺少了这个特性

编辑:作为对此的响应,这不起作用,它将打印“1”而不是“0”:

import tensorflow as tf

global_step = tf.train.create_global_step()
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
with tf.control_dependencies([global_step]):
    train_op = optimizer.minimize(x, global_step=global_step)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    step, _ = sess.run([global_step, train_op])
    print(step)

您可以使用此选项在列车运行后读取全局步骤:

import tensorflow as tf

global_step = tf.train.create_global_step()
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
train_op = optimizer.minimize(x, global_step=global_step)

with tf.control_dependencies([train_op]):
    global_step_value = global_step.read_value()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    step, _ = sess.run([global_step_value, train_op])
    print(step)

这里的
global\u step\u value
不再是变量。它是一个张量,在计算了
train\u op
之后,其值为
global\u step
。这在“使用变量”中进行了描述。

我尝试了您的解决方案,效果良好。现在,当还需要
train\u op
时,我需要评估
global\u step\u value
,但当不需要
train\u op
时,我需要评估
global\u step
,因为评估
global\u step\u value
需要评估
train\u op
。因此,如果有一种方法可以在对train\u op进行任何评估之前指定评估
global\u step
,那么它看起来更干净。这样,我在评估global step时就不必关心
train\u op
,我有一种统一的评估方法。我想知道这是否可能。相反方向使用
tf.control\u dependencies
没有帮助。使train\u op对全局步长值张量具有控制依赖性应该是可行的。为什么它不适合你?@AlexandrePassos它不起作用。这就是为什么我说“在相反的方向上使用
tf.control\u dependencies
是没有帮助的”。你需要把整个向前和向后的过程放在control\u dependencies块内,而不仅仅是火车本身,来实现这一点。对不起,刚才说得不清楚了。@AlexandrePassos“向前传球”和“向后传球”是什么意思?在代码方面,您指的是哪些变量?你有密码吗?