С исходный код , decay
настраивает lr
на iterations
в соответствии с
lr = lr * (1. / (1. + decay * iterations)) # simplified
см. изображение ниже. Это не зависит от эпохи. 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])
LearningRateScheduler
принимает функцию в качестве аргумента, и функция получает индекс эпохи и lr
в начало каждой эпохи .fit
. Затем он обновляет lr
в соответствии с этой функцией - поэтому в следующую эпоху функция получает updated lr
.
Кроме того, есть реализация Keras AdamW, NadamW, и SGDW, мной - Keras AdamW .

Разъяснение : самый первый звонок .fit()
вызывает on_epoch_begin
с epoch = 0
- если мы не хотим немедленного распада sh lr
, мы должны добавить epoch != 0
проверку decay_schedule
. Тогда epoch
обозначает, сколько эпох уже прошло - поэтому, когда epoch = 5
, применяется распад.