如何使用 tf.loadLayersModel() 从 express 加载 tensorflow-js 权重?

IT技术 node.js reactjs express tensorflow tensorflow.js
2021-05-06 06:57:57

我收到错误 -RangeError: attempting to construct out-of-bounds TypedArray on ArrayBuffer当我尝试将 tf-js 模型加载到 Reactjs 时。

我正在使用 express.js 发送 json+bin 文件以进行react,以便我可以在浏览器本身中运行推理。

这是相关的 Express.js 代码。json+bin 文件都在同一个文件夹中。

app.use(
  "/api/pokeml/classify",
  express.static(path.join(__dirname, "classifier_models/original/model.json"))
)

这是我在 React 中加载它的方式 -

import * as tf from "@tensorflow/tfjs"

  useEffect(() => {
    async function fetchModel() {
      // const mobileNetModel = await mobilenet.load()
      // const classifierModel = await axios.get("api/pokeml/classify")
      const classifierModel = await tf.loadLayersModel(
        "http://localhost:3001/api/pokeml/classify"
      )
      setModel(classifierModel)
    }
    fetchModel()
  }, [])

model.json 文件正确加载,但分片没有 - 在此处输入图片说明

1个回答

我在沙箱中重新创建了您的问题。服务器| 客户

分片来自您用来调用模型的同一端点,因此一旦您拥有model.json,它就会返回到api/pokeml/group1-shard2of2.bin当前无法访问的fetch

所以,

app.use(
  "/api/pokeml/classify",
  express.static(path.join(__dirname, "classifier_models/original/model.json"))
);

// add this, 
// to allow access to the `original` folder from `api/pokeml` for 
// the shards to be accessible
app.use(
  "/api/pokeml",
  express.static(path.join(__dirname, "classifier_models/original"))
);

如果这仍然不能解决您的问题,您可以尝试更换沙箱中的模型/分片这将使您能够检测您的模型是否格式错误。