34

В настоящее время я использую следующий код:Как узнать, что Keras прекращает обучение, основанное на стоимости потерь?

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) 

Это говорит Keras прекратить обучение, когда потеря не улучшалось в течение 2-х эпох. Но я хочу, чтобы остановить тренировку после потери стали меньше некоторой постоянной «THR»:

if val_loss < THR: 
    break 

я видел в документации есть возможность сделать свой собственный обратный вызов: http://keras.io/callbacks/ Но ничего нашли, как остановить процесс обучения , Мне нужен совет.

ответ

8

Одним из решений является вызов model.fit(nb_epoch=1, ...) внутри цикла for, тогда вы можете поместить оператор break внутри цикла for и выполнить любой другой пользовательский поток управления, который вы хотите.

+0

Было бы неплохо, если бы они сделали обратный вызов, который принимает одну функцию, которая может это сделать. – Honesty

36

Я нашел ответ. Я заглянул в источники Keras и узнал код для EarlyStopping. Я сделал свой собственный обратный вызов, на его основе:

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 

и использование:

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

Просто, если это будет полезно для кого-то - в моем случае я использовал monitor = 'loss', он работал хорошо. – QtRoS

+6

Кажется, Keras обновлен. Функция обратного вызова [EarlyStopping] (https://keras.io/callbacks/#earlystopping) теперь включает в себя min_delta. Не нужно больше взломать исходный код, yay! https://stackoverflow.com/a/41459368/3345375 – jkdev

+0

При повторном чтении вопроса и ответов мне нужно исправить себя: min_delta означает «Остановить раньше, если в эпоху (или за несколько эпох) недостаточно улучшения». Тем не менее, ОП спросил, как «остановить раньше, когда потеря будет ниже определенного уровня». – jkdev

13

Обратный вызов keras.callbacks.EarlyStopping действительно есть min_delta аргумент. Из Keras документации:

min_delta: минимальное изменение в контролируемом количестве, чтобы квалифицировать как улучшение, то есть абсолютное изменение меньше, чем min_delta, будет считаться без улучшения.

+0

Для справки, вот документы для более ранней версии Keras (1.1.0), в которой аргумент min_delta еще не был включен: https://faroit.github.io/keras-docs/1.1.0/callbacks/# earlystopping – jkdev