Keras,二进制分割,增加损失函数的权重

时间:2018-02-01 05:17:26

标签: python-3.x keras

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

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

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,tensorflow 1.4

2 个答案:

答案 0 :(得分:2)

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

1)在你的Iterator中创建一个检索权重的方法'矩阵(形状=掩模形状)。输出必须包含[图像,蒙版,权重]

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)

答案 1 :(得分:0)

我正在实现此解决方案,但我想知道我们必须赋予网络的地面真理是什么。也就是说,现在的输出是损失,我们希望损失为0,那么我们应该按以下方式训练网络吗?

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