2017-08-24 66 views
2

代码:简单keras NN不能预测以及

x1 = np.array([1, 10]) 
x2 = np.array([7, 4]) 
x3 = np.array([8, 7]) 
x4 = np.array([1, 15]) 
x5 = np.array([4, 4]) 
X = np.array([x1, x2, x3, x4, x5]) 
X = X/100 
Y = np.array([4, 8, 7, 5, 1]) 
Y = Y/100 
model = Sequential() 
model.add(Dense(4, input_dim=2, activation='sigmoid', kernel_initializer="uniform")) 
model.add(Dense(2, activation='sigmoid', kernel_initializer="uniform")) 
model.add(Dense(1, activation='sigmoid', kernel_initializer="uniform")) 
model.compile(loss='mean_squared_error', optimizer='adam') 
model.fit(X, Y, epochs=500, batch_size=3) 
toPred = np.array([x1])/100 
print(model.predict(toPred) * 100) 

的一切我预测,我得到一个奇怪的结果,所有的预测都几乎一样,并且不接近实际值。

对此提出建议?

+0

你的数据是什么?你在预测什么 – DJK

+0

这是一个非常人造的数据,因为我插入了代码本身。 X是每个记录的属性向量,Y是结果。 我期待从X再次获得Y,但我得到了完全错误的东西。 – ian

+0

为什么输出错误?你可以发布一个样本吗? – DJK

回答

1

试试这个例子,我没有改变很多只是一个不同的缩放方法和更长的培训时间。

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense 


x1 = np.array([1, 10]) 
x2 = np.array([7, 4]) 
x3 = np.array([8, 7]) 
x4 = np.array([1, 15]) 
x5 = np.array([4, 4]) 
X = np.array([x1, x2, x3, x4, x5]) 

# Scale to range 0-1 since input activation is a sigmoid 
X = (X - X.std())/X.mean() 

#Dont need to scale Y, leaves us with one less unnecessary operation 
Y = np.array([4, 8, 7, 5, 1]) 

model = Sequential() 
model.add(Dense(4, input_dim=2, activation='sigmoid', kernel_initializer="uniform")) 
model.add(Dense(2, activation='sigmoid', kernel_initializer="uniform")) 

#Set output activation to linear 
model.add(Dense(1, activation='linear', kernel_initializer="uniform")) 
model.compile(loss='mean_squared_error', optimizer='adam') 

#Train for 5k epochs, since the loss keeps decreasing 
model.fit(X, Y, epochs=5000, batch_size=5) 

print(model.predict(X)) 

给我

[[ 3.50988507] 
[ 7.0278182 ] 
[ 7.61787605] 
[ 5.38016272] 
[ 1.63140726]] 

有时候,你只需要与超参数进行修补。你可能会消除第二个密集层,因为这个数据很小,我也使用'SGD'(随机梯度下降)优化器得到了更好的结果。通过提高学习速度,您也可以更快地获得好成绩(可能只适用于此片段)。所以,只要玩,直到你找到你想要的结果。希望这有助于:)

from keras.optimizers import SGD 
opt = SGD(lr=.05) 
model.compile(loss='mean_squared_error', optimizer=opt) 
model.fit(X, Y, epochs=1000, batch_size=5)