wake-up-neo.com

Wie kann man Keras sagen, dass er das Training basierend auf dem Verlustwert abbricht?

Zur Zeit benutze ich folgenden Code:

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)

Es fordert Keras auf, das Training abzubrechen, wenn sich der Verlust 2 Epochen lang nicht verbessert hat. Aber ich möchte aufhören zu trainieren, nachdem der Verlust kleiner geworden ist als ein konstanter "THR":

if val_loss < THR:
    break

Ich habe in der Dokumentation gesehen, dass es die Möglichkeit gibt, einen eigenen Rückruf durchzuführen: http://keras.io/callbacks/ Aber nichts gefunden, um den Trainingsprozess zu stoppen. Ich brauche einen Rat.

66
ZFTurbo

Ich habe die Antwort gefunden. Ich habe mir Keras-Quellen angesehen und Code für EarlyStopping herausgefunden. Ich habe meinen eigenen Rückruf gemacht, basierend darauf:

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

Und Nutzung:

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

Der keras.callbacks.EarlyStopping-Rückruf hat ein min_delta-Argument. Aus der Keras-Dokumentation:

min_delta: Eine minimale Änderung der überwachten Menge, die als Verbesserung zu qualifizieren ist, d. h. eine absolute Änderung von weniger als min_delta, wird als keine Verbesserung gezählt.

23
devin

Eine Lösung besteht darin, model.fit(nb_Epoch=1, ...) in einer for-Schleife aufzurufen. Anschließend können Sie eine break-Anweisung in die for-Schleife einfügen und einen beliebigen anderen benutzerdefinierten Steuerungsfluss ausführen.

11
1''

Ich bin etwas spät dran, um XD zu beantworten. Aber ich habe das gleiche Problem mithilfe eines benutzerdefinierten Rückrufs gelöst.

Weisen Sie im folgenden benutzerdefinierten Rückrufcode THR den Wert zu, bei dem Sie das Training beenden möchten, und fügen Sie den Rückruf zu Ihrem Modell hinzu.

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