TensorFlow 中的 global_step 是啥意思?

Posted

技术标签:

【中文标题】TensorFlow 中的 global_step 是啥意思?【英文标题】:What does global_step mean in Tensorflow?TensorFlow 中的 global_step 是什么意思? 【发布时间】:2017-05-01 04:54:41 【问题描述】:

这是来自 TensorFlow 网站的 tutorial code,

    谁能帮忙解释一下global_step是什么意思?

    我在 Tensorflow 网站上发现 global step is used count training steps,但我不太明白它的确切含义。

    另外,设置global_step时数字0是什么意思?

    def training(loss,learning_rate):
        tf.summary.scalar('loss',loss)
        optimizer = tf.train.GradientDescentOptimizer(learning_rate)
        
        # Why 0 as the first parameter of the global_step tf.Variable?
        global_step = tf.Variable(0, name='global_step',trainable=False)

        train_op = optimizer.minimize(loss, global_step=global_step)
    
        return train_op

根据 Tensorflow 文档 global_step:在变量更新后递增 1。这是否意味着在一次更新后global_step 变为 1?

【问题讨论】:

【参考方案1】:

global_step 指的是图中看到的批次数。每次提供一个批次时,权重都会向最小化损失的方向更新。 global_step 只是跟踪到目前为止看到的批次数量。当它在minimize() 参数列表中传递时,变量增加一。看看optimizer.minimize()

您可以使用tf.train.global_step() 获取global_step 值。 实用方法tf.train.get_global_steptf.train.get_or_create_global_step 也很方便。

0 是此上下文中全局步骤的初始值。

【讨论】:

谢谢!在您提供的链接tf.train.global_step() 中,global_step_tensor 设置为 10。这是否意味着图中已经看到了 10 个批次? @martianwars,我仍然不明白拥有 global_step 的意义。批处理的循环不是由python程序本身驱动的,所以python程序可以很容易地知道已经完成了多少批处理。为什么要费心让张量流来维护这样一个计数器? 优化器根据全局步骤 @xwk 改变它的常量 回答xwk的问题,我想如果你在100次迭代后停止训练,第二天恢复模型并再运行100次迭代。现在您的全局步长为 200,但第二次运行的局部迭代次数为 1 到 100,这是该运行的局部迭代次数,而不是全局迭代步长。所以全局步记录了迭代的总次数,可能用于改变学习率或其他超参数。 以 Wei Liu 的回答为基础,全局步骤对于跟踪分布式 TensorFlow 作业的进度也很有用。当工人同时看到批次时,需要有一种机制来跟踪看到的批次总数。这就是StopAtStepHook 的运作方式。【参考方案2】:

global_stepVariable 保存训练期间跨任务的总步数(每个步索引只会出现在单个任务上)。

global_step 创建的时间线帮助我们了解我们所处的位置 宏大的计划,从每个任务中分开。例如,可以在 Tensorboard 上针对global_step 绘制损失和准确率。

【讨论】:

【参考方案3】:

在下面为您展示一个生动的示例:

代码:

train_op = tf.train.GradientDescentOptimizer(learning_rate=LEARNING_RATE).minimize(loss_tensor,global_step=tf.train.create_global_step())
with tf.Session() as sess:
    ...
    tf.logging.log_every_n(tf.logging.INFO,"np.mean(loss_evl)= %f at step %d",100,np.mean(loss_evl),sess.run(tf.train.get_global_step()))

对应打印

INFO:tensorflow:np.mean(loss_evl)= 1.396970 at step 1
INFO:tensorflow:np.mean(loss_evl)= 1.221397 at step 101
INFO:tensorflow:np.mean(loss_evl)= 1.061688 at step 201

【讨论】:

【参考方案4】:

有网络,例如GAN,可能需要两个(或更多)不同的步骤。使用 WGAN 规范训练 GAN 要求鉴别器(或批评器)D 上的步骤比生成器 G 上的步骤多。在这种情况下,声明不同的 global_steps 变量很有用。

例子:G_lossD_loss是生成器和判别器的损失)

G_global_step = tf.Variable(0, name='G_global_step', trainable=False)
D_global_step = tf.Variable(0, name='D_global_step', trainable=False)

minimizer = tf.train.RMSPropOptimizer(learning_rate=0.00005)

G_solver = minimizer.minimize(G_loss, var_list=params, global_step=G_global_step)
D_solver = minimizer.minimize(D_loss, var_list=params, global_step=D_global_step)

【讨论】:

以上是关于TensorFlow 中的 global_step 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 梯度裁剪

Tensorflow实现学习率衰减

tensorflow-正则化与指数衰减率

tensorflow API _ 3 (tf.train.polynomial_decay)

TensorFlow 中的 tf.train.exponential_decay() 指数衰减法

转载:tensorflow保存训练后的模型