2017-10-10 69 views
2

我的模型在第4個紀元後停止訓練,即使我期望它在這之後繼續訓練。我已經將顯示器設置爲驗證丟失和耐心等級爲2,我認爲這意味着在驗證損失連續增加2個時期後,訓練停止。但是,培訓似乎在此之前停止。早期停止回調在Keras中表現神祕

我定義EarlyStopping如下:

callbacks = [ 
     EarlyStopping(monitor='val_loss', patience=2, verbose=0), 
    ] 

並且在擬合函數我用這樣的:

hist = model.fit_generator(
      generator(imgIds, batch_size=batch_size, is_train=True), 
      validation_data=generator(imgIds, batch_size=batch_size, is_val=True), 
      validation_steps=steps_per_val, 
      steps_per_epoch=steps_per_epoch, 
      epochs=epoch_count, 
      verbose=verbose_level, 
      callbacks=callbacks) 

我不明白爲什麼第四紀元後訓練結束。

675/675 [==============================] - 1149s - loss: 0.1513 - val_loss: 0.0860 
Epoch 2/30 
675/675 [==============================] - 1138s - loss: 0.0991 - val_loss: 0.1096 
Epoch 3/30 
675/675 [==============================] - 1143s - loss: 0.1096 - val_loss: 0.1040 
Epoch 4/30 
675/675 [==============================] - 1139s - loss: 0.1072 - val_loss: 0.1019 
Finished training intermediate1. 
+0

什麼是從時代1 val_loss? –

+0

第一行 - 0.0860 @NicoleWhite – megashigger

+0

哎呀,我明白了。如果任何事情在時代3之後應該停止,因爲在時代2或3中,從時代1的損失不會有所改善。您可以在回調中設置verbose = 1並顯示它說的內容嗎? –

回答

1

我認爲你對EarlyStopping回調的解釋有點偏離;它停止的時候,損失並沒有從改善到最好的損失patience時代。在第一個時代,你的模型的最佳損失爲0.0860,而第二和第三時期的損失沒有改善,所以它應該在第三個時代後停止訓練。然而,由於休息時間,它將繼續訓練一個新紀元 - 酮的錯誤,至少我會叫的話給什麼文件說約patience,那就是:

耐心:紀元沒有改善後的訓練將被停止編號。

從Keras源代碼(編輯略有清晰度):

class EarlyStopping(Callback): 
    def on_epoch_end(self, epoch, logs=None): 
     current = logs.get(self.monitor) 

     if np.less(current - self.min_delta, self.best): 
      self.best = current 
      self.wait = 0 
     else: 
      if self.wait >= self.patience: 
       self.stopped_epoch = epoch 
       self.model.stop_training = True 
      self.wait += 1 

通知self.wait怎麼不遞增,直到後對證self.patience,所以一段時間後,你的模型應該已經停止訓練時代3,它繼續了一個新紀元。

不幸的是,看起來,如果你想要的行爲,你描述它在patience時期停止訓練不連續的改善的方式,一個回調,你必須自己編寫。但我認爲你可以稍微修改EarlyStopping回調來實現這一點。

編輯:錯過的錯誤是fixed