目錄
1、直接獲取現有模型的學習率
2、打印顯示學習率
3、調整學習率
1)1.LearningRateScheduler
2)ReduceLROnPlateau
利用tensorflow的Keras模塊我們可以建立我們自己定義的卷積神經網絡模型,但是一般不會觸碰到學習率這個問題,一般默認的學習率都是0.001,有時候希望學習率小一點,需要調參,因此記錄一下
1、直接獲取現有模型的學習率
import tensorflow.keras as tfk
from tensorflow.keras import backend# 獲取學習率的數值
lr = backend.get_value(model.optimizer.lr)# 修改當前模型的學習率
backend.set_value(model.optimizer.lr,new_lr_value)
2、打印顯示學習率
def get_lr_metric(optimizer): # printing the value of the learning ratedef lr(y_true, y_pred):return optimizer.lrreturn lroptimizer = Adam(lr=1e-4)
lr_metric = get_lr_metric(optimizer)model.compile(optimizer = optimizer, loss = 'MSE', metrics = ['acc', lr_metric])
3、調整學習率
Keras提供兩種學習率適應方法,調整學習率需要在model.fit或者model.fit_generator中的callbacks回調函數中實現。
1)1.LearningRateScheduler
keras.callbacks.LearningRateScheduler(schedule)
參數
- schedule:函數,該函數以epoch號為參數(從0算起的整數),返回一個新學習率(浮點數)
import keras.backend as K
from keras.callbacks import LearningRateSchedulerdef scheduler(epoch):# 每隔100個epoch,學習率減小為原來的1/10if 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=300, callbacks=[reduce_lr])
2)ReduceLROnPlateau
當評價指標不在提升時,減少學習率 當學習停滯時,減少2倍或10倍的學習率常常能獲得較好的效果。該回調函數檢測指標的情況,如果在patience個epoch中看不到模型性能提升,則減少學習率
參數
- monitor:被監測的量
- factor:每次減少學習率的因子,學習率將以lr = lr*factor的形式被減少
- patience:當patience個epoch過去而模型性能不提升時,學習率減少的動作會被觸發
- mode:‘auto’,‘min’,‘max’之一,在min模式下,如果檢測值觸發學習率減少。在max模式下,當檢測值不再上升則觸發學習率減少。
- epsilon:閾值,用來確定是否進入檢測值的“平原區”
- cooldown:學習率減少后,會經過cooldown個epoch才重新進行正常操作
?
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=300, validation_split=0.1, callbacks=[reduce_lr])
?