Tensorflow模型总是预测相同错误的值

我实际上是在学习用Node.js构建机器学习模型:我选择了tensorflow API来做这件事。这个机器学习的目标是输入14个条目,并根据这14个条目返回一个数值。(我无法详细描述上下文,因为我正在实习,我不知道是否允许谈论这些。)但模型总是预测错误的值,我不知道为什么。我尝试了不同的损失/优化函数,不同的层模型配置,不同的层激活…但模型总是给我一个浮点数值。

我尝试将输入/输出值改为0.3,预测返回给我一个介于0.1到0.3之间的值。(测试了3次)。但在训练过程中,损失值在下降,看起来效果更好。

我还尝试将训练轮次增加到1000次,没有结果 :/

首先,我创建了一个函数来构建模型网络。我的模型有一个14个单元的输入层,然后是两个5个单元的隐藏层,最后是一个只有一个单元的输出层。(所有层都使用’sigmoid’激活,并且是dense类型。)

const get_model = async () => {    const model = tf.sequential();    const input_layer = tf.layers.dense({        units: 13,        inputShape: [14],        activation: 'sigmoid',    });    model.add(input_layer)    let left = 3;    while(left >= 2){        const step_layer = tf.layers.dense({            units: 5,            activation: 'sigmoid',        });        model.add(step_layer)        left --;    }    const output = tf.layers.dense({        units: 1,        activation: 'sigmoid',    });    model.add(output)    model.compile({        optimizer: tf.train.sgd(0.01),        loss: tf.losses.absoluteDifference,        metrics: 'accuracy',    })    return model;}

为了测试模型,在训练过程中,我总是提供一个包含13个数字的列表(所有值都是100),并且我总是提供以下值:100。

const get_output = () => {    return 100;}const get_input = () => {    return [        100,        100,        100,        100,        100,        100,        100,        100,        100,        100,        100,        100,        100,        100,    ];}

我有两个函数来将值转换为张量值。

const get_input_tensor = (value) => {    return tf.tensor([value],[1,14])}const get_output_tensor = (value) => {    return tf.tensor(        [Math.floor(value)],        [1,1]    )}

然后我获取模型,训练模型并尝试预测。

(async () => {    const model = await get_model();    let left = 20;    while(left >= 0){        const input = get_input();        const output = get_output();        await model.fit(get_input_tensor(input),get_output_tensor(output),{            batchSize: 30,            epochs: 10,            shuffle: true,        });        left--;    }    const input = get_input();    const output = model.predict(get_input_tensor(input));    output.print();})();

在训练过程中,损失值接近100。这表明模型总是返回接近1的值。

这是我训练过程中的控制台输出:

Epoch 8 / 10eta=0.0 ====================================================================> 11ms 10943us/step - loss=99.14 Epoch 9 / 10eta=0.0 ====================================================================> 10ms 10351us/step - loss=99.14 Epoch 10 / 10eta=0.0 ====================================================================> 12ms 12482us/step - loss=99.14

然后当我尝试预测时,模型返回给我一个接近1的值。

这是预测的张量打印输出。

Tensor     [[0.8586583],]

你能帮我吗?我不知道哪里出了问题。是否有可能得到大于1的预测值?


回答:

我最终解决了问题!

我的层使用以下激活函数:’sigmoid’。sigmoid是一个函数,其值在0到1之间,这就是我得到相同值的原因。(激活函数’relu’并不是我所期望的)

我将激活函数设置为’linear’,但这种激活函数在训练过程中使损失值变为NaN,然后我将优化器切换到adam,这解决了问题 🙂

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中创建了一个多类分类项目。该项目可以对…

发表回复

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