Keras LSTM单向和双向模型转换为Tensorflow.js无法产生正确的推断

时间:2019-02-12 03:11:01

标签: lstm tensorflowjs-converter

使用了TensorFlow.js版本

  • tensorflow 1.12.0
  • 基于Tensorflow 1.12.0
  • tensorflow-gpu 1.12.0
  • tensorflow-hub 0.2.0
  • tensorflowjs 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,BalanceBeam;概率。 0.088,体重减轻;概率。 0.024

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

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

模型的详细信息:

  • 使用MobileNet模型提取特征
  • 使用LSTM双向模型引入提取的特征并 将视频归类为20个课程之一

使用的数据集:

Tensorflowjs转换后的模型:

注意::我已经尝试过LSTM模型(单向),并且转换后的模型也存在相同的问题。唯一不同的是,它产生“比拉德斯”(Billards)作为最高预测,概率超过0.95。

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

1 个答案:

答案 0 :(得分:1)

找出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())

希望这些输入能帮助某人。

关于, 杰伊