2

使用的 TensorFlow.js 版本

  • 张量流 1.12.0
  • 张量流基础 1.12.0
  • 张量流GPU 1.12.0
  • 张量流中心 0.2.0
  • 张量流js 0.8.0

使用的浏览器版本

  • Windows 10 上的 Firefox 65.0 (64-it)
  • Windows 10 上的 Microsoft Edge 42.17134.1.0

问题描述

我在 Python 中创建并训练了一个基于 Keras 的 LSTM 双向模型来对视频进行分类。这个模型效果很好,并且以 90+ 的准确度对视频进行分类。但是当我使用 tensorflorjs_converter 工具将此模型转换为 tensoflorjs 模型并在浏览器上使用相同的模型时,该模型总是为任何视频输入抛出相同的输出(前 3 个结果) ——BasketballDunk;概率。0.860,平衡梁;概率。0.088,BodyWeightSquats;概率。0.024

我检查了 LSTM 双向模型的所有输入、它们的形状等,没有发现任何问题。但是无论视频输入如何,来自 LSTM 双向模型的推理仍然是相同的。我确保作为序列发送到 LSTM 模型的每个单独的视频帧都是正确的。(使用 MobileNet 模型识别每一帧,并且它正确,因此得出结论,发送到 LSTM 的帧是完美的)请帮助我识别问题并修复。所有必需的详细信息如下。

(整个模型基于陈先顺(chen0040)->[ https://github.com/chen0040/keras-video-classifier]在这个github存储库中给出的示例)

模型细节:

  • 使用 MobileNet 模型提取特征
  • 使用 LSTM 双向模型来提取提取的特征并将视频分类为 20 类之一

使用的数据集:

Tensorflowjs 转换模型:

注意:我已经尝试过 LSTM 模型(单向),同样的问题也与转换后的模型有关。唯一的区别是它产生“台球”作为概率超过 0.95 的最高预测。

重现问题的代码: 代码和测试工件位于此驱动器位置的 zip 文件中 - [ https://drive.google.com/open?id=1k_4xOPlTdbUJCBPFyT9zmdB3W5lYfuw0]

4

1 回答 1

1

找出 tfjs 转换模型没有产生正确推理的原因......最后:)

原因:

  1. LSTM 模型的列表项输入中有 NaN!虽然我将从 MobileNet 模型中提取的特征传递给 LSTM,但未使用 features .dataSync()。因此,当我将提取的特征添加到 tf.buffer 中时,它们被添加为 NaN。(当我在添加到 tf.buffer 之前在日志中打印值时,它们正确打印了值!......这很奇怪)。因此,当我对提取的特征使用 dataSync() 时,它们被正确添加到 tf.buffer 中。

  2. 列表项使用 tf.buffer() 存储提取的特征(来自 MobileNet)并在传递给 LSTM 模型之前将它们转换为张量。相反,我使用 tf.stack() 来存储提取的特征,然后将堆叠张量传递给 LSTM 模型。(我知道 tf.stack() 相当于 np.array())

希望这些输入对某人有所帮助。

问候,杰伊

于 2019-02-21T13:19:32.343 回答