在培训期间,Keras的细分网络会融合为单一课程

时间:2019-04-10 08:05:15

标签: python tensorflow keras neural-network image-segmentation

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

虽然我尝试过的东西清单:

  • 输入数据是一键编码的
  • 输入图像具有正确的对应蒙版
  • 损失函数是分类交叉熵
  • 预先训练的权重正确,前端正确分类了输入图像(例如猫)
  • 冻结/解冻前端层似乎没有什么作用
  • 不同的优化器(Adam,SGD),不同的学习率(0.01-0.000001)
  • 该网络甚至无法在单个训练样本上收敛/过度拟合
  • 班级失衡:我尝试使用加权损失,但无济于事。而且,网络并不总是会收敛到最大的类别。
  • 检查网络图,并将其与RefineNet论文中的体系结构进行比较。
  • 可能是某种初始化问题,但是Keras的默认初始化是glorot_uniform(内核)和0(偏差),再没有比这更好的了。
  • 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_

我试图使重现该问题尽可能容易。

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

1 个答案:

答案 0 :(得分:0)

在conv层解决问题后,添加Batch Normalization层。