91 votes

Comment dire à Keras d'arrêter l'entraînement en fonction de la valeur de perte?

Actuellement, j'utilise le code suivant:

 callbacks = [
    EarlyStopping(monitor='val_loss', patience=2, verbose=0),
    ModelCheckpoint(kfold_weights_path, monitor='val_loss', save_best_only=True, verbose=0),
]
model.fit(X_train.astype('float32'), Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
      shuffle=True, verbose=1, validation_data=(X_valid, Y_valid),
      callbacks=callbacks)
 

Il dit à Keras de cesser de s'entraîner lorsque la perte ne s'est pas améliorée pendant 2 époques. Mais je veux arrêter de m'entraîner après que la perte soit devenue inférieure à un "THR" constant:

 if val_loss < THR:
    break
 

J'ai vu dans la documentation qu'il existe une possibilité de faire votre propre rappel: http://keras.io/callbacks/ Mais rien n'a trouvé comment arrêter le processus de formation. J'ai besoin d'un conseil.

96voto

ZFTurbo Points 1165

J'ai trouvé la réponse. J'ai examiné les sources de Keras et découvert le code pour EarlyStopping. J'ai fait mon propre rappel, basé sur celui-ci:

 class EarlyStoppingByLossVal(Callback):
    def __init__(self, monitor='val_loss', value=0.00001, verbose=0):
        super(Callback, self).__init__()
        self.monitor = monitor
        self.value = value
        self.verbose = verbose

    def on_epoch_end(self, epoch, logs={}):
        current = logs.get(self.monitor)
        if current is None:
            warnings.warn("Early stopping requires %s available!" % self.monitor, RuntimeWarning)

        if current < self.value:
            if self.verbose > 0:
                print("Epoch %05d: early stopping THR" % epoch)
            self.model.stop_training = True
 

Et utilisation:

 callbacks = [
    EarlyStoppingByLossVal(monitor='val_loss', value=0.00001, verbose=1),
    # EarlyStopping(monitor='val_loss', patience=2, verbose=0),
    ModelCheckpoint(kfold_weights_path, monitor='val_loss', save_best_only=True, verbose=0),
]
model.fit(X_train.astype('float32'), Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
      shuffle=True, verbose=1, validation_data=(X_valid, Y_valid),
      callbacks=callbacks)
 

26voto

devinder Points 136

Le rappel keras.callbacks.EarlyStopping a un argument min_delta. De la documentation Keras:

min_delta: la variation minimale de la quantité contrôlée pour être considérée comme une amélioration, c’est-à-dire une modification absolue inférieure à min_delta, ne comptera pas comme une amélioration.

14voto

1'' Points 5044

Une solution consiste à appeler model.fit(nb_epoch=1, ...) intérieur d'une boucle for. Vous pouvez ensuite insérer une instruction break dans la boucle for et utiliser le flux de contrôle personnalisé souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X