【发布时间】:2020-05-08 20:20:03
【问题描述】:
到目前为止,我看到了很多关于这个主题的讨论,并使用不同的方法来实现这一点 (https://github.com/tensorflow/models/issues/1809),但我想知道是否有人成功地使用 Tensorflowjs 来实现这一点。 我知道有些人也使用迁移学习实现了这一点,但这与能够添加我自己的新类不同。
【问题讨论】:
到目前为止,我看到了很多关于这个主题的讨论,并使用不同的方法来实现这一点 (https://github.com/tensorflow/models/issues/1809),但我想知道是否有人成功地使用 Tensorflowjs 来实现这一点。 我知道有些人也使用迁移学习实现了这一点,但这与能够添加我自己的新类不同。
【问题讨论】:
简短的回答:不,还没有,虽然在技术上是可行的,但我还没有在野外看到这个实现。
更长的答案 - 为什么:
鉴于“迁移学习”本质上是指在经过训练的模型中重用现有知识来帮助您对性质相似的事物进行分类,而不必重做所有先前的学习,实际上有两种方法可以做到这一点:
1) 这是更简单的方法,但可能不适用于某些用例:使用您有权访问的冻结模型的高级层之一(例如,由 TF.js 发布的模型是冻结模型我相信 - GitHub上的那些)。这允许您重用它的一些较低层(或最终输出),它们可能已经擅长挑选某些对您需要的用例有用的功能,例如一般意义上的对象检测,然后您可以将其输入您自己的位于您从中采样的输出之上的未冻结层(这是新训练发生的地方)。这更快,因为您只更新添加的新层的权重等,但是由于原始模型被冻结,这意味着您必须在 TF.js 中复制您绕过的层以确保您拥有相同的结果模型如果您想要架构,则在这种情况下为 COCO-SSD 架构。这可能并非易事。
2) 重新训练原始模型 - 可以考虑调整原始模型 - 但这只有在您可以访问原始解冻模型和用于训练该模型的数据时才有可能。这将需要更长的时间,因为您实际上是在对所有数据 + 新数据重新训练整个模型。如果您没有原始的解冻模型,那么执行此操作的唯一方法是根据需要使用层/操作 API 在 TF.js 中实现所述模型,然后使用它来训练您自己的数据。
什么?!
因此,如果我们考虑 PoseNet - 估计人体关节/骨骼所在位置的一个更容易可视化的示例。
现在在这个 Posenet 示例中,假设您想要创建一个新的 ML 模型,该模型可以检测一个人何时处于特定位置 - 例如挥手。
在此示例中,您可以使用方法 1 简单地获取其检测到的所有关节的现有posenet 预测的输出,并将其输入新层 - 类似多层感知器这样简单的东西 - 然后可以非常快速地学习例如,当手处于挥手位置时的示例数据。在这种情况下,我们只是简单地添加到现有架构中以实现新结果 - 手势预测与关节本身的原始 x-y 点预测。
现在考虑 PoseNet 的案例 2 - 您希望能够识别它目前无法识别的身体新部位。为此,您需要重新训练原始模型,以便它可以学习预测新的身体部位作为其输出的一部分。
这要困难得多,因为您需要重新训练基础模型才能执行此操作,这意味着您需要访问未冻结的模型才能执行此操作。如果您无法访问未冻结的模型,那么您将别无选择,只能尝试完全自己重新创建 PoseNet 架构,然后使用您自己的数据进行训练。如您所见,第二个用例更难,也更复杂。
【讨论】: