Почему мои самоопределенные метрики в керасе потерпели неудачу? - PullRequest
1 голос
/ 18 февраля 2020

У меня есть трехклассовый классификатор, который реализован в керасе. (0, 1, 2) Я хочу получить показатель точности для каждой тренировки, поэтому я определил функцию metri c следующим образом:

def precision_pos(y_true, y_pred):
    # Calculates the precision
    true_positives = K.sum(K.cast(K.round(y_true * y_pred)==1, dtype='float32'))
    predicted_positives = K.sum(K.cast(K.round(y_pred)==1, dtype='float32'))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def precision_neg(y_true, y_pred):
    true_neg = K.sum(K.cast(K.round(y_true * y_pred)==4, dtype='float32'))
    predicted_neg = K.sum(K.cast(K.round(y_pred)==2, dtype='float32'))
    print(true_neg)
    print(predicted_neg)
    precision_neg = true_neg / (predicted_neg + K.epsilon())
    return precision_neg

def precision_neu(y_true, y_pred):
    true_neu = K.sum(K.cast(K.round(y_true * y_pred)==0, dtype='float32'))
    predicted_neu = K.sum(K.cast(K.round(y_pred)==0, dtype='float32'))
    print(true_neu)
    print(predicted_neu)
    precision_neu = true_neu / (predicted_neu + K.epsilon())
    return precision_neu

Я думаю, что первая функция работала хорошо, но две другие не , пожалуйста, смотрите вывод:

512/512 [==============================] - 4s 8ms/sample - loss: 7.2359 - precision_pos: 0.4674 - precision_neg: 0.0000e+00 - precision_neu: 2.8859
Train on 512 samples
512/512 [==============================] - 1s 3ms/sample - loss: 8.7310 - precision_pos: 0.5264 - precision_neg: 0.0000e+00 - precision_neu: 80000008.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 7.1996 - precision_pos: 0.2750 - precision_neg: 0.6720 - precision_neu: 600000000.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 9.9930 - precision_pos: 0.1250 - precision_neg: 10625000.0000 - precision_neu: 640000000.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 7.7442 - precision_pos: 0.0625 - precision_neg: 8750000.0000 - precision_neu: 640000000.0000
Train on 512 samples
512/512 [==============================] - 1s 3ms/sample - loss: 9.3498 - precision_pos: 0.0000e+00 - precision_neg: 10625000.0000 - precision_neu: 640000000.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 9.4443 - precision_pos: 0.0000e+00 - precision_neg: 5625000.0000 - precision_neu: 640000000.0000

Может кто-нибудь помочь в этом? я думаю, что внутренний продукт == 4 - это класс '2', прогнозирующие выборки скважины, pred == 2 - это все прогнозируемые 2 выборки, так что он не будет больше 1, верно? Спасибо всем

1 Ответ

0 голосов
/ 01 апреля 2020

После исследования ваших пользовательских метрик вы должны исследовать умножения и умножения .

В частности, эти строки,

def precision_neg(y_true, y_pred):
    true_neg = K.sum(K.cast(K.round(y_true * y_pred)==4, dtype='float32'))
    ## Rest of the code

def precision_neu(y_true, y_pred):
    true_neu = K.sum(K.cast(K.round(y_true * y_pred)==0, dtype='float32'))
    ## Rest of the code

Сосредоточив внимание на базовой операции K.round(y_true * y_pred), возвращается значение, которое при округлении равно 3, ie. 2.7405417. Следовательно, вы получаете данные, которые не обрабатываются должным образом, поэтому вы получаете метрики точности, превышающие 1.
. Вы можете попытаться обойти эту проблему, применяя методы if-else и / или используя tf.math.ceil или tf.math.floor, или даже явно указав, что когда значение равно 3, замените его на определенное значение.

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