【问题标题】:Regression with Keras API not giving consistent result使用 Keras API 进行回归没有给出一致的结果
【发布时间】:2021-03-26 09:18:54
【问题描述】:

我正在以两种方式对简单回归(一个自变量和一个目标变量)进行比较研究:- 线性回归与神经网络(NN - Keras API)。我的样本数据如下:

  x1           y
121.9114    121.856
121.856     121.4011
121.4011    121.3222
121.3222    121.9502
121.9502    122.0644

线性回归代码:

lr = LinearRegression()
lr.fit(X_train, y_train)

注意:LR 模型在每次后续运行中始终为我提供 RMSE 0.22。

NN 代码:

nn_model = models.Sequential()
nn_model.add(layers.Dense(2, input_dim=1,  activation='relu')) 
nn_model.add(layers.Dense(1))
nn_model.compile(optimizer='adam', loss='mse', metrics=['mae'])
nn_model.fit(X_train, y_train, epochs=40, batch_size=32)

训练损失:

Epoch 1/40 539/539 [==============================] - 0s 808us/sample - loss: 16835.0895 - 
mean_absolute_error: 129.5276
Epoch 2/40 539/539 [==============================] - 0s 163us/sample - loss: 16830.6868 - 
mean_absolute_error: 129.5106
Epoch 3/40 539/539 [==============================] - 0s 204us/sample - loss: 16826.2856 - 
mean_absolute_error: 129.4935
...........................................
...........................................
Epoch 39/40 539/539 [==============================] - 0s 187us/sample - loss: 16668.3582 - 
mean_absolute_error: 128.8823
Epoch 40/40 539/539 [==============================] - 0s 168us/sample - loss: 16663.9828 - 
mean_absolute_error: 128.8654

基于 NN 的解决方案给我 RMSE = 136.7476

有趣的是,基于 NN 的解决方案在不同的运行中给出了不同的 RMSE,因为每次运行的训练损失看起来都不同。

例如,在第一次运行中,如上所示,损失从 16835 开始,第 40 个时期的最终损失为 16663。在这种情况下,模型给我 RMSE=136.74

如果我第二次运行相同的代码,则损失从 16144 开始,第 40 次迭代的最终损失为 5。在这种情况下,如果 RMSE 达到 7.3。

有时,当训练损失以 400 开始并以 0.06 结束(第 40 个时期)时,我也将 RMSE 视为 0.22。

这种 Keras 行为让我很难理解 Keras API 是否存在问题,或者我做错了什么,或者这个问题陈述不适合 Keras。

能否请您帮助我理解这个问题以及稳定基于 NN 的解决方案的最佳方法是什么?

一些附加信息:

  1. 我的训练和测试数据始终是固定的,因此没有数据被打乱。
  2. 训练数据中的记录数 = 539
  3. 测试数据中的记录数 = 154
  4. 也在训练和测试中尝试了 MinMaxScaling,但没有带来预测稳定性。

【问题讨论】:

  • 我建议尝试其他激活函数而不是 relu(如 sigmoid),看看会发生什么。基本原理:stats.stackexchange.com/a/380928/214336 另外,您在 NN 中使用 mae 作为指标,但您优化了 w.r.t mse。

标签: keras deep-learning neural-network keras-layer keras-2


【解决方案1】:

关于 Keras 的一致性/可重复性存在多个问题。不久前我已经回答了here,从那以后我意识到需要进行一些其他修改以实现一致性:

根据Keras FAQKaggle experiment,如果您使用 GPU 处理,您无法实现一致性。因此,他们建议您设置 CUDA_VISIBLE_DEVICES="" 并将 python 哈希生成器设置为使用 PYTHONHASHSEED=0 的固定种子(这必须在您使用 Keras 的脚本之外完成)。

您还必须设置一些种子:

1)numpy 随机种子

import numpy as np
np.seed(1)

2)张量流随机种子

import tensorflow as tf
tf.set_random_seed(2)

3)python 随机种子

import random
random.seed(3)

此外,您必须将两个(如果您具有多处理能力)参数设置为model.fit。这些在我看到的答案中并不经常提到:

model.fit(..., shuffle=False, use_multiprocessing=False)

确保您在 cpu 上训练模型。即使您设置了CUDA_VISIBLE_DEVICES="",更高版本的tensorflow-gpu 也可能能够识别和选择GPU。

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2017-10-14
    相关资源
    最近更新 更多