从tf.train.AdamOptimizer获取当前学习率
tensorflow
11
0

我想打印出nn的每个训练步骤的学习率。

我知道亚当具有自适应学习率,但是有没有办法我可以看到这一点(用于张量板中的可视化)

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

Sung Kim的建议对我有用,我的确切步骤是:

lr = 0.1
step_rate = 1000
decay = 0.95

global_step = tf.Variable(0, trainable=False)
increment_global_step = tf.assign(global_step, global_step + 1)
learning_rate = tf.train.exponential_decay(lr, global_step, step_rate, decay, staircase=True)

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, epsilon=0.01)
trainer = optimizer.minimize(loss_function)

# Some code here

print('Learning rate: %f' % (sess.run(trainer ._lr)))
收藏
评论

所有优化器都有一个私有变量,用于保存学习率的值。

adagrad梯度下降中,它称为self._learning_rate 。在亚当,它是self._lr

因此,您只需要打印sess.run(optimizer._lr)即可获得该值。需要Sess.run,因为它们是张量。

收藏
评论

我认为您可以做的最简单的事情是优化器的子类化。

它有几种方法,我猜是根据变量类型调度的。常规Dense变量似乎通过_apply_dense 。此解决方案不适用于稀疏或其他情况。

如果看一下实现,您会发现它在这些“插槽”中存储了mt EMA。所以看起来像这样:

class MyAdam(tf.train.AdamOptimizer):
    def _apply_dense(self, grad, var):
        m = self.get_slot(var, "m")
        v = self.get_slot(var, "v")

        m_hat = m/(1-self._beta1_power)
        v_hat = v/(1-self._beta2_power)

        step = m_hat/(v_hat**0.5 + self._epsilon_t)

        # Use a histogram summary to monitor it during training.
        tf.summary.histogram("hist", step) 

        return super(MyAdam,self)._apply_dense(grad, var)

这里的step将在区间[-1,1]中,即乘以学习率,以确定应用于参数的实际步长。

图中通常没有节点,因为有一个大的training_ops.apply_adam可以完成所有工作。

在这里,我只是从中创建一个直方图摘要。但是您可以将其粘贴在附加到该对象的词典中,以后再阅读或随便使用它。

将其放入mnist_deep.py ,并向训练循环中添加一些摘要:

all_summaries = tf.summary.merge_all()  
file_writer = tf.summary.FileWriter("/tmp/Adam")
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i % 100 == 0:
            train_accuracy,summaries = sess.run(
                [accuracy,all_summaries],
                feed_dict={x: batch[0], y_: batch[1], 
                           keep_prob: 1.0})
            file_writer.add_summary(summaries, i)
            print('step %d, training accuracy %g' % (i, train_accuracy))
       train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

在TensorBoard中产生下图:

TensorBoard直方图选项卡,显示8种不同的直方图

收藏
评论

在TensorFlow源中,Adam优化器的当前lr计算如下:

    lr = (lr_t * math_ops.sqrt(1 - beta2_power) / (1 - beta1_power))

因此,请尝试:

    current_lr = (optimizer._lr_t * tf.sqrt(1 - 
    optimizer._beta2_power) / (1 - optimizer._beta1_power))

    eval_current_lr = sess.run(current_lr)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号