【问题标题】:Getting very bad prediction with KerasRegressor使用 KerasRegressor 得到非常糟糕的预测
【发布时间】:2019-10-12 07:03:12
【问题描述】:

我在一个虚拟数据集上使用了 KerasRegressor,并尝试预测训练值本身。它给我的输出远非令人满意。训练数据根本不是随机的。谁能帮帮我?

from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor

import numpy as ny

X = ny.array([[1,2], [3,4], [5,6], [7,8], [9,10]])
Y = ny.array([3, 4, 5, 6, 7])
N = 5

def brain():
    #Create the brain
    br_model=Sequential()
    br_model.add(Dense(3, input_dim=2, kernel_initializer='normal',activation='relu'))
    br_model.add(Dense(2, kernel_initializer='normal',activation='relu'))
    br_model.add(Dense(1,kernel_initializer='normal'))

    #Compile the brain
    br_model.compile(loss='mean_squared_error',optimizer='adam')
    return br_model


estimator = KerasRegressor(build_fn=brain, nb_epoch=1000000, batch_size=5,verbose=1)
print "Done"


estimator.fit(X,Y)
prediction = estimator.predict(X)

print Y
print prediction

输出是

[3 4 5 6 7]
[0.001 0.001 0.001 0.001 0.001]

基本上,预测值是 0.001,而实际值不是。 我已经尝试过其他网络配置,但我面临同样的问题。 我必须做什么/(不做什么)才能获得准确的输出??

【问题讨论】:

  • 你用的是哪个版本的keras?你在训练过程中损失了什么?
  • 看起来网络根本没有训练。如果您使用的是当前版本的 keras,请尝试将 nb_epoch 更改为 epochs
  • @sietschie 也用nb_epoch 进行了测试——在新的 Keras 版本中它只是被忽略了,而是使用默认值 10。真正的问题是数据规范化,请参阅下面的答案

标签: python machine-learning keras neural-network


【解决方案1】:

这是由于新从业者犯的一个典型错误,即没有在将数据输入神经网络之前对其进行规范化(请参阅this answer 中的第三点,了解导致类似问题的相同问题在具有卷积神经网络的分类设置中)。

(我承认,在我看过的大多数教程中,这个关键点通常都没有得到足够的强调;甚至可能更糟,例如在 Tensorflow MNIST For ML Beginners 教程中,事实证明由Tensorflow 提供的实用程序函数已经在 [0, 1] 中进行了规范化,对用户透明且没有提供任何提示,因此向读者隐藏了一个关键步骤,在使用自己的数据时肯定需要稍后完成)。

因此,您需要规范化您的特征您的输出;保留您显示的XY 数据:

# Feature Scaling (ignore possible warnings due to conversion of integers to floats)
from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()
X_train = sc_X.fit_transform(X)

sc_Y = StandardScaler()
Y_train = sc_Y.fit_transform(Y)

然后,将您的 epoch 更改为 1000(这些数据绝对不需要 100 万个 epoch!),并拟合缩放后的数据:

estimator = KerasRegressor(build_fn=brain, epochs=1000, batch_size=5,verbose=1)
estimator.fit(X_train,Y_train)

你会得到:

prediction = estimator.predict(X_train)

print(Y_train)
print(prediction)
# [-1.41421356 -0.70710678  0.          0.70710678  1.41421356]
# [-1.01221371 -1.01221371 -0.08764046  0.69051325  1.42577887]

或者,使用inverse_transform 将输出缩放回原来的范围:

print(Y)
print(sc_Y.inverse_transform(prediction))
# [3 4 5 6 7]
# [ 3.56851363  3.56851363  4.87605762  5.97653294  7.01635551]

【讨论】:

  • 似乎工作正常。但我有两个疑问:1)为什么每次我运行模型时,预测值都会不断变化(即,如果它采用相同的训练输入并且运行相同的算法,它是否给出相同的每次输出?) ?? 2)如果我将 epoch 增加到 10,000,它会给出一个完全错误的结果,其中所有预测值都相同。为什么会这样? (鉴于在线性回归中,您运行的 epoch 越多,它的收敛性就越好......)
  • @Thanatos 当时一步(和问题)。由于这个答案可以说已经解决了您报告的问题,请接受它并打开一个新问题,其中包含您的新问题的详细信息,就像您在此处所做的那样。而且由于您在这里学到了一些有用且普遍适用的东西,因此也欢迎投票。
  • @Thanatos 只是作为关于使用详细信息打开一个新问题的附加论点:不清楚您在 (1) 中的“运行”是什么意思;如果您的意思是安装一个新模型,那并不奇怪(至少在原则上);如果您的意思是运行相同的拟合模型,那真的很奇怪(但我怀疑情况并非如此)...
  • 你可以看看。我在另一篇文章中问过这个问题。感谢您在这里的帮助。这真的很有价值,因为我没有多少时间来运行这个模型。 stackoverflow.com/questions/48476830/…
  • 您确定数据只能缩放而不是标准化吗?这两件事是不同的:缩放产生具有零期望值和单位标准偏差的分布,归一化将向量归一化以具有单位范数(您链接到的答案解决了后者,而不是前者)。
猜你喜欢
  • 2020-08-12
  • 1970-01-01
  • 2017-06-26
  • 2012-05-06
  • 2017-01-25
  • 2018-06-27
  • 2010-09-16
  • 2011-12-19
  • 2016-07-14
相关资源
最近更新 更多