神经网络收敛过快,预测空白结果

B1u*_*ng0 0 neural-network image-segmentation keras

我正在使用 UNet 模型来训练分割算法,其中包含大约 1,000 个灰度医学图像和 1,000 个相应的掩码,其中医学图像中感兴趣的部分是白色像素,背景是黑色。

我使用骰子损失和类似的骰子分数作为准确度指标,以说明我的白色像素的数量通常少于黑色背景像素的数量。但是我在训练的时候还是有一些问题

1)损失收敛过快。例如,如果我的 SGD 优化器的学习率为 0.01,则在大约 2 个 epoch 时,损失(训练和验证)将下降到 0.00009,并且准确度上升并按比例稳定在 100%。在一个看不见的集合上进行测试会给出空白图像。

假设 - 过度拟合:我假设这是由于过度拟合,所以我通过刚性变换尽可能地增加了数据集 - 翻转和旋转,但仍然没有帮助。此外,如果我针对用于训练它的相同数据测试模型,它仍然可以预测空白图像。那么这是否意味着它不是过度拟合的情况?

2)模型看起来不像是训练。我能够在将所有测试数据减少到黑色之前检查模型,但即便如此,结果看起来就像原始版本的模糊版本,而没有分割我的训练蒙版突出显示的特征

3) loss vs epochs 和accuracy vs epochs 输出图表非常平滑:它们没有呈现我在进行语义分割时期望看到的振荡行为。根据这个相关的帖子,当只有一个类时,通常会出现平滑的图表。然而,我假设我的模型会看到训练掩码(白色像素与黑色像素)并将其视为两类问题。这个假设我错了吗?

4)根据这篇文章,骰子适用于不平衡的训练集。我还尝试按照他们的建议获得精度/召回率/F1 结果,但无法做到,并假设这可能与我的第三个问题有关,模型将我的分割任务视为单类问题。

TLDR:如何修复我得到的黑色输出结果?您能否帮我澄清一下,我的学习模型是否实际上将每个蒙版中的白色和黑色像素视为两个单独的类,如果不是,它实际上在做什么?

小智 8

由于类别不平衡,您的模型仅预测一个类别(背景/背景像素)。

损失收敛过快。例如,如果我的 SGD 优化器的学习率为 0.01,则在大约 2 个 epoch 时,损失(训练和验证)将下降到 0.00009,并且准确度上升并按比例稳定在 100%。在一个看不见的集合上进行测试会给出空白图像。

降低你的学习率。0.01真的很高,所以尝试一些类似的方法3e-5来学习,看看你的模型表现如何。此外,具有 100% 的准确度(假设您正在使用骰子?)表明您仍在使用准确度,因此我相信您的模型无法识别您正在使用骰子/骰子损失进行训练和评估(代码片段将不胜感激)。

例子:

model.compile(optimizer=Adam(lr=TRAIN_SEG_LEARNING_RATE),              
              loss=dice_coef_loss, 
              metrics=[dice_coef])
Run Code Online (Sandbox Code Playgroud)

此外,如果我针对用于训练它的相同数据测试模型,它仍然可以预测空白图像。那么这是否意味着它不是过度拟合的情况?

尝试使用model.evaluate(test_data, test_label). 如果评估的性能良好(如果您只预测 0,那么骰子应该非常低),那么要么您的标签以某种方式混乱,要么您的管道有问题。

如果所有其他方法都失败了,可能的解决方案:

  • 确保通过此中的所有健全性检查 文章
  • 您可能没有足够的数据,因此请尝试使用随机裁剪的补丁方法。
  • 添加更多正则化(dropout、BatchNormalization、InstanceNormalization、增加输入图像大小等)