web-dev-qa-db-fra.com

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 été trouvé sur la façon d'arrêter le processus de formation. J'ai besoin d'un conseil.

66
ZFTurbo

J'ai trouvé la réponse. J'ai examiné les sources de Keras et trouvé 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)
66
ZFTurbo

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

min_delta: le changement minimal dans la quantité surveillée pour être considéré comme une amélioration, c’est-à-dire un changement absolu inférieur à min_delta, ne comptera pas comme une amélioration.

23
devin

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

11
1''

Je suis un peu en retard pour répondre à XD. Mais j'ai résolu le même problème en utilisant un rappel personnalisé.

Dans le code de rappel personnalisé suivant, attribuez à THR la valeur à laquelle vous souhaitez arrêter l'entraînement et ajoutez le rappel à votre modèle.

from keras.callbacks import Callback

class stopAtLossValue(Callback):

        def on_batch_end(self, batch, logs={}):
            THR = 0.03 #Assign THR with the value at which you want to stop training.
            if logs.get('loss') <= THR:
                 self.model.stop_training = True
1
Rushin Tilva