2017-10-10 84 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