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



使用的TensorFlow.js版本

  • tensorflow 1.12.0
  • tensorflow基础1.12.0
  • tensorflow gpu 1.12.0
  • tensorflow轮毂0.2.0
  • tensorflow js 0.8.0

使用的浏览器版本

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

问题描述

我创建了&在Python中训练了一个基于Keras的LSTM双向模型来对视频进行分类。这个模型工作得很好,并以90+的准确度对视频进行分类但当我使用tensorflorjs_converter工具将该模型转换为tensoflorjs模型并在浏览器上使用该模型时,该模型总是为任何视频输入抛出相同的输出(前三名结果)-BacketballDunk;prob。0.860,平衡梁;prob。0.088,体重深蹲;prob。0.024

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

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

型号详细信息:

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

使用的数据集:

  • UCF101-动作识别数据集(http://crcv.ucf.edu/data/UCF101.php)

Tensorflowjs转换模型:

  • tensorflowjs转换后的模型、示例视频和要测试的html文件以zip文件的形式保存在该驱动器位置:[https://drive.google.com/open?id=1k_4xOPlTdbUJCBPFyT9zmdB3W5lYfuw0]
  • 要测试模型,只需解压缩并使用"yarn"构建,然后使用"渴望手表">
  • index.html有测试说明

注意:我尝试过LSTM模型(单向),转换后的模型也存在同样的问题。唯一不同的是,它将"公告牌"作为最高预测,概率超过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())

希望这些输入能帮助到别人。

谨致问候,Jay

最新更新