tensorflow/tfjs-core@0.15.2
适用于Mac的Chrome 72.0.3626.109
我在tensorflow / tfjs-examples中尝试了演示tfjs-examples-webcam-transfer-learning。在文件index.js中,tensorflow尝试加载如下模型:
const mobilenet = await tf.loadModel(
'https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json'
);
但是,每次我运行此演示时,它将运行此语句并下载模型。我想使其从本地服务器加载。因此,我下载了model.json并将其放在资产文件夹中。然后,将资产部署在本地服务器的端口1234上。像这样加载它:
const mobilenet = await tf.loadModel(
'http://localhost:1234/json/model.json'
);
但是它没有用并且已被淘汰
io_utils.ts:116 Uncaught (in promise) RangeError: byte length of Float32Array should be a multiple of 4
at new Float32Array (<anonymous>)
at o (io_utils.ts:116)
at Object.decodeWeights (io_utils.ts:79)
at models.ts:318
at common.ts:14
at Object.next (common.ts:14)
at o (common.ts:14)
我真的确定model.json与https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json中的相同,但是为什么id不起作用?
感谢您的帮助。
答案 0 :(得分:0)
答案 1 :(得分:0)
这实际上不是问题,因为您的浏览器将缓存下载的模型及其所有权重。因此,您可以只使用公共URL。首次访问后的任何访问都将从浏览器缓存中提供,而不会真正再次下载。
如果您真的想在本地服务,或者至少要了解为什么以前不起作用:
model.json文件不是全部,它包含一个weightsManifest部分,其中包含weights文件的相对路径。从原始URL加载model.json时,它将解析并下载所有相邻的权重文件。因此,要在本地提供模型,您还需要提供所有这些文件。
不幸的是,获取重量文件列表并不完全简单,因为Google Cloud Storage不会以易于访问的方式提供目录列表。当然,您可以将文件名从model.json中删除(寻找类似it('should foo bar baz', () => {
const store = {
dispatch: jest.fn(),
};
const foobar = new Foo();
foobar.bar();
console.log(store.dispatch.mock);
//=> { calls: [], instances: [], invocationCallOrder: [], results: [] }
});
的东西。第二种选择是从命令行使用gsutil,这样您就可以下载整个文件夹了。第三种选择是使用REST API列出目录内容:https://www.googleapis.com/storage/v1/b/tfjs-models/o?prefix=tfjs/mobilenet_v1_0.25_224,并在其中查找“名称”条目。
第四个也是最简单的选择是从头开始构建URL:在这种情况下,共有55个权重组,因此URL的范围从https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/group1-shard1of1到https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/group55-shard1of1。这些群组中的任何一个都不超过一个。