Arj*_*jun 6 python keras tf.keras
我认为 Adam 优化器的设计是为了自动调整学习率。但是在 Keras 中的 Adam 参数选项中有一个选项可以明确提及衰减。我想澄清衰减对 Keras 中 Adam 优化器的影响。如果我们在 lr = 0.001 上使用衰减说 0.01 来编译模型,然后拟合运行 50 个 epoch 的模型,那么在每个 epoch 之后学习率是否会降低 0.01 倍?
有什么方法可以指定学习率只有在运行一定数量的 epoch 后才衰减?
在 pytorch 中有一个名为 AdamW 的不同实现,它在标准 keras 库中不存在。这与如上所述在每个时期之后改变衰减相同吗?
预先感谢您的回复。
从源代码,decay调整lr每iterations根据
lr = lr * (1. / (1. + decay * iterations)) # simplified
Run Code Online (Sandbox Code Playgroud)
见下图。这是独立于时代的。iterations在每个批次拟合时增加 1(例如,每次train_on_batch调用,或有多少批次x用于model.fit(x)- 通常是len(x) // batch_size批次)。
要实现您所描述的内容,您可以使用如下回调:
from keras.callbacks import LearningRateScheduler
def decay_schedule(epoch, lr):
# decay by 0.1 every 5 epochs; use `% 1` to decay after each epoch
if (epoch % 5 == 0) and (epoch != 0):
lr = lr * 0.1
return lr
lr_scheduler = LearningRateScheduler(decay_schedule)
model.fit(x, y, epochs=50, callbacks=[lr_scheduler])
Run Code Online (Sandbox Code Playgroud)
在LearningRateScheduler接受一个函数作为参数,并且函数被馈送历元索引和lr在开始时由每个历元的.fit。然后它lr根据该函数进行更新- 因此在下一个时期,该函数被提供更新的 lr.
此外,我还提供了 AdamW、NadamW 和 SGDW 的 Keras 实现 - Keras AdamW。

澄清:第一个调用.fit()invoke on_epoch_beginwith epoch = 0- 如果我们不希望lr立即衰减,我们应该添加一个epoch != 0check in decay_schedule。然后,epoch表示已经过去了多少个时代- 所以当 时epoch = 5,应用衰减。