我在Keras中为我正在处理的图像分割问题实现了U-Net。我发现早期的输出提供了非常好的结果,尽管概率很低。随着训练的继续和IoU分数的增加,我的输出中的像素减少了,但它们的概率更高。
更简洁地说,我的输出遗漏了某些特征,但在它识别的特征中具有更高的概率。
我很想知道我是否可以通过使用sigmoid激活函数在输出层之后强制像素值为1来纠正这一点。有简单的方法吗?我使用二进制交叉熵作为损失函数,所以我希望我能做一些类似的事情:
def binary_crossentropy_thresh(y_true,y_pred):
y_pred[y_pred>=0.2] = 1
return binary_crossentropy(y_true,y_pred)
但这对Tensors不起作用。如有任何建议,我们将不胜感激。
如果我没有充分解释我的问题,我深表歉意。
您可以在"自定义度量"中执行此操作,而不是在模型或损失中。
确保您的IoU
损失是"按图像"计算的,而不是"按批次"计算的。损失越普遍,它就越不会注意到微小的事情。如果这些图像的面积比其他图像小,则逐批丢失可能会忽略整个图像。
一个对我来说非常有效的损失函数的好建议是Lovasz
损失。
您也可以尝试样本权重(最适合单通道掩码(:
total_pixels = y_train.sum(axis=(1,2,3))
mean_pixels = total_pixels.mean(axis=0)
sample_weights = mean_pixels / total_pixels