错误:io_utils.ts:116未捕获(承诺)RangeError:Float32Array的字节长度应为4的倍数

时间:2019-02-23 12:14:27

标签: tensorflow.js

TensorFlow.js版本

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不起作用?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您必须在本地服务器上提供文件,因为浏览器无法直接访问文件系统。 herethere

提出了相同的问题

答案 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-shard1of1https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/group55-shard1of1。这些群组中的任何一个都不超过一个。