Keras提供兩種學習率適應方法,可通過回調函數實現。
1. LearningRateScheduler
keras.callbacks.LearningRateScheduler(schedule)
該回調函數是學習率調度器.
參數
- schedule:函數,該函數以epoch號為參數(從0算起的整數),返回一個新學習率(浮點數)
代碼
import keras.backend as K
from keras.callbacks import LearningRateScheduler
def scheduler(epoch):
# 每隔100個epoch,學習率減小為原來的1/10
if epoch % 100 == 0 and epoch != 0:
lr = K.get_value(model.optimizer.lr)
K.set_value(model.optimizer.lr, lr * 0.1)
print("lr changed to {}".format(lr * 0.1))
return K.get_value(model.optimizer.lr)
reduce_lr = LearningRateScheduler(scheduler)
model.fit(train_x, train_y, batch_size=32, epochs=5, callbacks=[reduce_lr])
2. ReduceLROnPlateau
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)
當評價指標不在提升時,減少學習率
當學習停滯時,減少2倍或10倍的學習率常常能獲得較好的效果。該回調函數檢測指標的情況,如果在patience
個epoch中看不到模型性能提升,則減少學習率
參數
- monitor:被監測的量
- factor:每次減少學習率的因子,學習率將以lr = lr*factor的形式被減少
- patience:當patience個epoch過去而模型性能不提升時,學習率減少的動作會被觸發
- mode:‘auto’,‘min’,‘max’之一,在min模式下,如果檢測值觸發學習率減少。在max模式下,當檢測值不再上升則觸發學習率減少。
- epsilon:閾值,用來確定是否進入檢測值的“平原區”
- cooldown:學習率減少后,會經過cooldown個epoch才重新進行正常操作
- min_lr:學習率的下限
代碼
from keras.callbacks import ReduceLROnPlateau reduce_lr = ReduceLROnPlateau(monitor='val_loss', patience=10, mode='auto') model.fit(train_x, train_y, batch_size=32, epochs=5, validation_split=0.1, callbacks=[reduce_lr])
參考文獻:
【1】Keras學習率調整