gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:16:28 24 4
gpt4 key购买 nike

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

我的问题分为两部分:

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

  2. 有没有一种方法可以让 keras 应用类加权,每个像素输出一个 sigmoid 函数?

最佳答案

回答您的问题。

  1. 是的,binary_cross_entropy 将基于每个像素工作,前提是您将形式为 (500x500x1 image(grayscale image) + 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)

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

  1. 您将获得的最大 yield 是通过其他损失函数。除了 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

关于Keras:二值图像分割中的像素类不平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56013674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com