Я хочу настроить функцию потерь на основе значений 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. Как я могу это сделать?