python - Keras 中的分割网络在训练期间收敛到单个类

标签 python tensorflow keras neural-network image-segmentation

我正在尝试使用 Tensorflow 后端在 Keras 中实现 RefineNet。我正在使用 ResNet-101 前端和来自 https://gist.github.com/flyyufelix/65018873f8cb2bbe95f429c474aa1294 的预训练权重。模型编译成功,但在训练过程中不收敛:仅经过 1 到 5 个训练步骤后,它总是收敛到单个类。

我尝试过的东西列表:

  • 输入数据是one-hot编码的
  • 输入图像具有正确的对应蒙版
  • 损失函数是分类交叉熵
  • 预训练的权重正确,前端正确分类输入图像(例如猫)
  • 卡住/解冻前端层似乎没有什么区别
  • 不同的优化器(Adam、SGD)、不同的学习率 (0.01 - 0.000001)
  • 网络甚至不会收敛到单个训练样本/在单个训练样本上过度拟合
  • 类别不平衡:我尝试使用加权损失,但没有帮助。此外,网络并不总是收敛到最大的类别。
  • 检查网络图并将其与 RefineNet 论文中的架构进行比较。
  • 可能是某种初始化问题,但 Keras 的默认初始化是内核的 glorot_uniform 和偏差的零,想不出比这更好的东西了。
  • ReLU 可能会全部失效,但仅仅经过几个训练步骤就不会发生这种情况,对吧?我尝试过 LeakyRelU,但没有帮助。
  • 尝试了不同的输入大小、批量大小、随机裁剪、长宽比(此时有点绝望)。
  • 尝试输入随机噪声,结果相同。

最后一点让我认为架构只是忽略了输入,但我不知道在哪里、如何以及为什么。

训练期间的示例输出:

Training:
Step 0, loss 15.566238403320312, acc 0.012790679931640625
Step 1, loss 9.91278076171875, acc 0.36734771728515625
Step 2, loss 10.994621276855469, acc 0.27989959716796875
Step 3, loss 10.00101375579834, acc 0.3611602783203125
Step 4, loss 11.439224243164062, acc 0.2010345458984375
Step 5, loss 11.397968292236328, acc 0.229278564453125
Step 6, loss 9.844161987304688, acc 0.3711433410644531
Step 7, loss 9.981706619262695, acc 0.36286163330078125
Step 8, loss 11.335559844970703, acc 0.21475982666015625
Step 9, loss 9.997631072998047, acc 0.3608970642089844
...

完整的代码可以在以下 Google Colab 笔记本中找到:https://colab.research.google.com/drive/1OlujuKZYhRaTm9h7rHAPEi9gkiYmQLR_

我已尝试尽可能轻松地重现该问题。

任何帮助/想法将不胜感激!

最佳答案

在转换层之后添加批量归一化层解决了问题。

关于python - Keras 中的分割网络在训练期间收敛到单个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607626/

相关文章:

python - 值错误: Please initialize `TimeDistributed` layer with a `Layer` instance

python - 我对 Keras 中的batch_size理解正确吗?

python - 两种不同输入样本大小的 Keras 多任务学习

python - 无法在 virtualenv 中使用 Django

python - 为什么每次celery+rabbitmq都会生成一个新队列?

python - 闭包如何在 runpy 中工作?

python - 无法安装 Kivy : Cython/GCC error

javascript - 如何获取tensorflowjs中tf.toPixels()返回值的PromiseValue

tensorflow - 如何在 tensorflow 2.0 中手动清除 tf.function 缓存(或管理最大大小)?

python - 多输出模型的编译选项: multiple losses & loss weighting