Keras:二值图像分割中的像素类不平衡

Mas*_*iff 2 deep-learning keras semantic-segmentation

我有一个任务,输入图像500x500x1并得到500x500x1二进制分割。500x500工作时,只应触发一小部分(小“目标”)。我在输出处使用 sigmoid 激活。由于希望如此小的分数为正,因此训练往往会因所有输出为零或非常接近而停止。我已经编写了自己的损失函数来部分处理它,但如果可能的话,我想使用带有类权重的二元交叉熵。

我的问题分为两部分:

  1. 如果我天真地将binary_crossentropy损失应用于我的500x500x1输出,它会根据需要应用于每个像素吗?

  2. keras 有没有办法通过每个像素的单个 sigmoid 输出来应用类权重?

Tim*_*lin 6

回答您的问题。

  1. 是的,binary_cross_entropy将基于每个像素工作,前提是您将形式提供给图像分割神经网络对(500x500x1 图像(灰度图像)+ 500x500x1(图像的相应掩模))。

  2. 通过输入参数 ' class_weight' 参数model.fit()

    假设您有 2 个类别,分布率为 90%-10%。然后,当算法在代表性较差的类(本例中为 10% 的类)犯错误时,您可能需要对算法进行 9 倍的惩罚。假设您有 900 个 1 类示例和 100 个 2 类示例。

然后你的类权重字典(有多种方法来计算它,重要的是为代表性较差的类分配更大的权重),

  class_weights = {0:1000/900,1:1000/100}
Run Code Online (Sandbox Code Playgroud)

例子 :model.fit(X_train, Y_train, epochs = 30, batch_size=32, class_weight=class_weight)

注意:这仅适用于 2d 案例(class_weight)。对于 3D 或更高维度的空间,应该使用“sample_weights”。出于分段目的,您宁愿使用sample_weights参数

  1. 您将获得的最大收益是通过其他损失函数。除了binary_crossentropy和之外categorical_crossentropy,其他损失本质上在不平衡数据集上表现更好。Dice Loss就是这样一个损失函数。

喀拉拉邦实施:

    smooth = 1.

    def dice_coef(y_true, y_pred):
        y_true_f = K.flatten(y_true)
        y_pred_f = K.flatten(y_pred)
        intersection = K.sum(y_true_f * y_pred_f)
        return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
    
    
    def dice_coef_loss(y_true, y_pred):
        return 1 - dice_coef(y_true, y_pred)
Run Code Online (Sandbox Code Playgroud)
  1. binary_crossentropy 如果适合您,您还可以使用 和其他损失之和作为损失函数:即loss = dice_loss + bce