Tensorflow NodeJS - 序列化/反序列化模型而不将其写入 URI

gar*_*ryp 1 node.js tensorflow

在 NodeJS 中使用 Tensorflow。我已经使用以下方法训练了一个模型:

const model = await model.fit(inputs, expected, {
    epochs: 100,
    shuffle: true,
    batchSize: 100,
    verbose: 0
});
Run Code Online (Sandbox Code Playgroud)

现在我想采用该模型并将其序列化为字符串值。注意我不想将它保存到文件系统或 API 端点 ( model.save(...)),我想将它的表示存储在一个变量中(即我想要一个包含与我在文件中找到的值相同的值的变量)如果我使用model.save(...))。

我想要类似的东西model.serialize()将模型作为字符串或包含权重的 JSON 对象返回给我,这样我以后就可以重建我的模型,而不必被迫从文件系统中读取或必须加载每个权重、单位等手动。

gar*_*ryp 5

好的,我找到了一种方法来做到这一点,如果其他人需要帮助,我会在下面发布:

将模型保存为 JSON 字符串:

let result = await model.save(tf.io.withSaveHandler(async modelArtifacts => modelArtifacts));
result.weightData = Buffer.from(result.weightData).toString("base64");
const jsonStr = JSON.stringify(result);
Run Code Online (Sandbox Code Playgroud)

然后再次加载:

const json = JSON.parse(jsonStr);
const weightData = new Uint8Array(Buffer.from(json.weightData, "base64")).buffer;
const model = await tf.loadLayersModel(tf.io.fromMemory(json.modelTopology, json.weightSpecs, weightData));
Run Code Online (Sandbox Code Playgroud)

由于 ArrayBuffer 未序列化为 JSON,因此必须处理 weightData。如果有办法避免这种情况,那就太好了。

这是@tensorflow/tfjs-node v1.0.3

  • 谢谢你。正在寻找一种将张量流模型存储在 mongoDb 数据库中的方法。我认为这会起作用 (2认同)
  • 比一个好的答案更好。使用这种方法,可以生成多个 Web Worker,而不必将其模型加载到每个 Worker 中(导致多个网络调用)...您可以在主线程中加载模型并将其传递给池中的每个 Worker。请注意,TF 已更新“fromMemory()”以接受单个参数,即对象“{modelTopology: json.modelTopology, :weightSpecs: json.weightSpecs, WeightData: WeightData}”。另外,如果您使用的是“tf.loadGraphModel()”来训练模型,请务必使用“tf.loadGraphModel()”。 (2认同)