tf.train.get_global_step()
返回的值是当前训练步数吗?如果不是,那么当前的global_step
与当前训练步数有何不同?
这是关于以下代码的参考:
optimizer=lambda: tf.train.FtrlOptimizer( learning_rate=tf.train.exponential_decay( learning_rate=0.1, global_step=tf.train.get_global_step(), decay_steps=10000000, decay_rate=0.96)))
tf.train.get_global_step()
会在每个训练步数递增global_step
并相应地影响learning_rate
吗?或者更具体地说,global_step
的值是否与当前训练步数的值相同,并相应地影响learning_rate
?
回答:
问题编辑后的更新
tf.train.get_global_step()
会在每个训练步数递增global_step
吗?
不会。优化器会负责递增,tf.train.get_global_step()
只是获取当前存储全局步数的变量(如果之前已经定义了的话)。
并相应地影响学习率吗?
是的,学习率调度会内部获取当前全局步数的值,并相应地调整学习率。
更新:一些澄清
在TensorFlow中,通常在Python中理解的“变量”(不是 tf.Variable()
)和张量(tf.Variable
是一种张量)之间存在关键区别。
当你调用
global_step = tf.train.get_global_step()
(假设之前某处已经定义了一个全局步数),你会得到一个Tensor
对象,而不是整数。
基本理念是将计算的构建阶段(你描述应用于数据的操作)和实际执行阶段(你输入数据并获得结果)分开。这通常会引起最初的混乱,但这是TensorFlow编程模型的一个关键点(至少在TensorFlow 2.0之前)。
如果你想获取global_step
的当前值,你需要评估图。假设你已经定义了一个tf.Session()
,你可以选择:
step_value = sess.run(global_step)
或者替代地:
step_value = global_step.eval(session=sess)
学习率调度内部会这样做。在每个步骤,它会获取全局步数的当前值,并根据给定的参数计算学习率。同样,优化器内部会在每个步骤更新当前的全局步数值,因此除非你需要该值用于日志记录/调试,否则你通常不会显式地评估global_step
。