阈值keras模型的图像分割输出



我在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

相关内容

  • 没有找到相关文章

最新更新