我想基于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形状的条件。我该怎么办?
答案 0 :(得分:1)
您可以使用与交叉熵损失函数相同的技术来实现此目的。这是函数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
因此,您可以根据自己的y_true = {0,1}