2017-07-30 198 views
1

我嘗試創建一個帶有keras(backened tensorflow)的神經網絡。 我有4個輸入和2個輸出變量: 不可用MLP與keras預測

我想做一個測試集預測不可用。

這是我的代碼:

from keras import optimizers 
from keras.models import Sequential 
from keras.layers import Dense 
import numpy 
numpy.random.seed(7) 
dataset = numpy.loadtxt("trainingsdata.csv", delimiter=";") 
X = dataset[:,0:4] 
Y = dataset[:,4:6] 
model = Sequential() 
model.add(Dense(4, input_dim=4, init='uniform', activation='sigmoid')) 
model.add(Dense(3, init='uniform', activation='sigmoid')) 
model.add(Dense(2, init='uniform', activation='linear')) 
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy']) 
model.fit(X, Y, epochs=150, batch_size=10, verbose=2) 
testset = numpy.loadtxt("testdata.csv", delimiter=";") 
Z = testset[:,0:4] 
predictions = model.predict(Z) 
print(predictions) 

當我運行該腳本,精度爲1.000每一個時代之後,我得到的結果總是相同的輸出爲每個輸入對:

[-5.83297 68.2967] 
[-5.83297 68.2967] 
[-5.83297 68.2967] 
... 

有沒有人知道我的代碼中的錯誤是什麼?

+0

我不確定,但我想你可以嘗試重塑你的Y變量。從https://keras.io/models/model/它說'輸出= [b1,b3,b3]'所以我認爲輸出應該是值的設置,而不是數據的設置。你可以通過轉置來做到這一點。 – malioboro

+0

爲了確保您注意到它:您已經定義了SGD優化器,但實際上並未使用它:在編譯期間使用Adaptative Momentum(Adam)。 – Nathan

+1

謝謝!我在帖子中改變了它。在我原來的腳本中是正確的。你更喜歡哪個優化器? –

回答

2

我建議您在將數據提供給模型之前對數據進行標準化/標準化,然後檢查模型是否開始學習。

看看scikit-learn的StandardScaler

並看看into this SO thread瞭解如何正確fit_transform您的培訓數據和只有transform您的測試數據。

還有本教程利用了scikit學習的數據預處理流水線:http://machinelearningmastery.com/regression-tutorial-keras-deep-learning-library-python/

+1

感謝您的鏈接。我已閱讀Brownlee博士的許多教程,但沒有找到這個教程! –

0

神經網絡有一個艱難的時間,如果輸入變量的規模是彼此太不一樣了。將10,1000,100000作爲相同的輸入使得梯度向任何大值變小。其他值實際上不提供任何信息。

一種方法是簡單地通過常數重新縮放輸入變量。您可以簡單地將206000除以100000.嘗試讓所有變量都處於大約相同的數字位數。對於網絡來說,大數字比小數字更難一些。

+1

謝謝,它提供了我現在可以使用的信息!我的神經網絡的結果不準確,但並不總是像以前一樣。 –

+0

樂意幫忙! – Fosa