Как сохранить лучшую модель в Керасе на основе метрики AUC? - PullRequest
1 голос
/ 14 марта 2019

Я хотел бы сохранить лучшую модель в Керасе на основе auc, и у меня есть этот код:

def MyMetric(yTrue, yPred):
    auc = tf.metrics.auc(yTrue, yPred)
    return auc

best_model = [ModelCheckpoint(filepath='best_model.h5', monitor='MyMetric', save_best_only=True)]

train_history = model.fit([train_x], 
          [train_y], batch_size=batch_size, epochs=epochs, validation_split=0.05, 
                          callbacks=best_model, verbose = 2)

ТАК моя модель работает без ума, я получаю это предупреждение:

RuntimeWarning: Can save best model only with MyMetric available, skipping.
  'skipping.' % (self.monitor), RuntimeWarning)

Было бы здорово, если кто-нибудь скажет мне, что это правильный способ сделать это, и если нет, что мне делать?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

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

def as_keras_metric(method):
    import functools
    from keras import backend as K
    import tensorflow as tf
    @functools.wraps(method)
    def wrapper(self, args, **kwargs):
        """ Wrapper for turning tensorflow metrics into keras metrics """
        value, update_op = method(self, args, **kwargs)
        K.get_session().run(tf.local_variables_initializer())
        with tf.control_dependencies([update_op]):
            value = tf.identity(value)
        return value
    return wrapper

@as_keras_metric
def AUROC(y_true, y_pred, curve='ROC'):
    return tf.metrics.auc(y_true, y_pred, curve=curve)

Затем вам нужно скомпилировать вашу модель с этим показателем:

model.compile(loss=train_loss, optimizer='adam', metrics=['accuracy',AUROC])

Наконец: проверьте модель следующим образом:

model_checkpoint = keras.callbacks.ModelCheckpoint(path_to_save_model, monitor='val_AUROC', 
                                                   verbose=0, save_best_only=True, 
                                                   save_weights_only=False, mode='auto', period=1)

Будьте осторожны: я считаю, что валидация AUROC рассчитывается по партиям и усредняется; поэтому может дать некоторые ошибки с контрольной точки. Хорошей идеей может быть проверка после завершения обучения модели того, что AUROC прогнозов обученной модели (вычисленный с помощью sklearn.metrics) соответствует тому, что сообщает Tensorflow во время обучения и контрольной точки

2 голосов
/ 14 марта 2019

Вы должны передать метрику, которую хотите отслеживать, в model.compile.

https://keras.io/metrics/#custom-metrics

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=[MyMetric])

Кроме того, tf.metrics.auc возвращает кортеж, содержащий тензор иUPDATE_OP.Keras ожидает, что пользовательская метрическая функция будет возвращать только тензор.

def MyMetric(yTrue, yPred):
    import tensorflow as tf
    auc = tf.metrics.auc(yTrue, yPred)
    return auc[0]

После этого шага вы получите ошибки о неинициализированных значениях.Пожалуйста, посмотрите эти темы:

https://github.com/keras-team/keras/issues/3230

Как рассчитать получение рабочей характеристики (ROC) и AUC в кератах?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...