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“向前传球”和“向后传球”是什么意思?在代码方面,您指的是哪些变量?你有密码吗?