Tensorflow 对象检测 API - 验证丢失行为

Posted

技术标签:

【中文标题】Tensorflow 对象检测 API - 验证丢失行为【英文标题】:Tensorflow object detection API - validation loss behaviour 【发布时间】:2020-01-31 20:52:57 【问题描述】:

我正在尝试使用 TensorFlow 对象检测 API 来识别图片和视频中的特定对象(吉他)。

关于数据,我从 OpenImage 数据集下载了图像,并导出了 .tfrecord 文件。我正在使用不同的数字进行测试,但现在假设我在训练集中有 200 张图像,在评估集中有 100 张。

我正在使用“ssd_mobilenet_v1_coco”作为起点和“model_main.py”脚本来训练模型,这样我就可以得到训练和验证结果。

当我在 TensorBoard 中可视化训练进度时,我得到以下训练结果:

和验证损失:

分别。

我通常是计算机视觉的新手并尝试学习,所以我试图弄清楚这些图的含义。 训练损失按预期进行,随着时间的推移而减少。 在我(可能很简单)的观点中,我期望验证损失从高值开始,随着训练的进行而减少,然后如果训练时间过长并且模型开始过度拟合,则再次开始增加。

但就我而言,我看不到验证曲线的这种行为,它似乎基本上一直呈上升趋势(不包括波动)。

我训练模型的时间是否太短而无法看到预期的行为?我的期望一开始就错了吗?我是否误解了曲线?

【问题讨论】:

【参考方案1】:

好的,我通过将 initial_learning_rate 从 0.004 降低到 0.0001 来修复它。 考虑到验证损失的剧烈波动,这是显而易见的解决方案,但起初我认为它不起作用,因为配置文件中似乎已经有一个学习率调度程序。 然而,紧随其后(在配置文件中)有一个 num_steps 选项,并指出

  # Note: The below line limits the training process to 200K steps, which we
  # empirically found to be sufficient enough to train the pets dataset. This
  # effectively bypasses the learning rate schedule (the learning rate will
  # never decay). Remove the below line to train indefinitely.

老实说,我不记得我是否注释掉了 num_steps 选项...如果我没有注释掉,看来我的学习率保持在初始值 0.004,结果太高了。 如果我确实将其注释掉(以便学习调度程序处于活动状态),我猜想它不是减少,而是从过高的值开始。 无论如何,它现在工作得更好了,我希望这对遇到同样问题的人有用。

【讨论】:

我猜,不是减少,而是从太高的值开始。???你是检查自己还是胡乱猜测? 不确定我理解你的意思,但初始损失值几乎是随机的,因为它是在权重优化之前计算的,并且权重是随机初始化的。如果训练成功,验证和训练损失应该会减少(如果你开始对训练数据过度拟合,验证会再次增加),这确实是我降低学习率后得到的结果。这只是一个随机测试,我再也没有这些图了,所以你必须相信我的话……或者我可以向你展示类似实验的图 :) 是的,理想情况下验证和训练损失应该减少..正确..蝙蝠我说的是验证损失..从图中可以看出它从一开始就一直在增加?没有意义 问题是没有关于如何在 tensorboard 中评估新对象检测 api 的在线文档......目前使用 tf=v14 和 api v1.13 我能找到的唯一解决方案是datascience.stackexchange.com/questions/31994/…

以上是关于Tensorflow 对象检测 API - 验证丢失行为的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Tensorflow 2 对象检测 API 恢复微调模型以进行测试?

TensorFlow 对象检测 API - 对象检测 api 中的损失意味着啥?

TensorFlow 对象检测 API 中未检测到任何内容

具有奇怪检测结果的 TensorFlow 对象检测 api

Tensorflow 对象检测 API 中的过拟合

Tensorflow 2 对象检测 API:Numpy 版本错误