我正在 ionic3 框架中开发一个用于识别绘制字符的应用程序,但我在导入模型时遇到了问题。我已将模型从 Keras(使用 tensorflowjs_converter
转换)以两种不同的方式导入到我的 ionic3 应用程序中:
model.json
和权重文件(分片)放在文件夹/assets/models
中。model.json
和权重文件(分片)托管在 firebase 存储中。
当使用第一种方法在浏览器中启动应用程序时,模型和权重已正确加载,我能够预测类别。但是当启动应用程序时,在我的 Android 设备中使用相同的方法 ionic cordova run android --device
,模型似乎没有从权重文件中检索数据,因为它给出了以下错误:
根据提供的形状 [3, 3, 32, 64],张量应该有 18432 个值,但有 917 个值
。
现在,我尝试将文件托管在 firebase 存储中以尝试解决此问题。我从存储中检索了 model.json
,但我仍然得到与上述相同的错误在浏览器和设备中。
根据在应用程序中本地存储分片和模型的经验,我得出的结论是分片在设备中无法被两种方式识别。
此外,在设备中使用 firebase 存储方法时,当尝试从 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=******
因此,我将模型的下载 url 传递到 tf.loadModel
:
import * as tf from '@tensorflow/tfjs';
await tf.loadModel(modelURL).then(model => {
const output: any = model.predict(img);
});
那么,有没有什么方法可以将分片传递到 tf.loadModel()
,从 firebase 存储中获取,这样我就可以在我的设备和浏览器中检索所需的所有数据,以便从模型预测?
感谢您的帮助。
最佳答案
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(); 常量分片:string[] = await this.db.getShards();
如果 modelUrl 和分片不共享相同的路径,您可能需要创建自己的 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
的权重文件。但它与您的权重网址 firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4
不匹配,它缺少 model%2F
前缀。
为了使加载器工作,您可以手动更新 model.json 以添加前缀。 在文件中搜索“weightsManifest”,将“paths”数组编辑为类似于 ["model%2Fgroup1-shard1of4", ...]
关于typescript - 如何从 firebase 存储中使用 tf.loadModel 加载模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54159886/