本篇內(nèi)容主要講解“怎么使用ReduceLROnPlateau”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用ReduceLROnPlateau”吧!
創(chuàng)新互聯(lián)公司于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計制作、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元玉環(huán)做網(wǎng)站,已為上家服務(wù),為玉環(huán)各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
ReduceLROnPlateau是Keras中默認包含的回調(diào)。神經(jīng)網(wǎng)絡(luò)的學習率決定了梯度的比例因子,因此過高的學習率會導致優(yōu)化器超過最優(yōu)值,而學習率過低則會導致訓練時間過長。很難找到一個靜態(tài)的、效果很好的、不變的學習率。
顧名思義,“降低高原學習率”就是在損失指標停止改善或達到穩(wěn)定時降低學習率。一般學習率減少2到10倍,這有助于磨練參數(shù)的最佳值。
要使用ReduceLROnPlateau,必須首先創(chuàng)建回調(diào)對象。有四個參數(shù)很重要:
monitor,它用來監(jiān)視指標
factor,它是新的學習率將被降低(乘以)的因子
persistence,回調(diào)激活之前等待的停滯epoch數(shù)
min_lr,它可以降低到的最小學習率。這可以防止不必要和不有益的減少。
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來安排學習率。如果你知道(可能來自以前的研究或?qū)嶒?網(wǎng)絡(luò)的學習率在從epochs 1-10時應(yīng)該是x, 在epochs 10-20是應(yīng)該是y,LearningRateScheduler可以幫助實現(xiàn)這些變化。以上epoch的數(shù)字可以任意變化。
創(chuàng)建學習率調(diào)度器需要一個用戶定義的函數(shù),該函數(shù)將epoch和learning rate作為參數(shù)。返回對象應(yīng)該是新的學習率。
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)后,就可以用于模型的訓練。這些調(diào)度程序非常有用,允許對網(wǎng)絡(luò)進行控制,但建議在第一次訓練網(wǎng)絡(luò)時使用ReduceLROnPlateau,因為它更具適應(yīng)性。然后,可以進行可視化模型,看是否能提供關(guān)于如何構(gòu)造一個適當?shù)腖R調(diào)度器的相關(guān)想法。
此外,你可以同時使用ReduceLROnPlateau和LearningRateScheduler,例如,使用調(diào)度程序硬編碼一些學習速率(例如在前10個epoch不更改),同時利用自適應(yīng)能力,在高原上降低學習率以提升性能。
EarlyStopping可以非常有助于防止在訓練模型時產(chǎn)生額外的冗余運行。冗余運行會導致高昂的計算成本。當網(wǎng)絡(luò)在給定的時間段內(nèi)沒有得到改善時,網(wǎng)絡(luò)完成訓練并停止使用計算資源。與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有助于防止在訓練中產(chǎn)生梯度爆炸問題,因為輸入NaN會導致網(wǎng)絡(luò)的其他部分發(fā)生爆炸。如果不采用TerminateOnNaN,Keras并不阻止網(wǎng)絡(luò)的訓練。另外,nan會導致對計算能力的需求增加。為了防止這些情況發(fā)生,添加TerminateOnNaN是一個很好的安全檢查。
rom keras.callbacks import TerminateOnNaN model.fit(X_train, y_train, epochs=15, callbacks = [TerminateOnNaN()])
由于許多原因,ModelCheckpoint可以以某種頻率(也許每隔10個左右的epoch)保存模型的權(quán)重,因此它非常有用。
如果訓練模型時突然中斷,則不需要完全重新訓練模型。
如果,比如說,在第30個epoch,模型開始顯示出過擬合的跡象或其他問題,比如梯度爆炸,我們可以用最近保存的權(quán)重重新加載模型(比如在第25個epoch),并調(diào)整參數(shù)以避免該問題,而無需重新進行大部分訓練。
能夠提取某個epoch的權(quán)重并將其重新加載到另一個模型中有利于遷移學習。
在下面的場景中,ModelCheckpoint用于存儲具有最佳性能的模型的權(quán)重。在每個epoch,如果模型比其他記錄的epoch表現(xiàn)更好,則其權(quán)重存儲在一個文件中(覆蓋前一個的權(quá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)要復雜得多。
我們的自定義回調(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編號,也可以訪問當前度量、日志的字典。如果需要其他信息,比如學習率,可以使用keras.backend.get_value.
然后,可以像對待其他回調(diào)函數(shù)一樣對待你自定義的回調(diào)函數(shù)。
model.fit(X_train, y_train, epochs=15, callbacks=[CustomCallback()])
到此,相信大家對“怎么使用ReduceLROnPlateau”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
新聞名稱:怎么使用ReduceLROnPlateau
文章路徑:http://vcdvsql.cn/article44/jhisee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、App開發(fā)、標簽優(yōu)化、做網(wǎng)站、企業(yè)網(wǎng)站制作、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)