如何基于y_真值定制keras中的损失函数

如何基于y_真值定制keras中的损失函数,keras,deep-learning,loss,Keras,Deep Learning,Loss,我想根据y_真值自定义损失函数。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_tr

我想根据y_真值自定义损失函数。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。我想根据遮罩1的形状添加if条件。我该怎么做呢?

您可以使用与交叉熵损失函数相同的技术来实现这一点。这是函数
loss=((y_真)*(Loss1))+((1-y_真)*(Loss2))
,因此如果
y_真=0
,第一项将等于零,并导致
loss=((0)*Loss1)+(1-0)*Loss2)=Loss2
。如果您的
y_true=1
,您的第二个学期将变为零,
loss=((1)*Loss1)+((1-1)*Loss2)=Loss1

因此,根据
y_true={0,1}