首页 > 解决方案 > 从 json 对象而不是 json 加载 Tensorflowjs

问题描述

我正在尝试使用 model.json 加载一个 Tensorflowjs 模型,它是一个内存浏览器端对象。

https://js.tensorflow.org/api/latest/#loadLayersModel

一种方法可能是从虚拟 fetch 方法返回 json。

fetchFunc (Function) 用于覆盖 window.fetch 函数的函数。

或者,可以创建一个自定义的 IOHandler,但是这方面的文档很少。

一个 tf.io.IOHandler 对象,它使用其 load 方法加载模型工件。

有谁知道如何使用 tensorflow 加载方法来实现这一点?

var modelJson = "{...ModelAndWeightsConfig}";

//Do something here to load it.

var newModel =  tf.loadLayersModel("/model_0/model.json", {
                    onProgress: onProgressCallback}).then(model =>{});

问候,

标签: javascriptjsontensorflow.js

解决方案


是的,您可以自己编写IOHandler来加载模型。IOHandler 在此处查看 an 的定义。您必须实现load返回 a 的函数Promise<ModelArtifacts>

这意味着,要加载文件 IOHandler保存的模型,您可以查看源代码并自己重新实现加载函数。

代码示例

这是帮助您入门的示例。该load()部分主要是loadJSONModel从文件 IOHandler 中的函数复制而来的。基本上,JSON 字符串作为参数传递,然后在loadTensorflow.js 调用函数时使用。

export class JSONHandler implements tfc.io.IOHandler {
  constructor(jsonString) {
     this.jsonString = jsonString;
  }
  async load() {
    const modelJSON = JSON.parse(jsonString);
    const modelArtifacts: tfc.io.ModelArtifacts = {
      modelTopology: modelJSON.modelTopology,
      format: modelJSON.format,
      generatedBy: modelJSON.generatedBy,
      convertedBy: modelJSON.convertedBy
    };
    if (modelJSON.weightsManifest != null) {
      // load weights (if they exist)
    }
    if (modelJSON.trainingConfig != null) {
      modelArtifacts.trainingConfig = modelJSON.trainingConfig;
    }
    if (modelJSON.userDefinedMetadata != null) {
      modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata;
    }
    return modelArtifacts;
  }
}

要使用该模型,您可以创建它的一个实例并将其传递给加载函数:

const modelJson = '{ ... }';
const handler = new JSONHandler(modelJson);
const model = await tf.loadLayersModel(handler);

推荐阅读