【问题标题】:Keras: Pixelwise class imbalance in binary image segmentationKeras:二值图像分割中的像素级不平衡
【发布时间】:2019-09-24 14:09:05
【问题描述】:

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

我的问题分为两部分:

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

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

【问题讨论】:

    标签: keras deep-learning semantic-segmentation


    【解决方案1】:

    回答您的问题。

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

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

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

    然后是你的类权重字典(有多种计算方法,重要的是为表现不佳的类分配更大的权重),

      class_weights = {0:1000/900,1:1000/100}
    

    例如: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_crossentropycategorical_crossentropy 之外,其他损失在不平衡数据集上本质上表现更好。 Dice Loss 就是这样一个损失函数。

    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 1 - dice_coef(y_true, y_pred)
    
    1. 您还可以将binary_crossentropy 的总和用作损失函数 以及其他适合您的损失:即loss = dice_loss + bce

    【讨论】:

    • 谢谢。所以即使输出只有一个来自 sigmoid 的单值输出类(相对于两个输出,softmax 风格),keras 足够聪明,可以理解这两个类的含义?目前,当我尝试将 class_weights 与 fit 结合使用时,我遇到了某种关键字错误(正如您在语法方面显示的那样) - 我离开办公室几天了,所以无法提供确切的错误消息目前。
    • 我得到的错误是“'class_eight' not supported for 3+ dimensional targets”。我需要将我的 500x500x1 折叠成矢量吗?
    • 这个帖子有人在同一个问题上挣扎,看起来他们矢量化并使用了 sample_weights:github.com/keras-team/keras/issues/3653
    • 哇,很高兴知道,老实说我不知道​​。然后样本权重是要走的路,我也会修改我的答案:D
    • 我就是喜欢 StackOverflow。你试图用你的想法帮助一些人,然后其他人告诉你一个更好/真正解决问题的方法。分享就是关怀:D
    猜你喜欢
    • 2018-02-05
    • 2018-10-19
    • 2018-05-12
    • 1970-01-01
    • 2017-08-05
    • 2019-09-05
    • 2018-09-23
    • 2017-11-23
    • 2019-08-27
    相关资源
    最近更新 更多