tensorflow - 反向传播时对象检测训练如何工作?
问题描述
我正在使用 tensorflow 来训练一个 f-rcnn inception v2 模型。
假设我有 6000 张图片:
从img 1到3000:每张图片都有一只狗和一只猫,但我只标记了狗。
从img 3001到6000:每张图片都有一只狗和一只猫,但我只标记了猫。
所以每张图片里面都有一只狗和一只猫,但我只在其中一半中标注了狗,而在另一半中标注了猫。
创建数据集时,我不会打乱图像,因此我将前 3000 个图像标记为狗,然后将其他 3000 个图像标记为猫。
我的问题是:
图像的顺序会影响结果吗?如果我先创建一个包含狗然后是猫的数据集,它会改变吗?如果我对数据进行洗牌以便混合猫和狗,那会有所不同吗?
反向传播时,我没有标记猫而标记狗,反之亦然会影响结果吗?模型是否因为我没有标记狗和猫而没有学习?我得到的结果与拥有 3000 张图像并为每张图像都标记了狗和猫的结果相同吗?
我没有在每张图像中同时标记狗和猫的原因是因为我有一个固定相机的图像,有时你会看到不同的狗或同一只狗在四处移动,而猫正在睡觉。因此,每次都给睡猫贴上标签意味着多次输入相同的图像。(当然,标记需要很多时间)。我怎么能解决这个问题?我应该在创建数据集之前裁剪图像吗?如果我创建一个 eval 数据集,其中我在每个图像中都标记了狗和猫,并且创建了一个火车数据集,其中我只有对象(狗)标签而不是猫,这是否足够?
谢谢
解决方案
1 - 是的,图像的顺序会影响结果[1],更重要的是它会影响算法的学习速度。从本质上讲,您的算法正在尝试学习权重配置,以最小化您展示给它的所有示例的损失函数。它通过将这些权重安排到一个配置中来实现这一点,该配置检测数据中区分猫和狗的那些特征。但它只能通过一次考虑一批输入来做到这一点。批次中的每张图像都被单独考虑,反向传播决定了如何改变权重,以便算法更好地检测该图像中的猫/狗。然后,它为批次中的每个图像平均所有这些更改并进行调整。
如果您的批次包含所有图像,则顺序无关紧要;它会做出它期望的调整,这将为所有数据的损失函数提供最大的净减少。但是,如果该批次包含的数据少于所有数据(它总是如此),那么它会进行调整,以帮助仅在该批次的图像中检测狗/猫。这意味着,如果您向它展示的猫多于狗,它将决定同样属于猫和狗的特征实际上会产生增加的所讨论的动物是猫的概率,这是错误的。因为在检测到该特征的情况下,猫的可能性更高。随着猫:狗的比例趋于平衡,这将随着时间的推移自行纠正,但会更慢地达到其最终配置,因为它必须学习和取消学习数据中无用的特征。
例如,在您的设置中,当您的算法观察到一半的数据时,它所学到的只是“所有看起来像猫或狗的东西都是狗”。图像中区分猫和狗的那些特征对减少损失函数没有帮助。实际上,它将具有猫和狗共同的错误学习特征,因为它是特定于狗的,并且在以后看到更多数据时将不得不取消学习它们。
就整体结果而言:在训练过程中,您实际上是在跟随其梯度遍历一个高维优化空间,直到权重配置达到该空间中的局部最小值,从该空间中逃脱的障碍的大小超过允许的范围根据你的学习率。显示一个类然后显示另一个类将导致通往全局最小值的路径更加曲折,从而增加陷入次优局部最小值的可能性。[2]
2 - 如果数据集中的所有图像都包含一只狗,那么您真的想在每张图像中标记那只狗。这做了三件事:
- 将数据集的大小翻倍(更多数据 = 更好的结果)。
- 防止错误地惩罚模型以准确检测图像中未标记狗的狗。
- 防止算法检测图像中不相关的特征。
出于显而易见的原因,将数据集的大小加倍是好的。但是通过显示包含狗的输入而不标记该狗,您实际上是在告诉您的算法该图像不包含狗[3]。这是错误的。您实际上是在更改您要求算法检测的模式,这些模式可以将cat/dog 与 no-cat/dog和cat vs dog分开,这些模式可以将labelled-dogs 与 unlabelled-dogs分开,这不是有用的功能为你的任务。
最后,由于未能标记一半的狗,您的算法将学会区分那些被标记的狗和那些没有被标记的狗。这意味着它不会学习狗共有的特征,而是学习将标记图像中的狗与未标记图像中的狗分开的特征。这些可能是图像中的背景特征或小的概括,这些特征在标记的狗中比偶然未标记的狗更强烈。
3 - 这个问题有点难,这里没有简单的解决方案。你的模型只能学习它在训练期间暴露的特征,这意味着如果你只向它展示一张猫的图像(或几张猫的表示相同的图像),你的模型将学习特定于这张图像的特征. 这将很快导致过度拟合的常见问题,您的模型会学习特定于您的训练示例的特征,并且不能很好地推广到猫的其他实例。
在训练期间裁剪出猫然后简单地将猫包含在 eval 数据集中是不够的,因为您将要求模型检测它在训练期间没有暴露并因此没有学习的特征。
您希望将标记的猫包含在它出现在数据中的每个实例中,并规范您的网络以限制过度拟合。除此之外,在数据匮乏的情况下,使用预训练在训练之前从未标记的数据中学习特定于猫的特征,和/或使用数据增强来人为地增强数据的多样性通常是有益的。
这些建议可能会改善您的结果,但现实情况是,采购大量、多样化的数据集,这些数据集全面整合了识别对象的关键特征,是构建成功的深度学习模型的主要部分。这取决于猫的实例在您的数据中的统一程度,但如果您的模型只从前面看到过猫,它就不会从后面识别猫。
TLDR:
- 1 是的,洗牌。
- 2 是的,给它们都贴上标签。
- 3 获得更好的数据。或者:预训练、正则化和增强数据。
[1] 这确实取决于您将数据输入模型的批次的大小。
[2] 这是基于我自己的直觉,我很高兴在这里得到纠正。
[3] 这在一定程度上取决于您的损失函数如何处理没有狗的图像。
推荐阅读
- swift - 深度优先搜索实现 - 理解 swift 代码
- r - 创建并绘制一个保留因子排序的表
- reactjs - 使用 Reactjs 触发 Cordova 相机插件
- java - 如何访问布局对话框中的项目?
- python - 加速 Python 脚本或寻找替代方案?
- c++ - 在 NodeJS 与 OpenSSL C++ 中加密时获得不同的值
- python-3.x - 如何访问内部的按钮在 python 中使用 selenium 的容器
- python - 如何在单个操作中展平具有已知分隔符的列表列表
- python - Gurobi Python中用于多维变量的KeyError
- python - 以 ip:port 格式解析工作“masscan”的结果