34

Derzeit verwende ich den folgenden Code:Wie kann man Keras das Training basierend auf dem Verlustwert stoppen?

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 erzählt Keras Training zu stoppen, wenn Verlust nicht für zwei Epochen verbessert hat. Aber ich will Ausbildung stoppen, nachdem Verlust wurde kleiner als eine Konstante „THR“:

if val_loss < THR: 
    break 

ich in der Dokumentation gesehen haben gibt es Möglichkeit, eigenen Rückruf zu machen: http://keras.io/callbacks/ aber nichts gefunden, wie Trainingsprozess zu stoppen . Ich brauche einen Rat.

Antwort

8

Eine Lösung besteht darin, innerhalb einer For-Schleife model.fit(nb_epoch=1, ...) aufzurufen, dann können Sie eine break-Anweisung in die for-Schleife einfügen und jeden anderen benutzerdefinierten Steuerfluss ausführen, den Sie möchten.

+0

Es wäre nett, wenn sie einen Rückruf machen würden, der eine einzige Funktion übernimmt, die das tun kann. – Honesty

36

Ich fand die Antwort. Ich habe mir Keras Quellen angeschaut und Code für EarlyStopping gefunden. Ich habe meine eigenen Rückruf, 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) 
+0

Nur, wenn es für jemanden nützlich sein wird - in meinem Fall habe ich Monitor = 'Verlust' verwendet, es hat gut funktioniert. – QtRoS

+6

Es scheint, Keras wurde aktualisiert. Die Callback-Funktion [EarlyStopping] (https://keras.io/callbacks/#earlystopping) hat jetzt min_delta eingebaut. Keine Notwendigkeit, den Quellcode mehr zu hacken, yay! https://Stackoverflow.com/a/41459368/3345375 – jkdev

+0

Nachdem ich die Frage und die Antworten erneut gelesen habe, muss ich mich selbst korrigieren: min_delta bedeutet "Stoppen Sie früh, wenn es nicht genug Verbesserung pro Epoche (oder pro mehrere Epochen) gibt." Das OP fragte jedoch, wie man "früh aufhält, wenn der Verlust unter ein bestimmtes Niveau sinkt". – jkdev

13

Der keras.callbacks.EarlyStopping Rückruf ein min_delta Argument hat. Von Keras Dokumentation:

min_delta: minimale Änderung der überwachten Menge als eine Verbesserung zu qualifizieren, das heißt eine absolute Veränderung von weniger als min_delta, als keine Besserung rechnen.

+0

Hier finden Sie die Dokumentation für eine frühere Version von Keras (1.1.0), in der das Argument min_delta noch nicht enthalten war: https://faroit.github.io/keras-docs/1.1.0/callbacks/# Frühstopp – jkdev