我有一个高度不平衡数据的二进制分割问题,因此每个第一类样本都有近 60 个零类样本。为了解决这个问题,我在 Keras 中编写了一个简单的加权二元交叉熵损失函数,并以 Tensorflow 作为后端。
def weighted_bce(y_true, y_pred):
weights = (y_true * 59.) + 1.
bce = K.binary_crossentropy(y_true, y_pred)
weighted_bce = K.mean(bce * weights)
return weighted_bce
我想问一下这个实现是否正确,因为我是 Keras/Tensorflow 的新手,优化器很难优化它。损失从 1.5 到 0.4 并且没有进一步下降。如果我将它长时间训练到过度拟合的程度,正常的二元交叉熵会表现得更好。在有人问之前,我不能使用 class_weight,因为我正在训练一个完全卷积的网络。