Как определить точность как функцию потерь в Керасе? - PullRequest
0 голосов
/ 25 апреля 2018

Известно, что sparse_categorical_crossentropy в кератах может получить функцию средней потери среди каждой категории. Но что, если бы я был обеспокоен только одной определенной категорией? Например, если я хочу определить точность (= TP / (TP + FP)) на основе этой категории как функцию потерь, как я могу ее записать? Спасибо!

Мои коды были такими:

from keras import backend as K
def my_loss(y_true,y_pred):
    y_true = K.cast(y_true,"float32")
    y_pred = K.cast(K.argmax(y_pred),"float32")
    nominator = K.sum(K.cast(K.equal(y_true,y_pred) & K.equal(y_true, 0),"float32"))
    denominator = K.sum(K.cast(K.equal(y_pred,0),"float32"))
    return -(nominator + K.epsilon()) / (denominator + K.epsilon())

И ошибка такая:

argmax is not differentiable

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

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

Вместо использования argmax, выполните y_true * y_pred.

0 голосов
/ 06 июня 2019

Я не рекомендую вам использовать точность в качестве функции потерь.

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

Одним из альтернативных решений является использование F1 в качестве функции потерь, затем ручная настройка отсечки вероятности для получения желаемого уровня точности, а также отзыва не слишком низкая.

0 голосов
/ 25 апреля 2018

В методе fit можно передать параметр class_weight, где вы определяете, какие классы важнее.

Это должен быть словарь:

{
    0: 1, #class 0 has weight 1
    1: 0.5, #class 1 has half the importance of class 0
    2: 0.7, #....
    ...
}

Пользовательские потери

Если это не совсем то, что вам нужно, вы можете создать такие функции потери, как:

import keras.backend as K

def customLoss(yTrue,yPred):

    create operations with yTrue and yPred
        - yTrue = the true output data (equal to y_train in most examples)        
        - yPred = the model's calculated output

        - yTrue and yPred have exactly the same shape: (batch_size,output_dimensions,....) 
             - according to the output shape of the last layer
             - also according to the shape of y_train    

    all operations must be like +, -, *, / or operations from K (backend)

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