Keras 中的分割网络在训练期间收敛到单个 class
Segmentation network in Keras converges to single class during training
我正在尝试使用 Tensorflow 后端在 Keras 中实现 RefineNet。我正在使用来自 https://gist.github.com/flyyufelix/65018873f8cb2bbe95f429c474aa1294 的 ResNet-101 前端和预训练权重。该模型编译成功,但在训练期间不收敛:它总是在 1 到 5 个训练步骤后收敛到一个 class。
我试过/虽然的东西列表:
- 输入数据是单热编码的
- 输入图像具有正确对应的掩码
- 损失函数是分类交叉熵
- 预训练权重正确,前端正确class化输入图像(例如猫)
- 冻结/解冻前端层似乎没有什么区别
- 不同的优化器(Adam、SGD),不同的学习率(0.01 - 0.000001)
- 网络甚至不会在单个训练样本上收敛/过度拟合
- Class 不平衡:我尝试使用加权损失,但没有帮助。此外,网络并不总是收敛到最大的 class.
- 检查了网络图并将它们与 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 notebook中找到:https://colab.research.google.com/drive/1OlujuKZYhRaTm9h7rHAPEi9gkiYmQLR_
我已尽力使问题重现变得尽可能简单。
任何帮助/想法将不胜感激!
在转换层解决问题后添加批量归一化层。
我正在尝试使用 Tensorflow 后端在 Keras 中实现 RefineNet。我正在使用来自 https://gist.github.com/flyyufelix/65018873f8cb2bbe95f429c474aa1294 的 ResNet-101 前端和预训练权重。该模型编译成功,但在训练期间不收敛:它总是在 1 到 5 个训练步骤后收敛到一个 class。
我试过/虽然的东西列表:
- 输入数据是单热编码的
- 输入图像具有正确对应的掩码
- 损失函数是分类交叉熵
- 预训练权重正确,前端正确class化输入图像(例如猫)
- 冻结/解冻前端层似乎没有什么区别
- 不同的优化器(Adam、SGD),不同的学习率(0.01 - 0.000001)
- 网络甚至不会在单个训练样本上收敛/过度拟合
- Class 不平衡:我尝试使用加权损失,但没有帮助。此外,网络并不总是收敛到最大的 class.
- 检查了网络图并将它们与 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 notebook中找到:https://colab.research.google.com/drive/1OlujuKZYhRaTm9h7rHAPEi9gkiYmQLR_
我已尽力使问题重现变得尽可能简单。
任何帮助/想法将不胜感激!
在转换层解决问题后添加批量归一化层。