反向传播时如何进行目标检测训练?

时间:2018-12-14 11:29:19

标签: tensorflow object-detection backpropagation tensorflow-datasets tfrecord

我正在使用张量流来训练f-rcnn初始v2模型。

假设我有6000张图片:

  • 从img 1到3000:每个图像都有猫和狗,但我只标记了狗。

  • 从img 3001到6000:每个图像都有猫和狗,但我只给猫贴了标签。

因此每个图像中都有一只狗和一只猫,但是我只在其中一半标记了狗,而在另一半标记了猫。

在创建数据集时,我不会对图像进行混洗,因此,我将用狗标记前3000张img,然后用猫标记另外3000张img。

我的问题是:

  1. 图像的顺序会影响结果吗?如果先创建与狗然后猫的数据集,情况会有所改变吗?如果我重新整理数据以便混用猫狗,那会有所不同吗?

  2. 反向传播时,我没有在标记狗的同时标记猫的事实,反之亦然,是否会影响结果?我的猫和狗没有标签,模型会不会被学习吗?我得到的结果与具有3000张图像的狗和猫都有相同的结果吗?

  3. 我在每个图像中都没有给猫和狗贴标签的原因是因为我有一个固定摄像机的图像,有时您会看到不同的狗或同一只狗在猫睡觉时四处走动。因此,每次给熟睡的猫贴上标签将意味着多次获得与输入相同的图像。 (当然,需要花费很多时间进行标记)。我该如何解决?我应该在创建数据集之前裁剪图像吗?如果我创建一个评估,那是永恒的吗 数据集中每个图像上都带有猫和狗的标签,而火车数据集中只带有对象(狗)的标签,而猫没有标签?

谢谢

1 个答案:

答案 0 :(得分:2)

1 -是,图像的顺序会影响结果[1],更重要的是,它将影响算法的学习速度。本质上,您的算法正在尝试学习权重的配置,以使显示给它的所有示例的损失函数最小化。它通过将这些权重安排为一种配置来执行此操作,该配置可检测数据中区分猫和狗的那些特征。但这只能一次考虑一个输入 batch 。批处理中的每个图像都被单独考虑,并且后向属性决定应如何更改权重,以便算法可以更好地检测该图像中的猫/狗。然后,它对批次中的每个图像的所有这些变化求平均值,并进行调整。

如果批次中包含所有图像,则顺序无关紧要;它将进行预期的调整,从而对所有数据的损失函数提供最大的净减少。但是,如果该批次包含的数据少于所有数据(它总是这样做),那么它将进行调整以帮助仅在该批次的图像中检测狗/猫。这意味着,如果您向其展示比猫多的猫,它将决定同等地属于猫和狗的特征实际上会产生增加的可能性,即所述动物是猫,这是错误的。因为在检测到该特征的情况下猫的可能性更高。当cat:dogs的比例趋于平稳时,这将随着时间的流逝而纠正,但如果它必须学习和不学习数据中的无用功能,则到达最终配置的速度将更加缓慢。

作为一个例子,在您的算法观察到一半数据时的设置中,所学到的就是“所有看起来像猫或狗的东西都是狗”。图像中区分猫和狗的那些功能无助于减少损失功能。实际上,它会具有猫和狗常见的失误学习功能,因为它们是特定于狗的,并且稍后会在看到更多数据时取消对它们的学习。

就整体结果而言:在训练过程中,您实际上是按照梯度进行遍历一个高维优化空间,直到权重的配置达到该空间的局部最小值为止逃避障碍的数量超出了您的学习率所允许的范围。显示一个类别,然后显示另一个类别,将导致走向全局最小值的曲折路径,从而增加陷入次优局部最小值的可能性。 [2]


2 -如果数据集中的所有图像都包含一只狗,那么您真的想在每张图像中都标记该狗。这可以完成三件事:

  • 将数据集的大小加倍(更多数据=更好的结果)。
  • 防止误判模型以准确检测未标记狗的图像中的狗。
  • 防止算法检测图像中不相关的特征。

出于明显的原因,将数据集的大小增加一倍是好的。但是,通过显示包含不带标签的狗的输入,您实际上是在告诉您的算法该图像包含狗[3]。错了实际上,您正在改变要算法要求的模式,以将可以将猫/狗与无猫/狗猫与狗分开的模式带标签的狗与未带标签的狗,这对您的任务没有帮助。

最后,由于没有给一半的狗加标签,您的算法将学会区分那些被标记的狗和未被标记的狗。这意味着,除了学习狗的通用特征之外,它还将学习将标记图像中的那些狗与未标记图像中的那些狗分开的功能。这些可能是图片中的背景特征,也可能是小的概括,在带有标签的狗中表现得比没有标签的狗更强。


3 -这个问题要困难一些,这里没有简单的解决方案。您的模型只能学习训练过程中要暴露的特征,这意味着,如果仅向其显示一只猫的图像(或几幅猫的表示相同的图像),则您的模型将学习该图像的特定特征。这将很快导致常见的过度拟合问题,您的模型将学习特定于您的训练示例的特征,而不能很好地推广到其他猫类实例。

在训练过程中修剪掉猫并仅将其包括在评估数据集中是不够的,因为您将要求模型检测在训练过程中没有暴露过的猫,因此没有学习到的特征。

您希望在每一个出现在数据中的情况下都添加标签猫,并regularise在网络中限制过拟合。此外,在数据匮乏的情况下,使用pre-training从训练之前的未标记数据中了解猫的特定特征,和/或使用data augmentation来人为地提高您的多样性通常是有益的数据。

这些建议可能会改善您的结果,但现实情况是,采购大型,多样化的数据集并全面整合了那些对识别对象至关重要的功能,这是构建成功的深度学习模型的重要组成部分。这取决于数据中猫实例的统一程度,但是如果您的模型只从正面看过猫,就不会从后面识别猫。


TLDR:

  • 1是,请随机播放。
  • 2是,将它们全部标记。
  • 3获取更好的数据。或者:对数据进行预训练,正则化和扩充。

[1]这确实取决于将数据馈入模型的批次的大小。

[2]这是基于我自己的直觉,我很高兴在这里得到纠正。

[3]在某种程度上取决于您的损失功能如何处理没有狗的图像。