Python 3.x Keras,二元分割,加权损失函数

Python 3.x Keras,二元分割,加权损失函数,python-3.x,keras,Python 3.x,Keras,我正在用Keras(w.tf后端)解决一个二进制分割问题。如何在面膜的每个区域的中心添加更多的权重 我已经尝试使用添加的cv2.correase()对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(), k

我正在用Keras(w.tf后端)解决一个二进制分割问题。如何在面膜的每个区域的中心添加更多的权重

我已经尝试使用添加的
cv2.correase()
对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,tensorflow 1.4好吧,我找到的解决方案如下:

1) 在迭代器中创建一个方法来检索权重矩阵(shape=mask shape)。输出必须包含[图像、遮罩、权重]

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) 在迭代器中创建一个方法来检索权重矩阵(shape=mask shape)。输出必须包含[图像、遮罩、权重]

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)

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

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

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

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

你能告诉我你在面具的中心区域增加重量是什么意思吗?我无法理解骰子系数和侵蚀对于这个目的是如何有用的,因为你们只是在那个里找到了一个相似的分数。我试图得出预期的结果:这是一个非常相似的问题。我不确定这个解决方案。看起来,上面的解决方案是关于类平衡,而不是给特定区域/像素添加权重。你能告诉我,给遮罩的中心区域添加更多权重是什么意思吗?我无法理解骰子系数和侵蚀对于这个目的是如何有用的,因为你们只是在那个里找到了一个相似的分数。我试图得出预期的结果:这是一个非常相似的问题。我不确定该解决方案。看来,上面的解决方案是关于类平衡,而不是为特定区域/像素添加权重。实际上,您可以使用没有lambda层的更简单的解决方案,从这里创建一个自定义损耗,如
dice_coef_weighted_one_class
:创建具有不同于
y_pred,y_true
输入的自定义损耗层在使用tensorflow 2时对我不起作用,实际上您可以使用没有lambda层的更简单的解决方案,从这里创建一个自定义损失,如
dice\u coef\u weighted\u one\u class
:创建输入不同于
y\u pred,y\u true的自定义损失层在使用tensorflow 2时对我不起作用,为什么要使用K.binary\u crossentropy(y\u pred,y\u true)。不应该是另一种方式吗?为什么你使用K.二进制交叉熵(y_pred,y_true)。难道不是相反吗?