2017-05-11 108 views
17

我正在使用Keras爲我的項目培訓神經網絡。凱拉斯提供了一個早期停車的功能。我可否知道應該觀察哪些參數以避免我的神經網絡因過早停止而過度配合?Keras提前停止

回答

32

early stopping

提早終止基本停止訓練,一旦你的損失開始增加(或者換句話說,驗證準確度開始下降)。根據documents它使用如下:

keras.callbacks.EarlyStopping(monitor='val_loss', 
           min_delta=0, 
           patience=0, 
           verbose=0, mode='auto') 

值取決於你的實現(問題,批量大小等),但一般來說,以防止過度配合,我會使用;

  1. 監視驗證損失(需要使用交叉驗證 或至少火車/試驗組)由monitor 參數設置爲'val_loss'
  2. min_delta是否在某個時期量化損失的閾值爲 改進與否。如果損失差異低於min_delta,則量化 沒有改進。最好將它保留爲0,因爲當損失變得更糟時,我們對 感興趣。
  3. patience參數代表一旦你的損失開始增加(停止改進)之前停止的時代的數量。 這取決於具體的實現,如果你使用非常小批量大學習率你的損失鋸齒形(準確度會比較吵),所以最好設定一個 大patience說法。如果您使用大批量小 學習率您的損失將會更平滑,因此您可以使用 較小的patience參數。無論哪種方式,我會把它留作2,所以我會 給模型更多的機會。
  4. verbose決定打印什麼,將其保留爲默認值(0)。
  5. mode參數取決於您的監控數量 有什麼方向(應該是遞減還是遞增),因爲我們監控了損失,我們可以使用min。但是,讓我們離開keras 句柄,我們並將其設置爲auto

所以我會通過與不提前停止繪製的誤差損失,可以這麼用和實驗。

keras.callbacks.EarlyStopping(monitor='val_loss', 
           min_delta=0, 
           patience=2, 
           verbose=0, mode='auto') 

對於可能出現的不確定性有關回調是如何工作的,我會試着解釋更多。一旦您在模型上調用fit(... callbacks=[es]),Keras就會調用給定的回調對象預定義的函數。這些功能可以稱爲on_train_beginon_train_endon_epoch_begin,on_epoch_endon_batch_beginon_batch_end。提前停止回調在每個紀元末期被調用,比較最佳監測值和當前值,並在滿足條件時停止(自觀察最佳監測值以來有多少個曆元已經過去,並且它不是耐心論證,最後一個值比min_delta等大)。

正如@BrentFaust在評論中指出的那樣,模型的訓練將持續到滿足提前停止條件或epochs參數(默認值= 10)滿足fit()。設置提前停止回調不會讓模型訓練超出其epochs參數。因此,如果調用fit()函數,則較大的epochs值將從Early Stopping回調中受益更多。

+0

謝謝,我還是無法理解min delta的定義,從文檔中,min delta被定義爲監控值的最小變化,我可以知道keras是如何定義min監控值的變化的,是指不同的監控值目前的Val損失與之前的Val損失之間? – AizuddinAzman

+0

@AizuddinAzman關閉,'min_delta'是是否將量化監視值的改變作爲改進的閾值。所以是的,如果我們給出'monitor ='val_loss'',那麼它就會涉及當前驗證損失與之前驗證損失之間的差異。在實踐中,如果你給'min_delta = 0.1'小於0.1的驗證丟失(當前 - 前一個)的減少將不會量化,因此將停止訓練(如果你有'耐心= 0')。 – umutto

+0

當val_loss對n_epochs沒有改進時,會降低學習速度嗎?如何做? – mrgloom