使用的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转换模型没有产生正确推理的原因。。。最后:)
原因:
-
LSTM模型的列表项输入中包含NaN!虽然我将MobileNet模型中提取的特征传递给LSTM,但没有使用特征.dataSync()。因此,当我将提取的特征添加到tf.buffer中时,它们被添加为NaN。(当我在添加到tf.buffer之前在日志中打印值时,他们正确地打印了值!……这很奇怪)。因此,当我对提取的特征使用dataSync()时,它们被正确地添加到了tf.buffer中。
-
列表项使用tf.buffer()存储提取的特征(来自MobileNet),并在传递到LSTM模型之前将其转换为张量。相反,我使用tf.stack()来存储提取的特征,然后将堆叠的张量传递给LSTM模型。(我知道tf.stack()相当于np.array())
希望这些输入能帮助到别人。
谨致问候,Jay