Keras:二进制图像分割中的逐像素类不平衡

时间:2019-05-06 23:42:49

标签: keras semantic-segmentation

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

我的问题分为两个部分:

  1. 如果我天真地将binary_crossentropy用作损失500x500x1的输出,是否可以根据需要将其应用于每个像素?

  2. keras是否有一种方法可以对每个像素使用单个S形输出来应用类加权?

1 个答案:

答案 0 :(得分:1)

回答您的问题。

1)是的,只要您将图像分割神经网络对的格式为(500x500x1图像(灰度图像)+ 500x500x1(与图像对应的蒙版),就可以对binary_cross_entropy进行逐像素处理。

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

假设您有2个班级,其分布率为90%-10%。然后,如果对表示较少的类(在这种情况下为10%的类)犯错,则可能要对算法处以9倍以上的罚款。假设您有900个类别1的示例和100个类别2的示例。

然后,您的班级权重字典(有多种计算方法,重要的是为代表较少的班级分配更大的权重),class_weights = {0:1000 / 900,1:1000/100} < / p>

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

注意:仅在2d情况下(class_weight)可用。对于3D或更高维度的空间,应使用“ sample_weights”。

3)除binary_cross_entropy和categorical_cross_entropy外,其他指标在不平衡数据集上固有地表现更好。 Dice_Metric就是这样的指标。

Keras实现:

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 -dice_coef(y_true, y_pred)