使用了TensorFlow.js版本
使用的浏览器版本
问题描述
我已经在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存储库中给出的示例
模型的详细信息:
使用的数据集:
Tensorflowjs转换后的模型:
注意::我已经尝试过LSTM模型(单向),并且转换后的模型也存在相同的问题。唯一不同的是,它产生“比拉德斯”(Billards)作为最高预测,概率超过0.95。
重现该问题的代码: 代码和测试工件位于此云端硬盘位置的zip文件中-[https://drive.google.com/open?id=1k_4xOPlTdbUJCBPFyT9zmdB3W5lYfuw0]
答案 0 :(得分:1)
找出tfjs转换模型无法产生正确推断的原因……最后
原因:
列表项LSTM模型的输入中包含NaN!尽管我将从MobileNet模型中提取的功能传递给LSTM,但未使用功能 .dataSync()。因此,当我将提取的功能添加到tf.buffer中时,它们被添加为NaN。 (当我在添加到tf.buffer之前在日志中打印值时,它们正确打印了值!...这很奇怪)。因此,当我在提取的功能上使用dataSync()时,它们已正确添加到tf.buffer中。
列表项使用tf.buffer()存储提取的特征(来自MobileNet)并将其转换为张量,然后再传递给LSTM模型。相反,我使用tf.stack()存储提取的特征,然后将堆叠的张量传递给LSTM模型。 (我知道tf.stack()相当于np.array())
希望这些输入能帮助某人。
关于, 杰伊