错误:io_utils.ts:116未被告人(在承诺中)rangeRor:float32array的字节长度应为4个倍数
TensorFlow.js 版本
tensorflow/ [email protected]
浏览器版本
chrome 72.0.3626.109 for mac
描述问题或功能请求
我尝试了 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 并将其放在 assets 文件夹中。然后我在端口 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 不起作用?
谢谢你的帮助。
这确实不必担心,因为您的浏览器将与所有权重一起缓存下载的模型。 因此,您可以使用公共网址。 第一次访问将从浏览器缓存中提供,而不会再次下载。
如果您真的想在本地服务,或者至少要了解为什么没有在以下工作之前的工作:
model.json文件不是整个故事 - 它包含一个具有与权重文件相对路径的strigeSmanifest部分。 当您从原始URL加载型号时,它可以解决并下载所有相邻的权重文件。 因此,要在本地使用该模型,您还需要服务所有这些文件。
不幸的是,获取权重文件的列表并不完全直接,因为Google Cloud Cloud Storage不提供目录以一种易于访问的方式列表。 您当然可以从型号中钓到文件名。 ///cloud.google.com/storage/docs/listing-objects“ rel =“ nofollow noreferrer”> 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-models/tfjs/tfjs/mobilenet_v1_0.25_2224/group1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1-shard1 of1 /storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/group55-shard1of1" rel="nofollow noreferrer">https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/group55- shard1of1 。 这些小组都没有一个以上的碎片。