我想基于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(...
您可以使用与交叉熵损失函数相同的技术来实现。这是函数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