Frühes Anhalten bedeutet im Grunde, das Training abzubrechen, sobald Ihr Verlust zuzunehmen beginnt (oder mit anderen Worten, die Validierungsgenauigkeit abnimmt). Nach Unterlagen wird es wie folgt verwendet;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
Die Werte hängen von Ihrer Implementierung ab (Problem, Stapelgröße usw.), aber im Allgemeinen würde ich eine Überanpassung verwenden, um eine Überanpassung zu verhindern.
- Überwachen Sie den Validierungsverlust (Sie müssen eine Kreuzvalidierung oder mindestens Zug- / Testsätze verwenden), indem Sie das
monitor
Argument auf setzen 'val_loss'
.
min_delta
ist eine Schwelle dafür, ob ein Verlust in einer bestimmten Epoche als Verbesserung quantifiziert wird oder nicht. Wenn die Verlustdifferenz geringer ist min_delta
, wird sie als keine Verbesserung quantifiziert. Es ist besser, es als 0 zu belassen, da wir daran interessiert sind, wann der Verlust schlimmer wird.
patience
Das Argument gibt die Anzahl der Epochen vor dem Stoppen an, sobald Ihr Verlust zu steigen beginnt (hört auf, sich zu verbessern). Dies hängt von Ihrer Implementierung ab. Wenn Sie sehr kleine Stapel
oder eine große Lernrate verwenden, ist Ihr Verlust im Zick-Zack (die Genauigkeit wird lauter), also setzen Sie besser ein großes patience
Argument. Wenn Sie große Chargen und eine kleine Lernrate verwenden Ihr Verlust gleichmäßiger, sodass Sie ein kleineres patience
Argument verwenden können. In beiden Fällen lasse ich es als 2, damit ich dem Modell mehr Chancen geben kann.
verbose
entscheidet, was gedruckt werden soll, belassen Sie die Standardeinstellung (0).
mode
Das Argument hängt davon ab, in welche Richtung Ihre überwachte Menge geht (soll sie abnehmen oder zunehmen), da wir den Verlust überwachen, den wir verwenden können min
. Aber lassen wir Keras das für uns erledigen und setzen das aufauto
Also würde ich so etwas verwenden und experimentieren, indem ich den Fehlerverlust mit und ohne vorzeitiges Anhalten aufzeichne.
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
Im Hinblick auf mögliche Unklarheiten bei der Funktionsweise von Rückrufen werde ich versuchen, mehr zu erklären. Sobald Sie fit(... callbacks=[es])
Ihr Modell aufrufen , ruft Keras vorgegebene Funktionen für bestimmte Rückrufobjekte auf. Diese Funktionen können aufgerufen werden on_train_begin
, on_train_end
, on_epoch_begin
, on_epoch_end
und on_batch_begin
,on_batch_end
. Ein früher Stopp-Rückruf wird an jedem Epochenende aufgerufen, vergleicht den am besten überwachten Wert mit dem aktuellen und stoppt, wenn die Bedingungen erfüllt sind (wie viele Epochen sind seit der Beobachtung des am besten überwachten Werts vergangen und ist es mehr als ein Geduldargument, der Unterschied zwischen letzter Wert ist größer als min_delta etc ..).
Wie von @BrentFaust in den Kommentaren angegeben, wird das Training des Modells fortgesetzt, bis entweder die Bedingungen für das frühzeitige Anhalten erfüllt sind oder der epochs
Parameter (Standard = 10) in fit()
erfüllt ist. Durch das Festlegen eines Rückrufs zum vorzeitigen Stoppen wird das Modell nicht über seinen epochs
Parameter hinaus trainiert . Das Aufrufen einer fit()
Funktion mit einem größeren epochs
Wert würde also mehr vom Frühstopp-Rückruf profitieren.
min_delta
ist ein Schwellenwert dafür, ob die Änderung des überwachten Werts als Verbesserung quantifiziert wird oder nicht. Also ja, wenn wir geben,monitor = 'val_loss'
dann würde es sich auf den Unterschied zwischen dem aktuellen Validierungsverlust und dem vorherigen Validierungsverlust beziehen. In der Praxis würdemin_delta=0.1
eine Verringerung des Validierungsverlusts (aktuell - vorhergehend) von weniger als 0,1 nicht quantifizieren und somit das Training beenden (falls vorhandenpatience = 0
).callbacks=[EarlyStopping(patience=2)]
keine Auswirkung hat, es sei denn, Epochen sind gegebenmodel.fit(..., epochs=max_epochs)
.epoch=1
in einer for-Schleife (für verschiedene Anwendungsfälle) aufruft, in dem dieser Rückruf fehlschlagen würde. Wenn meine Antwort mehrdeutig ist, werde ich versuchen, sie besser auszudrücken.restore_best_weights
Argument (noch nicht in der Dokumentation) verwenden, mit dem das Modell nach dem Training mit den besten Gewichten geladen wird. Aber für Ihre Zwecke würde ichModelCheckpoint
Rückruf mitsave_best_only
Argument verwenden. Sie können die Dokumentation überprüfen. Die Verwendung ist unkompliziert, Sie müssen jedoch nach dem Training die besten Gewichte manuell laden.