我在一个虚拟数据集上使用了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而实际值不是。 我尝试过其他网络配置,但我遇到了同样的问题。 我必须做什么/(不做)才能获得准确的输出?
答案 0 :(得分:1)
这是由于新的从业者犯了一个经典的错误,即不在将数据输入神经网络之前对其数据进行规范化(请参阅this answer中的第三点,了解同一问题使用卷积神经网络进行分类设置时的类似问题。)
(我承认,在我看过的大多数教程中,这个关键点通常不够强调;而且可能更糟,例如在Tensorflow MNIST For ML Beginners教程中,事实证明返回的数据通过Tensorflow提供的实用程序功能已经在[0,1]中标准化,对用户透明并且没有提供任何提示,因此从读取器中隐藏了一个关键步骤,当使用自己的数据时肯定需要在以后完成)。
因此,您需要将您的功能和标准化为您的输出;保持展示的X
和Y
数据:
# 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)
然后,将您的纪元改为1000(这些数据肯定不需要100万个纪元!),并且适合缩放数据:
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]