我使用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自动完成
将字符串转换回原始张量是不可能的。原因是数据不包含张量的实际数据。这只是一些元数据。
让我们看看你给出的第一个数据作为例子:
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
代替。
下次要保存张量时,请使用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]]