2017-10-10 2 views
2

Mon modèle arrête d'entraîner après la 4ème époque même si je m'attends à ce qu'il continue à s'entraîner au-delà. J'ai mis le moniteur à la perte de la validation et la patience à 2, ce qui, je pense, signifie que l'entraînement s'arrête après la perte de validation augmente consécutivement pour 2 époques. Cependant, l'entraînement semble s'arrêter avant que cela n'arrive.Callback EarlyStopping se comporte mystérieusement dans Keras

J'ai défini EarlyStopping comme suit:

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

Et dans la fonction en forme que je l'utilise comme ceci:

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) 

Je ne comprends pas pourquoi la formation se termine après la 4ème époque.

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

Quelle est la val_loss de l'époque 1? –

+0

première ligne - 0.0860 @NicoleWhite – megashigger

+0

Oups je vois. Si quelque chose aurait dû s'arrêter après l'époque 3, puisque votre perte ne s'améliore pas à partir de l'époque 1 de l'époque 2 ou 3. Pouvez-vous définir verbose = 1 dans le rappel et montrer ce qu'il dit? –

Répondre

1

Je pense que votre interprétation de la fonction de rappel EarlyStopping est un peu hors; il s'arrête lorsque la perte ne s'améliore pas de la meilleure perte qu'il ait jamais vue pour patience époques. La meilleure perte de votre modèle était de 0,0860 à l'époque 1, et pour les époques 2 et 3 la perte ne s'est pas améliorée, donc il aurait dû cesser de s'entraîner après l'époque 3. Cependant, il continue à s'entraîner pour une autre époque. erreur -one au moins je dirais que ce que, étant donné ce que les documents disent patience, qui est:

patience: nombre d'époques sans amélioration après quoi la formation sera arrêté.

À partir du code source Keras (Edited légèrement pour plus de clarté):

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 

Remarquez comment self.wait n'est pas incrémentée jusqu'à ce que après le chèque contre self.patience, et bien que votre modèle aurait dû arrêter l'entraînement après l'époque 3, elle a continué pour une autre époque.

Malheureusement il semble que si vous voulez un rappel qui se comporte comme vous l'avez décrit, où il arrête l'entraînement sans amélioration consécutive dans patience époques, vous devez l'écrire vous-même. Mais je pense que vous pourriez juste modifier le rappel EarlyStopping légèrement pour accomplir ceci.

Édition: L'erreur "off-by-one" est fixed.