转换为 Tensorflowjs 的 Keras LSTM 单向和双向模型未产生正确的推理

Keras LSTM uni & bidirectional models converted to Tensorflowjs not producing correct inference

TensorFlow.js 使用的版本

使用的浏览器版本

问题描述

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

我已经检查了提供给 LSTM 双向模型的所有输入、它们的形状等,但没有发现任何问题。但是无论视频输入如何,LSTM 双向模型的推论始终相同。我已确保作为序列发送到 LSTM 模型的每个视频帧都是正确的。 (使用 MobileNet 模型识别每一帧,它正确识别,因此得出结论,发送到 LSTM 的帧是完美的) 请帮助我确定问题并解决。所有必需的详细信息如下。

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

型号详情:

使用的数据集:

Tensorflowjs转换模型:

注意: 我已经尝试过 LSTM 模型(单向),同样的问题也出现在转换后的模型上。唯一的区别是它产生 'Billards' 作为概率超过 0.95 的最高预测。

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

终于找到了tfjs转换后的模型没有产生正确推论的原因……终于:)

原因:

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

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

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

此致, 周杰伦