Keras custom metri c неправильная сумма - PullRequest
4 голосов
/ 14 января 2020

Я пытался реализовать precision и recall в качестве пользовательских метрик, как в https://datascience.stackexchange.com/questions/45165/how-to-get-accuracy-f1-precision-and-recall-for-a-keras-model/45166#45166? Newreg = 6190503b2be14e8aa2c0069d0a52749e , но по какой-то причине цифры были отключены (я знаю о среднем для проблемы с партиями это не то, о чем я говорю).

Итак, я попытался реализовать другую метри c:

def p1(y_true, y_pred):
    return K.sum(y_true)

Просто чтобы посмотреть, что произойдет ... Что бы я ожидал чтобы увидеть прямую линейную диаграмму с количеством 1 в моем наборе данных (я работаю над проблемой двоичной классификации с потерей binary_crossentropy).

Потому что Keras вычисляет пользовательские метрики как средние результаты для каждой партии, если у меня есть партия размером 32, я ожидаю, что эта p1 метрика вернет 16, но вместо этого я получила 15. Если я использую партию размера 16, я получаю что-то близкое к 7.9. Это было, когда я попробовал метод fit.

Я также вычислил точность проверки вручную после обучения модели, и она дает мне другое число, чем то, что я вижу как последний val_precision из истории. При этом использовалось fir_generator, в этом случае batch_size не предоставлено, поэтому я предполагаю, что он рассчитывает metri c для всего набора данных проверки сразу.

Еще одна важная деталь - когда я использовать один и тот же набор данных для обучения и проверки, даже когда я получаю одинаковые числа для истинных положительных результатов и предсказанных положительных результатов в последнюю эпоху, точность обучения и проверки достоверности различна (1 и 0,6).

true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))

Видимо 32.0 / (32.0 + K.epsilon()) = 0.6000000238418579

Есть идеи, что случилось?

Что может помочь:

enter image description here

def p1(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    return 1.0 / (true_positives + K.epsilon())

def p2(y_true, y_pred):
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    return 1.0 / (predicted_positives + K.epsilon())

def p3(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    return true_positives

def p4(y_true, y_pred):
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    return predicted_positives

1 Ответ

2 голосов
/ 14 января 2020

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

Начиная с TensorFlow 2.0, эти две метрики являются встроенными tensorflow.keras.metrics, и они хорошо работают при условии, что вы используете binary_crossentropy с Dense(1) на последнем уровне (в конце концов, это метрики для двоичной классификации, конечно).

Главное (важно отметить) заключается в том, что реализация полностью отличается от того, что вы пытаетесь достичь, и того, что было в Keras раньше.

Фактически, в версии Keras 1.X все эти метрики были доступны ( F1-Score, Recall и Precision), но они были удалены начиная с Keras 2.X из-за того, что оценка по партиям не имеет отношения к глобальной оценке этих метрик.

Согласно Франсуа Шоле (март 19th 2017) (https://github.com/keras-team/keras/issues/5794):

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

Однако в TensorFlow 2.0 (tensorflow.keras.metrics) они используют специализированные встроенные аккумуляторы, и вычисления выполняются должным образом, поэтому являются актуальными. для вашего набора данных. Вы можете найти более подробное описание здесь:

https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Recall?version=stable

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

Если у вас возникли проблемы с загрузкой модели, убедитесь, что:

  • Убедитесь, что у вас установлено Python 3 (> = 3.6.X)
  • Если проблема не устранена, убедитесь, что пользовательская информация передана load_model, обратившись к следующему фрагменту:

      metric_config_dict = {
           'precision': precision
       }
    
       model = tensorflow.keras.models.load_model('path_to_my_model.hdf5',custom_objects= metric_config_dict)
    

Франсуа Шоле о выпуске Keras 2.3.0:

Keras 2.3.0 - это первая версия Kera 2.3 с несколькими бэкэндами, которая поддерживает TensorFlow 2.0. Он поддерживает совместимость с TensorFlow 1.14, 1.13, а также с Theano и CNTK.

В этом выпуске API синхронизирован c с API tf.keras начиная с TensorFlow 2.0. Однако обратите внимание, что он не поддерживает большинство функций TensorFlow 2.0, в частности, активное выполнение. Если вам нужны эти функции, используйте tf.keras.

Это также последний основной выпуск мульти-серверных Keras. В дальнейшем мы рекомендуем пользователям рассмотреть возможность переключения своего кода Keras на tf.keras в TensorFlow 2.0. Он реализует тот же API Keras 2.3.0 (поэтому переключение должно быть таким же простым, как и изменение операторов импорта Keras), но у него есть много преимуществ для пользователей TensorFlow, таких как поддержка быстрого выполнения, распространения, обучения TPU и, как правило, гораздо лучшая интеграция между низкоуровневым TensorFlow и высокоуровневыми концепциями, такими как Layer и Model. Он также лучше поддерживается.

Развитие будет сосредоточено на развитии tf.keras. В течение следующих 6 месяцев мы будем поддерживать мульти-бэкэнд-керас, но будем только исправлять ошибки. Изменения API не будут перенесены

Поэтому даже создатель Keras рекомендует переключиться на tf.keras вместо обычного keras. Пожалуйста, включите ваш код и проверьте, сохраняются ли проблемы. Если вы смешаете tf.keras и keras, вы получите всевозможные странные ошибки; таким образом, измените весь ваш импорт на tf.keras. Для получения дополнительной информации относительно TensorFlow 2.0 и других изменений вы можете обратиться к этому: https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/

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