我正在使用TensorFlow JS构建一个机器学习模型。我对JavaScript和机器学习都比较新手。我已经有一个能够做出不错预测的模型。然而,当我保存模型并将其加载到客户端UI中时,我还需要原始的最小值和最大值来进行相同的归一化处理(我认为这是正确的,否则我得到的预测值将会不同)。我尝试过将最小值和最大值作为单独的张量值带回,也尝试过带回完整的张量然后循环查找最小值和最大值。我还尝试过将最小值和最大值硬编码为数字和对象。
我可以看到张量,但无法访问最小值或最大值。这导致我在尝试预测时出现NaN错误。我对此很新手,猜测可能是我遗漏了一些很明显的东西。任何帮助将不胜感激。我慢慢地失去了头绪,试图找出我哪里做错了。
//保存归一化特征张量以便后续访问使用的最小值/最大值
function downloadJ() {
let values = {
normalisedFeature
}
let json = JSON.stringify(values);
//将JSON字符串转换为BLOB。
json = [json];
let blob1 = new Blob(json, { data:"text/json;charset=utf-8" });
let url = window.URL || window.webkitURL;
link = url.createObjectURL(blob1);
let a = document.createElement("a");
a.download = "tValues.json";
a.href = link;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
//加载保存的张量值
let normalisedFeatureJ = {};
$.ajax({
url: "model/tValues.json",
async: false,
dataType: 'json',
success: function(data) {
normalisedFeatureJ = (data);
}
});
console.log(Object.values(normalisedFeatureJ));
//尝试过dataSync();,循环,解析等方法。无法获取任何可以让我访问最小值/最大值的数据
//json文件看起来像这样: {"normalisedFeature":
{"tensor": {"isDisposedInternal":false,"shape":[10000,17],"dtype":"float32","size":170000,"strides":[17],"dataId":{},"id":28,"rankType":"2"},
"min":{"isDisposedInternal":false,"shape":[],"dtype":"float32","size":1,"strides":[],"dataId":{},"id":6,"rankType":"0"},
"max":{"isDisposedInternal":false,"shape":[],"dtype":"float32","size":1,"strides":[],"dataId":{},"id":16,"rankType":"0"}}}
//使用张量数学进行归一化和去归一化的函数
function normalise(tensor, previousMin = null, previousMax = null) {
const min = previousMin || tensor.min();
console.log("张量归一化的最小值为 :" + tensor.min());
const max = previousMax || tensor.max();
console.log("张量归一化的最大值为 :" + tensor.max());
const normalisedTensor = tensor.sub(min).div(max.sub(min));
// const normalisedTensor = (tensor-min)/(max-min);
return {
tensor: normalisedTensor,
min,
max
};
}
function denormalise(tensor, min, max) {
console.log("张量去归一化的最小值为 :" + min);
console.log("张量去归一化的最大值为 :" + max);
const denormalisedTensor = tensor.mul(max.sub(min)).add(min);
return denormalisedTensor;
}
我还尝试过不使用张量数学直接进行计算,但那真是糟糕透顶 🙂
回答:
您的JSON文件包含了张量的元数据,但不包含数据本身。在downloadJ
中,改为按以下方式定义values
:
let values = { tensor: { shape: normalisedFeature.tensor.shape, data: normalisedFeature.tensor.dataSync() }, min: normalisedFeature.min.dataSync()[0], max: normalisedFeature.max.dataSync()[0]};
JSON将看起来像这样:
{ "tensor": { "shape": [ 10000, 17 ], "data": { "0": 0.6050498485565186, ... "169999": 0.055848438292741776 } }, "min": -43.01580047607422, "max": 727.2080078125}
这包含了您在加载模型时需要的最小值和最大值。