【发布时间】:2019-06-07 03:57:06
【问题描述】:
我正在 ionic3 框架中开发一个用于识别绘制字符的应用程序,但我在导入模型时遇到了问题。我已通过两种不同的方式将 Keras 中的模型(使用 tensorflowjs_converter 转换)导入到我的 ionic3 应用程序中:
-
model.json和权重文件(分片)被放入文件夹/assets/models。 -
model.json和权重文件(分片)托管在 Firebase 存储中。
当使用 first 方法在浏览器中启动应用程序时,模型和权重已正确加载,并且我能够预测类。但是当使用ionic cordova run android --device在我的Android设备中启动应用程序时,模型似乎没有从权重文件中检索数据,因为它给出了以下错误:
Based on the provided shape, [3, 3, 32, 64], the tensor should have 18432 values but has 917.
现在,我尝试将文件托管在 Firebase 存储中以尝试解决此问题。我从存储中检索model.json,但我仍然得到与上述相同的错误在浏览器和设备中。
根据在应用程序中本地存储碎片和模型的经验,我得出的结论是,无论哪种方式,设备都无法识别碎片。
另外,当使用 Firebase 存储方法 in device 时,尝试从 url 获取模型时,我发现以下错误:Failed to fetch。
这是检索分片和模型的代码:
const modelURL: string = await this.db.getModel();
const shards: string[] = await this.db.getShards();
modelURL 和 shards 包含来自 firebase 存储的下载 url。模型和分片保持在同一级别:
/* Firebase Storage hierarchy */
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fmodel.json?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard2of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard3of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard4of4?alt=media&token=******
因此,我将模型的下载网址传递给tf.loadModel:
import * as tf from '@tensorflow/tfjs';
await tf.loadModel(modelURL).then(model => {
const output: any = model.predict(img);
});
那么,有什么方法可以将分片传递到从 firebase 存储中获取的 tf.loadModel(),以便在我的设备和浏览器中检索从模型进行预测所需的所有数据?
感谢您的帮助。
【问题讨论】:
-
我刚刚遇到了一个关于这个 [github.com/tensorflow/tfjs/issues/272] 的 GitHub 问题。似乎在本地保存模型时,在浏览器中运行良好,但在设备上尚不支持。同时,在问题 [github.com/tensorflow/tfjs/issues/410] 中指出,Node.js(设备 - 本机)上的 loadModel 不起作用,因为在尝试从 url 获取模型时节点中缺少获取。有一种解决方法,但我不明白。希望这会有所帮助。
标签: typescript ionic-framework firebase-storage tensorflow.js tensorflowjs-converter