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.
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)
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.
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.
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