溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用ReduceLROnPlateau

發(fā)布時間:2021-12-27 13:39:01 來源:億速云 閱讀:2370 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么使用ReduceLROnPlateau”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“怎么使用ReduceLROnPlateau”吧!

ReduceLROnPlateau是Keras中默認包含的回調(diào)。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)率決定了梯度的比例因子,因此過高的學(xué)習(xí)率會導(dǎo)致優(yōu)化器超過最優(yōu)值,而學(xué)習(xí)率過低則會導(dǎo)致訓(xùn)練時間過長。很難找到一個靜態(tài)的、效果很好的、不變的學(xué)習(xí)率。

顧名思義,“降低高原學(xué)習(xí)率”就是在損失指標停止改善或達到穩(wěn)定時降低學(xué)習(xí)率。一般學(xué)習(xí)率減少2到10倍,這有助于磨練參數(shù)的最佳值。

要使用ReduceLROnPlateau,必須首先創(chuàng)建回調(diào)對象。有四個參數(shù)很重要:

  • monitor,它用來監(jiān)視指標

  • factor,它是新的學(xué)習(xí)率將被降低(乘以)的因子

  • persistence,回調(diào)激活之前等待的停滯epoch數(shù)

  • min_lr,它可以降低到的最小學(xué)習(xí)率。這可以防止不必要和不有益的減少。

from keras.callbacks import ReduceLROnPlateau
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                              patience=5, min_lr=0.001)
model.fit(X_train, Y_train, callbacks=[reduce_lr])

當使用model.fit時,可以指定回調(diào)參數(shù)。注意,這可以接受一個列表,因此可以安排多個回調(diào)。

LearningRateScheduler是ReduceLROnPlateau的另一種選擇,它允許用戶根據(jù)epoch來安排學(xué)習(xí)率。如果你知道(可能來自以前的研究或?qū)嶒?網(wǎng)絡(luò)的學(xué)習(xí)率在從epochs 1-10時應(yīng)該是x, 在epochs 10-20是應(yīng)該是y,LearningRateScheduler可以幫助實現(xiàn)這些變化。以上epoch的數(shù)字可以任意變化。

創(chuàng)建學(xué)習(xí)率調(diào)度器需要一個用戶定義的函數(shù),該函數(shù)將epoch和learning rate作為參數(shù)。返回對象應(yīng)該是新的學(xué)習(xí)率。

from keras.callbacks import LearningRateScheduler

def scheduler(epoch, lr): #定義回調(diào)schedule
   if lr < 0.001: return lr * 1.5 #如果lr太小,增加lr
   elif epoch < 5: return lr #前五個epoch,不改變lr
   elif epoch < 10: return lr * tf.math.exp(-0.1) #第五到第十個epoch,減少lr
   else: return lr * tf.math.exp(-0.05) #第10個epoch之后,減少量更少
  
callback = LearningRateScheduler(scheduler) #創(chuàng)建回調(diào)對象
model.fit(X_train, y_train, epochs=15, callbacks=[callback])

然后,將其轉(zhuǎn)換為Keras回調(diào)后,就可以用于模型的訓(xùn)練。這些調(diào)度程序非常有用,允許對網(wǎng)絡(luò)進行控制,但建議在第一次訓(xùn)練網(wǎng)絡(luò)時使用ReduceLROnPlateau,因為它更具適應(yīng)性。然后,可以進行可視化模型,看是否能提供關(guān)于如何構(gòu)造一個適當?shù)腖R調(diào)度器的相關(guān)想法。

此外,你可以同時使用ReduceLROnPlateau和LearningRateScheduler,例如,使用調(diào)度程序硬編碼一些學(xué)習(xí)速率(例如在前10個epoch不更改),同時利用自適應(yīng)能力,在高原上降低學(xué)習(xí)率以提升性能。

EarlyStopping可以非常有助于防止在訓(xùn)練模型時產(chǎn)生額外的冗余運行。冗余運行會導(dǎo)致高昂的計算成本。當網(wǎng)絡(luò)在給定的時間段內(nèi)沒有得到改善時,網(wǎng)絡(luò)完成訓(xùn)練并停止使用計算資源。與ReduceLROnPlateau類似,EarlyStopping需要monitor。

from keras.callbacks import EarlyStopping
  
callback = EarlyStopping(monitor='loss', patience=5)
model.fit(X_train, y_train, epochs=15, callbacks=[callback])

TerminateOnNaN有助于防止在訓(xùn)練中產(chǎn)生梯度爆炸問題,因為輸入NaN會導(dǎo)致網(wǎng)絡(luò)的其他部分發(fā)生爆炸。如果不采用TerminateOnNaN,Keras并不阻止網(wǎng)絡(luò)的訓(xùn)練。另外,nan會導(dǎo)致對計算能力的需求增加。為了防止這些情況發(fā)生,添加TerminateOnNaN是一個很好的安全檢查。

rom keras.callbacks import TerminateOnNaN
model.fit(X_train, y_train, epochs=15, callbacks = [TerminateOnNaN()])

由于許多原因,ModelCheckpoint可以以某種頻率(也許每隔10個左右的epoch)保存模型的權(quán)重,因此它非常有用。

  • 如果訓(xùn)練模型時突然中斷,則不需要完全重新訓(xùn)練模型。

  • 如果,比如說,在第30個epoch,模型開始顯示出過擬合的跡象或其他問題,比如梯度爆炸,我們可以用最近保存的權(quán)重重新加載模型(比如在第25個epoch),并調(diào)整參數(shù)以避免該問題,而無需重新進行大部分訓(xùn)練。

  • 能夠提取某個epoch的權(quán)重并將其重新加載到另一個模型中有利于遷移學(xué)習(xí)。

在下面的場景中,ModelCheckpoint用于存儲具有最佳性能的模型的權(quán)重。在每個epoch,如果模型比其他記錄的epoch表現(xiàn)更好,則其權(quán)重存儲在一個文件中(覆蓋前一個的權(quán)重)。在訓(xùn)練結(jié)束時,我們使用model.load_weights進行加載.

from keras.callbacks import ModelCheckpoint

callback = ModelCheckpoint( #創(chuàng)建回調(diào)
    filepath='/filepath/checkpoint', #告訴回調(diào)要存儲權(quán)重的filepath在哪
    save_weights_only=True, #只保留權(quán)重(更有效),而不是整個模型
    monitor='val_acc', #度量
    mode='max', #找出使度量最大化的模型權(quán)重
    save_best_only=True #只保留最佳模型的權(quán)重(更有效),而不是所有的權(quán)重
)

model.fit(X_train, y_train, epochs=15, callbacks=[callback])
model.load_weights(checkpoint_filepath) #將最佳權(quán)重裝入模型中。

或者,如果需要基于頻率的保存(每5個epoch保存一次),請將save_freq設(shè)置為5

編寫自定義回調(diào)是Keras包含的最好的特性之一,它允許執(zhí)行高度特定的操作。但是,請注意,構(gòu)造它比使用默認回調(diào)要復(fù)雜得多。

我們的自定義回調(diào)將采用類的形式。類似于在PyTorch中構(gòu)建神經(jīng)網(wǎng)絡(luò),我們可以繼承keras.callbacks.Callback回調(diào),它是一個基類。

我們的類可以有許多函數(shù),這些函數(shù)必須具有下面列出的給定名稱以及這些函數(shù)將在何時運行。例如,將在每個epoch開始時運行on_epoch_begin函數(shù)。下面是Keras將從自定義回調(diào)中讀取的所有函數(shù),但是可以添加其他“helper”函數(shù)。

class CustomCallback(keras.callbacks.Callback): #繼承keras的基類
    def on_train_begin(self, logs=None):
        #日志是某些度量的字典,例如鍵可以是 ['loss', 'mean_absolute_error']
    def on_train_end(self, logs=None): ...
    def on_epoch_begin(self, epoch, logs=None): ...
    def on_epoch_end(self, epoch, logs=None): ...
    def on_test_begin(self, logs=None): ...
    def on_test_end(self, logs=None): ...
    def on_predict_begin(self, logs=None): ...
    def on_predict_end(self, logs=None): ...
    def on_train_batch_begin(self, batch, logs=None): ...
    def on_train_batch_end(self, batch, logs=None): ...
    def on_test_batch_begin(self, batch, logs=None): ...
    def on_test_batch_end(self, batch, logs=None): ...
    def on_predict_batch_begin(self, batch, logs=None): ...
    def on_predict_batch_end(self, batch, logs=None): ...

根據(jù)函數(shù)的不同,你可以訪問不同的變量。例如,在函數(shù)on_epoch_begin中,該函數(shù)既可以訪問epoch編號,也可以訪問當前度量、日志的字典。如果需要其他信息,比如學(xué)習(xí)率,可以使用keras.backend.get_value.

然后,可以像對待其他回調(diào)函數(shù)一樣對待你自定義的回調(diào)函數(shù)。

model.fit(X_train, y_train, epochs=15, callbacks=[CustomCallback()])

到此,相信大家對“怎么使用ReduceLROnPlateau”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI