我正在使用UNet模型训练具有大约1,000个灰度医学图像和1,000个相应蒙版的分割算法,其中医学图像中感兴趣的部分是白色像素,背景是黑色。
我将骰子损失和相似的骰子得分用作准确性指标,以说明我的白色像素的数量通常少于黑色背景像素的事实。但是训练时我仍然遇到一些问题
1)损失收敛太快。例如,如果我将SGD优化器的学习率设置为0.01,则大约2个纪元时,损失(训练和验证)将降至0.00009,从而提高准确性并以100%的比例结算。在看不见的场景上进行测试会得到空白图像。
假设-过度拟合: 我认为这是由于过度拟合造成的,因此我通过刚性变换(翻转和旋转)尽可能地扩大了数据集,但仍然没有帮助。 同样,如果我根据用于训练的相同数据测试模型,它仍会预测空白图像。那么,这是否意味着这不是过度拟合的情况?
2)该模型看起来甚至还没有训练。我能够在将所有测试数据都减少为黑色之前对其进行检查,但是即使那样,结果仍看起来像是模糊的原始图像没有分割我的训练蒙版突出显示的功能
3)损失与历元以及准确性与历元的输出图非常平滑::它们没有呈现出我期望进行语义分割时出现的任何振荡行为。根据{{3}}的相关文章,只有一个类别时,通常会出现一个平滑图表。但是,我假设我的模型将看到训练蒙版(白色像素与黑色像素),并将其视为两类问题。我在这个假设上错了吗?
4)根据this的帖子,骰子很适合不平衡的训练。我也尝试按照他们的建议获取precision / recall / F1结果,但无法做到这一点,并假设它可能与我的第3个问题有关,在该问题中,模型将我的细分任务视为一个单类问题。
TLDR:如何解决得到的黑色输出结果?您能帮我澄清一下,我的学习模型是否实际上将每个遮罩中的白色和黑色像素看作两个单独的类,如果不是,那么它实际上在做什么?
答案 0 :(得分:3)
由于类不平衡,您的模型仅预测一个类(背景/背面像素)。
损失收敛太快。例如,如果我将SGD优化器的学习率设置为0.01,则大约在2个纪元时,损失(训练和验证)将降至0.00009,并且准确率会迅速上升,并按比例稳定在100%。在看不见的场景上进行测试会得到空白图像。
降低学习率。 0.01
确实很高,因此请尝试使用3e-5
之类的东西进行学习,并查看模型的性能。
另外,具有100%的准确性(假设您正在使用骰子?)表明您仍在使用准确性,所以我相信您的模型无法识别您正在使用骰子/骰子损失进行训练和评估(代码段)将不胜感激。)
示例:
model.compile(optimizer=Adam(lr=TRAIN_SEG_LEARNING_RATE),
loss=dice_coef_loss,
metrics=[dice_coef])
此外,如果我根据用于训练的相同数据测试模型,它仍然可以预测空白图像。难道这不是过度拟合的情况吗?
尝试使用model.evaluate(test_data, test_label)
。如果评估的性能良好(如果仅预测0,则骰子应该非常低),则说明您的标签被某种方式弄乱了,或者您的管道有问题。
所有其他可能的解决方案: