神经网络收敛太快预测空白结果
neural network converges too fast and predicts blank results
我正在使用一个 UNet 模型来训练一个分割算法,该算法包含大约 1,000 张灰度医学图像和 1,000 个相应的蒙版,其中医学图像中感兴趣的部分是白色像素,背景是黑色。
我使用骰子损失和类似的骰子得分作为准确度指标来说明我的白色像素通常比黑色背景像素少的事实。但是我在训练的时候还是遇到了一些问题
1) 损失收敛太快。 例如,如果我的 SGD 优化器的学习率为 0.01,在大约 2 个时期损失(训练和验证)将下降到0.00009,准确率按比例上升并稳定在 100%。在看不见的集合上进行测试会给出空白图像。
假设 - 过度拟合:
我认为这是由于过度拟合造成的,所以我通过刚性转换(翻转和旋转)尽可能地扩充了数据集,但仍然无济于事。
此外,如果我根据用于训练它的相同数据测试模型,它仍然会预测空白图像。那么这是否意味着它不是过度拟合的情况?
2)模型看起来甚至没有在训练。我能够在模型将所有测试数据减少为黑色之前检查模型,但即使那样结果也会看起来像原始版本的模糊版本,没有分割我的训练面具突出显示的功能
3) loss vs epochs 和 accuracy vs epochs 输出图表非常平滑: 它们呈现了 none 我希望在进行语义时看到的振荡行为分割。根据相关post,当只有一个class时,通常会出现平滑图表。然而,我假设我的模型会看到训练蒙版(白色像素与黑色像素)并将其视为两个 class 问题。我这个假设错了吗?
4) 根据 this post 骰子适用于不平衡的训练集。我也曾尝试按照他们的建议获得 precision/recall/F1 结果,但无法做到,并假设这可能与我的第三个问题有关,模型将我的分割任务视为单个 class 问题。
TLDR: 如何修复我得到的黑色输出结果?你能帮我澄清一下我的学习模型是否真的将每个面具中的白色和黑色像素视为两个独立的 classes,如果不是,它实际上在做什么?
由于 class 不平衡,您的模型仅预测一个 class(background/back 像素)。
The loss converges too fast. If I have my SGD optimizer's learning rate at 0.01 for example, at around 2 epochs the loss (training and validation) will drop to 0.00009 and the accuracy shoots up and settles at 100% in proportion. Testing on an unseen set gives blank images.
降低你的学习率。 0.01
确实很高,所以尝试像 3e-5
这样的东西来学习,看看你的模型表现如何。
此外,具有 100% 的准确度(据说您使用的是骰子?)表明您仍在使用准确度,因此我相信您的模型无法识别您正在使用 dice/dice 损失进行训练和评估(代码片段将不胜感激)。
示例:
model.compile(optimizer=Adam(lr=TRAIN_SEG_LEARNING_RATE),
loss=dice_coef_loss,
metrics=[dice_coef])
Also if I test the model against the same data I used to train it, it still predicts blank images. So does this mean it isn't a case of overfitting?
尝试使用 model.evaluate(test_data, test_label)
。如果评估的性能良好(如果您只预测 0,则 dice 应该非常低),那么要么您的标签在某种程度上被弄乱了,要么您的管道有问题。
如果一切都失败了,可能的解决方案:
- 确保通过此 article
中的所有完整性检查
- 您可能没有足够的数据,因此请尝试对随机裁剪使用 patchwise 方法。
- 添加更多正则化(dropout、BatchNormalization、InstanceNormalization、增加输入图像大小等)
我正在使用一个 UNet 模型来训练一个分割算法,该算法包含大约 1,000 张灰度医学图像和 1,000 个相应的蒙版,其中医学图像中感兴趣的部分是白色像素,背景是黑色。
我使用骰子损失和类似的骰子得分作为准确度指标来说明我的白色像素通常比黑色背景像素少的事实。但是我在训练的时候还是遇到了一些问题
1) 损失收敛太快。 例如,如果我的 SGD 优化器的学习率为 0.01,在大约 2 个时期损失(训练和验证)将下降到0.00009,准确率按比例上升并稳定在 100%。在看不见的集合上进行测试会给出空白图像。
假设 - 过度拟合: 我认为这是由于过度拟合造成的,所以我通过刚性转换(翻转和旋转)尽可能地扩充了数据集,但仍然无济于事。 此外,如果我根据用于训练它的相同数据测试模型,它仍然会预测空白图像。那么这是否意味着它不是过度拟合的情况?
2)模型看起来甚至没有在训练。我能够在模型将所有测试数据减少为黑色之前检查模型,但即使那样结果也会看起来像原始版本的模糊版本,没有分割我的训练面具突出显示的功能
3) loss vs epochs 和 accuracy vs epochs 输出图表非常平滑: 它们呈现了 none 我希望在进行语义时看到的振荡行为分割。根据
4) 根据 this post 骰子适用于不平衡的训练集。我也曾尝试按照他们的建议获得 precision/recall/F1 结果,但无法做到,并假设这可能与我的第三个问题有关,模型将我的分割任务视为单个 class 问题。
TLDR: 如何修复我得到的黑色输出结果?你能帮我澄清一下我的学习模型是否真的将每个面具中的白色和黑色像素视为两个独立的 classes,如果不是,它实际上在做什么?
由于 class 不平衡,您的模型仅预测一个 class(background/back 像素)。
The loss converges too fast. If I have my SGD optimizer's learning rate at 0.01 for example, at around 2 epochs the loss (training and validation) will drop to 0.00009 and the accuracy shoots up and settles at 100% in proportion. Testing on an unseen set gives blank images.
降低你的学习率。 0.01
确实很高,所以尝试像 3e-5
这样的东西来学习,看看你的模型表现如何。
此外,具有 100% 的准确度(据说您使用的是骰子?)表明您仍在使用准确度,因此我相信您的模型无法识别您正在使用 dice/dice 损失进行训练和评估(代码片段将不胜感激)。
示例:
model.compile(optimizer=Adam(lr=TRAIN_SEG_LEARNING_RATE),
loss=dice_coef_loss,
metrics=[dice_coef])
Also if I test the model against the same data I used to train it, it still predicts blank images. So does this mean it isn't a case of overfitting?
尝试使用 model.evaluate(test_data, test_label)
。如果评估的性能良好(如果您只预测 0,则 dice 应该非常低),那么要么您的标签在某种程度上被弄乱了,要么您的管道有问题。
如果一切都失败了,可能的解决方案:
- 确保通过此 article 中的所有完整性检查
- 您可能没有足够的数据,因此请尝试对随机裁剪使用 patchwise 方法。
- 添加更多正则化(dropout、BatchNormalization、InstanceNormalization、增加输入图像大小等)