TF 对象检测 - 从检查点重新加载后模型性能会丢失

问题描述 投票:0回答:1

[当前行为]

Tensorflow 目标检测模型经过训练并且表现良好。然后将其保存到检查点并从该检查点重新加载。重新加载保存的检查点后,模型不再检测到任何内容。

[期望的行为]

从检查点重新加载的模型应生成与用于生成检查点的模型相同或非常相似的输出。

[重现错误的最少代码]

可以在这里找到重现问题的 Google Colab 笔记本:

最小代码示例

[更详细地描述问题以及最少代码的作用]

我正在使用 Tensorflow 的对象检测模型来训练模型来检测显微镜图像中的各种物体。

从检查点/保存的模型格式重新加载时,训练良好的模型表现不佳。我正在使用根据他们的示例代码改编的急切模式训练循环进行训练。

当使用刚刚训练好的、没有留下记忆的模型进行推理时,性能非常好。但是,当我在推理模式下创建新模型并加载保存的检查点时 - 模型不再检测到任何内容。

当我使用 TF 对象检测 model_main_tf2.py 命令行方法而不是自定义的 eager 循环进行训练时,我遇到了相同的结果。模型似乎训练得很好并且损失非常低,但是当从生成的检查点加载模型时,性能很糟糕。

我在 Colab 上创建了一个最小的示例(上面链接),其中我对他们的示例代码进行了最小的更改。

它过拟合tensorflow的小鸭子数据集,并对与训练相同的数据进行推理。

运行时,该笔记本将通过过拟合小鸭子数据集来训练 SSD 模型。然后对与训练相同的数据进行推理。

训练后,笔记本将绘制两组图像:

  • 鸭子数据集图像与内存模型的叠加结果。
  • 鸭子数据集图像,其中包含从最近的训练检查点(训练完成后生成的检查点)创建和加载的模型的叠加结果。

前者具有非常高的性能,通常,一切都以非常高的置信度被检测到。后者将根本检测不到任何内容(<1e-3 confidences) or it will seem to detect the object but also a bunch of other junk (注意:在极少数情况下,后者实际上工作得很好。如果工作正常,只需重置笔记本并再次运行。似乎存在一些变化,在某些情况下它可以“意外地”表现良好

当batchnorm可训练时,效果尤其糟糕。使用batchnorm训练的模型很快就会收敛,并且对于未重新加载的模型表现出惊人的性能,但是重新加载的模型性能极差。在没有批量归一化的情况下进行训练时也会出现效果,但程度较小。

目前我怀疑批规范是一个问题 - 但我在互联网上找不到任何其他人遇到此类问题的信息?

python tensorflow tensorflow2.0 object-detection-api
1个回答
0
投票

您找到解决这个问题的方法了吗?我面临同样的问题,我的模型检测到之前检测到的对象,但是,它也增加了一些误报。

如果您能与我分享您的经验,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.