TensorFlow JS – 保存模型时一并保存最大最小值,并在预测数据时加载这些值

我正在使用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}

这包含了您在加载模型时需要的最小值和最大值。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注