Чи є можливість змінити показник, використаний при зворотному зупинці виклику в Керасі?


13

Під час використання зворотного виклику раннього припинення в навчанні Keras припиняється, коли деяка метрика (зазвичай втрата валідації) не збільшується. Чи існує спосіб використання іншої метрики (як точність, нагадування, вимірювання f) замість втрати перевірки? Усі приклади, які я бачив до цього часу, схожі на цей: callbacks.EarlyStopping (monitor = 'val_loss', терпіння = 5, багатослівний = 0, mode = 'auto')

Відповіді:


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

Обов’язково вкажіть режим (min, якщо нижчий - кращий, max, якщо вище - кращий).

Ви можете використовувати його як і будь-який вбудований показник. Це, ймовірно, також працює з іншими зворотними викликами, такими як ModelCheckpoint (але я цього не перевіряв). Внутрішньо Керас просто додає нову метрику до списку метрик, доступних для цієї моделі, використовуючи ім'я функції.

Якщо ви вказали дані для перевірки у вашому 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.


+1 Все ще працює з 2.11.2020 р., Використовуючи останні Keras і Python 3.7
Остін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.