因为当您使用自适应优化器时,在线学习与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))
答案 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',
)