如何在Keras中使用Adam优化器打印每个时代的学习率?

时间:2017-11-25 21:49:17

标签: python machine-learning neural-network deep-learning keras

因为当您使用自适应优化器时,在线学习与Keras不兼容(学习速率计划在调用.fit()时重置),我想看看我是否可以手动设置它。但是,为了做到这一点,我需要找出上一个学期的学习率。

那就是说,如何在每个时代打印学习率?我想我可以通过回调来做到这一点,但似乎你每次都必须重新计算它,而且我不确定如何用Adam做到这一点。

我在另一个帖子中发现了这个,但它只适用于SGD:

class SGDLearningRateTracker(Callback):
    def on_epoch_end(self, epoch, logs={}):
        optimizer = self.model.optimizer
        lr = K.eval(optimizer.lr * (1. / (1. + optimizer.decay * optimizer.iterations)))
        print('\nLR: {:.6f}\n'.format(lr))

5 个答案:

答案 0 :(得分:3)

对于仍然对此主题感到困惑的每个人:

@Andrey 的解决方案有效,但仅当您将学习率设置为衰减时,您必须安排学习率在 'n' epoch 后自行降低,否则它将始终打印相同的数字(起始学习率),这是因为这个数字在训练过程中不会改变,你看不到学习率是如何适应的,因为 Adam 中的每个参数都有一个不同的学习率,在训练过程中会自我适应,但是变量 success: callback, NEVER变化

答案 1 :(得分:2)

我正在使用以下基于@jorijnsmit答案的方法:

def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer._decayed_lr(tf.float32) # I use ._decayed_lr method instead of .lr
    return lr

optimizer = keras.optimizers.Adam()
lr_metric = get_lr_metric(optimizer)

model.compile(
    optimizer=optimizer,
    metrics=['accuracy', lr_metric],
    loss='mean_absolute_error', 
    )

它与亚当一起工作。

答案 2 :(得分:1)

class MyCallback(Callback):
    def on_epoch_end(self, epoch, logs=None):
        lr = self.model.optimizer.lr
        # If you want to apply decay.
        decay = self.model.optimizer.decay
        iterations = self.model.optimizer.iterations
        lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay)))
        print(K.eval(lr_with_decay))

关注this主题。

答案 3 :(得分:1)

这段代码可能会对您有所帮助。它基于Adam优化器的Keras实现(beta值是Keras的默认值)

from keras import Callback
from keras import backend as K
class AdamLearningRateTracker(Callback):
    def on_epoch_end(self, logs={}):
        beta_1=0.9, beta_2=0.999
        optimizer = self.model.optimizer
        if optimizer.decay>0:
            lr = K.eval(optimizer.lr * (1. / (1. + optimizer.decay * optimizer.iterations)))
        t = K.cast(optimizer.iterations, K.floatx()) + 1
        lr_t = lr * (K.sqrt(1. - K.pow(beta_2, t)) /(1. - K.pow(beta_1, t)))
        print('\nLR: {:.6f}\n'.format(lr_t))

答案 4 :(得分:0)

我发现this question很有帮助。一个可以回答您问题的最小可行示例是:

def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer.lr
    return lr

optimizer = keras.optimizers.Adam()
lr_metric = get_lr_metric(optimizer)

model.compile(
    optimizer=optimizer,
    metrics=['accuracy', lr_metric],
    loss='mean_absolute_error', 
    )