Keras Callback EarlyStopping, сравнивающий потерю обучения и проверки

Я устанавливаю нейронную сеть в Python Keras.

Чтобы избежать переобучения, я бы хотел отслеживать потери при обучении / проверке и создавать правильный обратный вызов, который останавливает вычисления, когда потеря при обучении слишком много меньше потери при проверке.

Пример обратного вызова:

callback = [EarlyStopping(monitor='val_loss', value=45, verbose=0, mode='auto')]

Есть ли способ прекратить тренировку, когда потеря тренировки слишком мала по сравнению с потерей валидации?

заранее спасибо

1 ответ

Решение

Вы можете создать собственный класс обратного вызова для вашей цели.

Я создал тот, который должен соответствовать вашим потребностям:

class CustomEarlyStopping(Callback):
    def __init__(self, ratio=0.0,
                 patience=0, verbose=0):
        super(EarlyStopping, self).__init__()

        self.ratio = ratio
        self.patience = patience
        self.verbose = verbose
        self.wait = 0
        self.stopped_epoch = 0
        self.monitor_op = np.greater

    def on_train_begin(self, logs=None):
        self.wait = 0  # Allow instances to be re-used

    def on_epoch_end(self, epoch, logs=None):
        current_val = logs.get('val_loss')
        current_train = logs.get('loss')
        if current_val is None:
            warnings.warn('Early stopping requires %s available!' %
                          (self.monitor), RuntimeWarning)

        # If ratio current_loss / current_val_loss > self.ratio
        if self.monitor_op(np.divide(current_train,current_val),self.ratio):
            self.wait = 0
        else:
            if self.wait >= self.patience:
                self.stopped_epoch = epoch
                self.model.stop_training = True
            self.wait += 1

    def on_train_end(self, logs=None):
        if self.stopped_epoch > 0 and self.verbose > 0:
            print('Epoch %05d: early stopping' % (self.stopped_epoch))

Я позволил себе истолковать, что вы хотите остановить, если соотношение между train_loss и validation_loss выходит за определенный порог отношения. Этот аргумент отношения должен быть между 0.0 а также 1.0, Тем не мение, 1.0 опасно, так как потеря проверки и потеря обучения могут сильно колебаться в начале обучения.

Вы можете добавить аргумент терпения, который будет ждать, пока не превысит ли ваш порог определенное количество эпох.

Способ использовать это для экзамена:

callbacks = [CustomEarlyStopping(ratio=0.5, patience=2, verbose=1), 
            ... Other callbacks ...]
...
model.fit(..., callbacks=callbacks)

В этом случае он остановится, если потеря тренировки останется ниже 0.5*val_loss на протяжении более 2 эпох.

Это тебе помогает?

Другие вопросы по тегам