我正在解决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
好的,我找到的解决方案如下:
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)
我正在实施这个解决方案,但我想知道我们必须给网络的基本事实是什么。也就是说,现在输出是损失,我们希望损失为 0,那么我们应该像下面这样训练网络吗?
model = get_unet_w_lambda_loss()
model.fit([inputs, weights, masks], zero_images)