【问题标题】:Keras, binary segmentation, add weight to loss functionKeras,二元分割,给损失函数添加权重
【发布时间】:2018-07-11 08:51:30
【问题描述】:

我正在使用 Keras(带有 tf 后端)解决二进制分割问题。如何在面罩的每个区域的中心添加更多重量?

我尝试过添加cv2.erode()的骰子coef,但它不起作用

def dice_coef_eroded(y_true, y_pred):
    kernel = (3, 3)
    y_true = cv2.erode(y_true.eval(), kernel, iterations=1)
    y_pred = cv2.erode(y_pred.eval(), kernel, iterations=1)
    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 + 1) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1)

Keras 2.1.3,张量流 1.4

【问题讨论】:

  • 你能告诉我在面具的中心区域增加更多的重量是什么意思吗?我无法理解骰子系数和腐蚀如何用于该目的,因为您只是在那里找到相似度分数。
  • 我尝试画出想要的结果:imgur.com/a/tJEFw
  • 这是一个非常相似的问题。我不确定解决方案。
  • 看来,上面的解决方案是关于类平衡,而不是为特定区域/像素添加权重。

标签: python-3.x keras


【解决方案1】:

好的,我找到的解决方案如下:

1) 在您的迭代器中创建一个检索权重矩阵的方法(形状 = 掩码形状)。输出必须包含[图像、掩码、权重]

2) 创建一个包含损失函数的 Lambda 层

3) 创建身份损失函数

例子:

def weighted_binary_loss(X):
    import keras.backend as K
    import keras.layers.merge as merge
    y_pred, weights, y_true = X
    loss = K.binary_crossentropy(y_pred, y_true)
    loss = merge([loss, weights], mode='mul')
    return loss

def identity_loss(y_true, y_pred):
    return y_pred

def get_unet_w_lambda_loss(input_shape=(1024, 1024, 3), mask_shape=(1024, 1024, 1)):
    images = Input(input_shape)
    mask_weights = Input(mask_shape)
    true_masks = Input(mask_shape)
    ...
    y_pred = Conv2D(1, (1, 1), activation='sigmoid')(up1) #output of original unet
    loss = Lambda(weighted_binary_loss, output_shape=(1024, 1024, 1))([y_pred, mask_weights, true_masks])
    model = Model(inputs=[images, mask_weights, true_masks], outputs=loss)

【讨论】:

  • 你为什么使用 K.binary_crossentropy(y_pred,y_true)。不应该反过来吗?
【解决方案2】:

我正在实施这个解决方案,但我想知道我们必须向网络提供的基本事实是什么。也就是现在输出的是loss,我们希望loss为0,那么我们应该如下训练网络吗?

model = get_unet_w_lambda_loss()
model.fit([inputs, weights, masks], zero_images)

【讨论】:

  • 你实际上可以使用没有 lambda 层的更简单的解决方案,只需从这里创建一个像 dice_coef_weighted_one_class 这样的自定义损失:github.com/kohrah/DSBowl2018/blob/master/src/zoo_losses_K.py
  • 在使用 tensorflow 2 时创建输入不同于 y_pred, y_true 的自定义损失层对我不起作用
猜你喜欢
  • 2017-07-24
  • 2018-10-19
  • 2020-04-18
  • 2018-10-22
  • 2018-09-23
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多