从字符串重新创建Tensor

问题描述 投票:2回答:1

我使用tensorflow.js(节点)作为预处理图像文件到张量的方法。

const tf = require('@tensorflow/tfjs');
require("@tensorflow/tfjs-node")
const mobilenetModule = require('@tensorflow-models/mobilenet');
const knnClassifier = require('@tensorflow-models/knn-classifier'); 
const { loadImage, createCanvas } = require('canvas')

当我创建分类器时,它将Tensor类对象保存为键:值对。创建此对象后,我将其字符串化,并将其写入文件,以便稍后使用。

{ '0':
   Tensor {
     kept: true,
     isDisposedInternal: false,
     shape: [ 5, 1024 ],
     dtype: 'float32',
     size: 5120,
     strides: [ 1024 ],
     dataId: {},
     id: 1333,
     rankType: '2',
     scopeId: 728 },
  '1':
   Tensor {
     kept: true,
     isDisposedInternal: false,
     shape: [ 5, 1024 ],
     dtype: 'float32',
     size: 5120,
     strides: [ 1024 ],
     dataId: {},
     id: 2394,
     rankType: '2',
     scopeId: 1356 } }
fs.writeFileSync("test", util.inspect(classifier.getClassifierDataset(), false, 2, false))

当我解析该字符串,因为它不是标准的JSON,.parse()方法会找到该文件的错误

(node:14780) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ' in JSON at position 2

如何将此格式的字符串转换回具有相同格式的对象?

编辑:

解决:将张量转换为数组

将张量保存为字符串

从存储位置拉出该字符串

重新创建Tensor

let tensorArr = tensor.arraySync()
fs.writeFileSync("test", JSON.stringify(tensorArr))
 let test = JSON.parse(classifierFile)
tf.tensor(test)

去推荐tensorflow-model KnnClassifier用它们的.getClassifierDataset自动完成

tensorflow javascript-objects knn tensorflow.js
1个回答
0
投票

将字符串转换回原始张量是不可能的。原因是数据不包含张量的实际数据。这只是一些元数据。

让我们看看你给出的第一个数据作为例子:

Tensor {
    kept: true,
    isDisposedInternal: false,
    shape: [ 5, 1024 ],
    dtype: 'float32',
    size: 5120,
    strides: [ 1024 ],
    dataId: {},
    id: 1333,
    rankType: '2',
    scopeId: 728
}

关于张量,我能说的是它的等级为2,形状为5x1024。总大小为5120(因此它具有与此张量相关的5120个值)。然而,实际的张量数据不存在于该数据中。

另一个错误是您使用了util.inspect函数,该函数仅用于调试目的和保存数据。引用docs

util.inspect()方法返回用于调试的对象的字符串表示形式。 util.inspect的输出可能随时改变,不应以编程方式依赖。

你应该使用JSON.stringify代替。

The correct way to do it

下次要保存张量时,请使用tensor.array()(或tensor.arraySync())函数。

const t = tf.tensor2d([[1,2], [3,4]]);
const dataArray = t.arraySync();
const serializedString = JSON.stringify(dataArray);
console.log(serializedString);

这将返回:[[1,2],[3,4]]

要反序列化数据,您可以使用tf.tensor函数:

const serializedString = '[[1,2],[3,4]]';
const dataArray = JSON.parse(serializedString);
const t = tf.tensor(dataArray);
t.print();

然后t与上面相同的张量,输出将是:

Tensor
    [[1, 2],
     [3, 4]]
© www.soinside.com 2019 - 2024. All rights reserved.