在TensorFlow.js中最小化前馈神经网络的损失

我正在尝试使用TensorFlow.js创建一个示例前馈神经网络,初始使用一个小数据集(仅用于概念验证)。有5个输入节点和一个输出节点。数据与房屋相关,有多个输入,我们在预测价格。

x_train:[ [ 79545.45857, 5.682861322, 7.009188143, 4.09, 23086.8005 ],  [ 79248.64245, 6.002899808, 6.730821019, 3.09, 40173.07217 ],  [ 61287.06718, 5.86588984, 8.51272743, 5.13, 36882.1594 ],  [ 63345.24005, 7.188236095, 5.586728665, 3.26, 34310.24283 ],  [ 59982.19723, 5.040554523, 7.839387785, 4.23, 26354.10947 ],...] y_train[ [ 1059033.558 ],  [ 1505890.915 ],  [ 1058987.988 ],  [ 1260616.807 ],  [ 630943.4893 ],...]const model = tf.sequential();const config_hidden = {        inputShape: [5],        activation: 'sigmoid',        units: 6    }const config_output = {    units: 1,    activation: 'sigmoid'}const hidden = tf.layers.dense(config_hidden);const output = tf.layers.dense(config_output);model.add(hidden);model.add(output);const optimizer = tf.train.sgd(0.5);const config = {    optimizer: optimizer,    loss: 'meanSquaredError',    metrics: ['accuracy']}model.compile(config);train_data().then(function () {    console.log('Training is Complete');}async function train_data() {    const options = {        shuffle: true,        epochs: 10,        batch_size: 100,        validationSplit: 0.1    }    for (let i = 0; i < 10; i++) {        const res = await model.fit(xs, ys, options);        console.log(res.history.loss[0]);    }}

模型编译正常。但是在训练模型时的损失非常大

Model Successfully CompiledEpoch 1 / 10eta=0.0 ====================================================================>1058ms 235us/step - acc=0.00 loss=1648912629760.00 val_acc=0.00 val_loss=1586459705344.00Epoch 2 / 10eta=0.0 ====================================================================>700ms 156us/step - acc=0.00 loss=1648913285120.00 val_acc=0.00 val_loss=1586459705344.00Epoch 3 / 10eta=0.0 ====================================================================>615ms 137us/step - acc=0.00 loss=1648913022976.00 val_acc=0.00 val_loss=1586459705344.00Epoch 4 / 10eta=0.0 ====================================================================>852ms 189us/step - acc=0.00 loss=1648913285120.00 val_acc=0.00 val_loss=1586459705344.00

我认为这可能是因为训练数据没有标准化。所以我计算了数据的平均值并进行了除法

xs = xs.div(xs.mean(0));x_train[[1.1598413, 0.9507535, 1.003062 , 1.0272969, 0.6384002],     [1.1555134, 1.0042965, 0.9632258, 0.7761241, 1.1108726],     [0.8936182, 0.9813745, 1.2182286, 1.2885166, 1.0198718],     ...,

损失没有太大变化

Model Successfully CompiledEpoch 1 / 10eta=0.0 ====================================================================>841ms 187us/step - acc=0.00 loss=1648912760832.00 val_acc=0.00 val_loss=1586459705344.00Epoch 2 / 10eta=0.0 ====================================================================>613ms 136us/step - acc=0.00 loss=1648913154048.00 val_acc=0.00 val_loss=1586459705344.00Epoch 3 / 10eta=0.0 ====================================================================>646ms 144us/step - acc=0.00 loss=1648913022976.00 val_acc=0.00 val_loss=1586459705344.00

然后我还对输出进行了标准化,

ys = ys.div(1000000);Model Successfully CompiledEpoch 1 / 10eta=0.0 ====================================================================>899ms 200us/step - acc=0.00 loss=0.202 val_acc=0.00 val_loss=0.161Epoch 2 / 10eta=0.0 ====================================================================>667ms 148us/step - acc=0.00 loss=0.183 val_acc=0.00 val_loss=0.160Epoch 3 / 10eta=0.0 ====================================================================>609ms 135us/step - acc=0.00 loss=0.182 val_acc=0.00 val_loss=0.159

这将损失降低到了小数点数值。然而,即使在训练数据上运行10000次迭代,损失也没有显著减少。例如:

Epoch 8 / 10eta=0.0 ====================================================================>502ms 112us/step - acc=0.00 loss=0.181 val_acc=0.00 val_loss=0.158Epoch 9 / 10eta=0.0 ====================================================================>551ms 122us/step - acc=0.00 loss=0.181 val_acc=0.00 val_loss=0.158Epoch 10 / 10eta=0.0 ====================================================================>470ms 104us/step - acc=0.00 loss=0.181 val_acc=0.00 val_loss=0.1580.18076679110527039

最终损失从大约0.202开始,降到大约0.180。这导致了错误的预测结果。

这是一个非常常见的场景。多个输入值在不同范围内(例如上面使用的房屋数据)。将多个输入传递给前馈神经网络。期望只有一个输出(在本例中是价格)。

问题:
1. 上述代码中我做错了什么?
2. 我标准化数据的方式正确吗?
3. 我使用了正确的损失函数/优化器/学习率/激活函数等吗?
4. 我如何知道模型表现得好不好?
5. 在TensorFlow.js中还有其他方法可以做到这一点吗?


回答:

我假设你不是在尝试线性回归,因为你使用了S形激活函数。如果你是在尝试线性回归,请删除所有地方的S形激活函数。我将尽量回答我能看到的所有错误:

  1. 从输出中移除S形激活函数。S形函数将输入压缩到0到1之间,因此不适合回归。你的最后一层不需要激活函数。

  2. 你的学习率太高了,所以我怀疑学习算法无法收敛。开始时使用大约0.001到0.01之间的值,并根据需要进行调整。

  3. 不,你的标准化方式不正确。通常数据会被标准化到均值为零,标准差为一。这是针对每个特征列进行的,仅使用该列的均值和标准差,而不是所有数据。例如,在特征列x中的第i个样本的公式如下:(x_i - x.mean()) / x.std()。(我不懂JavaScript)

  4. 你提供的性能指标“准确率”适用于分类,而不适用于回归,并且是没有意义的(如果它甚至被提供)。最小化你的均方误差或绝对误差是量化模型性能的最佳方式。

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

发表回复

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