我正在尝试使用带有keras实现的u-net,我正在使用以下repo https://github.com/zhixuhao/unet 它运作良好,但我的问题是两类分割问题,所以我想将精度指标设置为jaccard,还有损失函数
我试图定义函数:
def Jac(y_true, y_pred):
y_pred_f = K.flatten(K.round(y_pred))
y_true_f = K.flatten(y_true)
num = K.sum(y_true_f * y_pred_f)
den = K.sum(y_true_f) + K.sum(y_pred_f) - num
return num / den
并在编译中调用它:
model.compile(optimizer = Adam(lr = 1e-4), loss = ['binary_crossentropy'], metrics = [Jac])
当我这样做时,每次迭代中的jaccard准确度会降低,直到达到ZERO! 任何解释为什么会发生? P.S:同样的事情发生在骰子上 P.S:输出层是带有sigmoid激活函数的conv 1 * 1
在二进制精度的keras中附加了原始实现:
def binary_accuracy(y_true, y_pred):
return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
我可以看到它也使用舍入来获得输出预测。
答案 0 :(得分:2)
你正在整理你的职能(K.round
)。
这会导致两个问题:
如果y_true
中的黑色(零)像素数量大于白色(1)像素,则会发生这种情况:
出于以上两个原因,您应该使用非舍入函数 并有时绘制您的输出以查看正在发生的事情:)
请注意,如果您将此作为损失函数使用,请将其乘以-1(因为您希望它减少而不是增加)
答案 1 :(得分:0)
从github复制以下功能。在keras指标中使用jacard_coef,如果你想要jacard_coef_loss keras丢失
def jacard_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 (intersection + 1.0) / (K.sum(y_true_f) + K.sum(y_pred_f) - intersection + 1.0)
def jacard_coef_loss(y_true, y_pred):
return -jacard_coef(y_true, y_pred)
model.compile(optimizer = Adam(lr = 1e-4), loss = [jacard_coef_loss], metrics = [jacard_coef])