2017-08-24 82 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)