前言
记录一下在kaggle图像分割比赛中用到的一些损失函数,把我用到了的一些损失函数基于tensorflow与keras实现。
交叉熵
- 在Keras中,损失函数是binary_crossentropy(y_true, y_pred);
- 在TensorFlow中,它是softmax_cross_entropy_with_logits_v2
加权交叉熵
加权交叉熵(WCE)是CE的变体,其中所有正例都通过某个系数加权。它用于类不平衡的情况。例如,当您的图像具有10%黑色像素和90%白色像素时,常规CE将无法正常工作。
- 在TensorFlow中,损失函数是weighted_cross_entropy_with_logits。
- 在Keras,我们必须实现自己的功能:
def loss(y_true, y_pred):
y_pred = convert_to_logits(y_pred)
loss = tf.nn.weighted_cross_entropy_with_logits(logits=y_pred, targets=y_true, pos_weight=beta)
# or reduce_sum and/or axis=-1
return tf.reduce_mean(loss)
return loss
平衡交叉熵
平衡交叉熵(BCE)类似于WCE。唯一的区别是我们的重量也是负面的例子。定义为:
在keras中的实现:
def weighted_bce_loss(y_true, y_pred, weight):
epsilon = 1e-7
y_pred = K.clip(y_pred, epsilon, 1. - epsilon)
logit_y_pred = K.log(y_pred / (1. - y_pred))
loss = weight * (logit_