如何基于y_true定制喀拉拉沙漠的损失函数>

问题描述 投票:0回答:1

我想基于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形状的条件。我该怎么办?

我想基于y_true值自定义损失函数。 y_true是一个二进制值。对于每个迷你批处理,我想以不同的方式对待y_true == 0和y_true == 1。目前,我有:def custom_loss(...

keras deep-learning loss
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.