3

我正在 ionic3 框架中开发一个用于识别绘制字符的应用程序,但我在导入模型时遇到了问题。tensorflowjs_converter我以两种不同的方式将模型从 Keras(转换为)导入到我的 ionic3 应用程序中:

  1. model.json权重文件(分片)放置在文件夹/assets/models中。
  2. model.json权重文件(分片)托管在 Firebase 存储中。

使用第一种方法在浏览器中启动应用程序时,模型和权重已正确加载,并且我能够预测类。但是当启动应用程序时,使用相同的方法进入我的 Android 设备ionic cordova run android --device,模型似乎没有从权重文件中检索数据,因为它给出了以下错误:

Based on the provided shape, [3, 3, 32, 64], the tensor should have 18432 values but has 917.

现在,我尝试将文件托管在 Firebase 存储中以尝试解决此问题。我从存储中检索,但在浏览器和设备中model.json仍然得到与上述相同的错误。

根据在应用程序中本地存储碎片和模型的经验,我得出的结论是,无论哪种方式,设备都无法识别碎片。

此外,当在 device 中使用 firebase 存储方法时,当尝试从 url 获取模型时,我发现以下错误:Failed to fetch.

这是检索分片和模型的代码:

const modelURL: string = await this.db.getModel();
const shards: string[] = await this.db.getShards();

modelURLshards包含来自 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=******

因此,我将模型的下载 url 传递到tf.loadModel

import * as tf from '@tensorflow/tfjs';    

await tf.loadModel(modelURL).then(model => {
    const output: any = model.predict(img);
});

那么,有什么方法可以将碎片传递到tf.loadModel(),从 firebase 存储中获取,以便在我的设备和浏览器中检索从模型中预测所需的所有数据?

谢谢您的帮助。

4

1 回答 1

1

tf.loadModel() 调用的 http 加载器假定 model.json 和相应的权重文件 (group1-shard1of1,...) 共享相同的 url 路径前缀。例如:给定模型文件位于: https://foo.bar/path/model.json 加载器尝试在以下位置检索权重文件: https://foo.bar/path/group1-shard1of1,...

在你的情况下 const modelURL: string = await this.db.getModel(); const shards: string[] = await this.db.getShards();

如果 modelUrl 和 shards 不共享相同的路径,您可能需要创建自己的BrowserHttp IOHandler进行加载: const model = await tf.loadModel(new MyOwnHttpIOLoader(modelUrl, shards));

如果是这样,您也许可以通过手动编辑 model.json 文件来对齐它们。在 model.json 文件中,有一个权重文件路径数组。

使用 firebase 存储的问题是模型文件的 url 是:https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fmodel.json 具有路径 firebasestorage.googleapis.com/v0/b/project-foo.com/o 加载器将使用该路径并尝试将权重文件加载到firebasestorage.googleapis.com/v0/b/project-foo.com/o/group1-shard1of4. 但它与您的体重 url 不匹配firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4,它缺少model%2F前缀。

为了使加载器工作,您可以手动更新 model.json 以添加前缀。在文件中搜索“weightsManifest”,将“paths”数组编辑为类似于 ["model%2Fgroup1-shard1of4", ...]

于 2019-01-15T17:24:10.383 回答