Есть ли возможность изменить показатель, используемый обратным вызовом ранней остановки в Керасе?

13

При использовании обратного вызова ранней остановки в Keras обучение останавливается, когда некоторая метрика (обычно потеря проверки) не увеличивается. Есть ли способ использовать другую метрику (например, точность, отзыв, f-мера) вместо потери проверки? Все примеры, которые я видел до сих пор, похожи на этот: callbacks.EarlyStopping (monitor = 'val_loss', терпение = 5, verbose = 0, mode = 'auto')

P.Joseph
источник

Ответы:

11

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

Допустим, у вас есть следующая метрическая функция:

def my_metric(y_true, y_pred):
     return some_metric_computation(y_true, y_pred)

Единственное требование к этой функции состоит в том, что она принимает истинный y и предсказанный y.

Когда вы компилируете модель, вы указываете эту метрику, аналогично тому, как вы указываете встроенные метрики, такие как «точность»:

model.compile(metrics=['accuracy', my_metric], ...)

Обратите внимание, что мы используем имя функции my_metric без «» (в отличие от встроенной «точности»).

Затем, если вы определите свой EarlyStopping, просто используйте имя функции (на этот раз с ''):

EarlyStopping(monitor='my_metric', mode='min')

Обязательно укажите режим (мин, если ниже, тем лучше, макс, если выше, тем лучше).

Вы можете использовать его как любую встроенную метрику. Это, вероятно, также работает с другими обратными вызовами, такими как ModelCheckpoint (но я не проверял это). Внутренне, Keras просто добавляет новую метрику в список метрик, доступных для этой модели, используя имя функции.

Если вы указываете данные для проверки в своем model.fit (...), то вы также можете использовать их для EarlyStopping с помощью 'val_my_metric'.

Майкл
источник
3

Конечно, просто создайте свой собственный!

class EarlyStopByF1(keras.callbacks.Callback):
    def __init__(self, value = 0, verbose = 0):
        super(keras.callbacks.Callback, self).__init__()
        self.value = value
        self.verbose = verbose


    def on_epoch_end(self, epoch, logs={}):
         predict = np.asarray(self.model.predict(self.validation_data[0]))
         target = self.validation_data[1]
         score = f1_score(target, prediction)
         if score > self.value:
            if self.verbose >0:
                print("Epoch %05d: early stopping Threshold" % epoch)
            self.model.stop_training = True


callbacks = [EarlyStopByF1(value = .90, verbose =1)]
model.fit(X, y, batch_size = 32, nb_epoch=nb_epoch, verbose = 1, 
validation_data(X_val,y_val), callbacks=callbacks)

Я не проверял это, но это должно быть общим уклоном к тому, как вы это делаете. Если это не сработает, дайте мне знать, и я попробую в выходные. Я также предполагаю, что у вас уже есть собственный счет f1. Если не просто импортировать для sklearn.

Tophat
источник
+1 По состоянию на 11.022020 все еще работает, используя последние версии Keras и Python 3.7
Остин