Как настроить функцию потерь в керасе на основе y_true - PullRequest
0 голосов
/ 10 марта 2020

Я хочу настроить функцию потерь на основе значений y_true. y_true - это двоичное значение. Для каждой мини-партии я хочу относиться к y_true == 0 и y_true == 1 по-разному. В настоящее время у меня есть:

def custom_loss(y_true, y_pred):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    zero = tf.fill(tf.shape(y_true_f), 0.0)
    one = tf.fill(tf.shape(y_true_f), 1.0)
    mask_0 = tf.equal(y_true_f,zero)
    mask_1 = tf.equal(y_true_f,one)
    y_pred_1 = tf.boolean_mask(y_pred_f,mask_1)
    y_pred_0 = tf.boolean_mask(y_pred_f,mask_0)
    y_true_1 = tf.boolean_mask(y_true_f,mask_1)
    y_true_0 = tf.boolean_mask(y_true_f,mask_0)
    loss1 = K.binary_crossentropy(y_true_1,y_pred_1)
    loss0 = K.binary_crossentropy(y_true_0,y_pred_0)
    loss = loss1 +a*loss0 # a is an arbitrary number

Тем не менее, я получил ошибку потерь в нан. Я предполагаю, что это потому, что я тренируюсь на данных о дисбалансе, где только несколько случаев имеют y_true == 1. Поэтому, когда в этом мини-пакете нет y_true == 1, есть nan. Я хочу добавить условие, основанное на форме mask_1. Как я могу это сделать?

1 Ответ

0 голосов
/ 15 марта 2020

Вы можете достичь этого с помощью той же техники, что и функция кросс-энтропийной потери. Вот функция loss = ((y_true)*(Loss1)) + ((1 - y_true)*(Loss2)), поэтому, если ваш y_true = 0, первый член будет равен нулю и приведет к loss = ((0)*Loss1) + ((1 - 0)*Loss2) = Loss2. Если ваш y_true = 1, ваш второй член станет нулевым, loss = ((1)*Loss1) + ((1 - 1)*Loss2) = Loss1

Следовательно, вы можете иметь 2 функции потери в зависимости от вашего y_true = {0,1}

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