2016-09-16 163 views
3

我已經在keras中構建了一個ANN,它有1個輸入層(3個輸入),1個輸出層(1個輸出)和2個分別具有12個和3個節點的隱藏層。神經網絡準確性優化

enter image description here

我構建和培養我的網絡的方式是:

from keras.models import Sequential 
from keras.layers import Dense 
from sklearn.cross_validation import train_test_split 
import numpy 
# fix random seed for reproducibility 
seed = 7 
numpy.random.seed(seed) 

dataset = numpy.loadtxt("sorted output.csv", delimiter=",") 
# split into input (X) and output (Y) variables 
X = dataset[:,0:3] 
Y = dataset[:,3] 
# split into 67% for train and 33% for test 
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed) 
# create model 
model = Sequential() 
model.add(Dense(12, input_dim=3, init='uniform', activation='relu')) 
model.add(Dense(3, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
# Compile model 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
# Fit the model 
model.fit(X_train, y_train, validation_data=(X_test,y_test), nb_epoch=150, batch_size=10) 

排序輸出CSV文件看起來像:

enter image description here

所以後150個時代,我得到:損失:0.6932 - acc:0.5000 - val_loss:0.6970 - val_acc:0.1429

我的問題是:我如何修改我的NN以獲得更高的準確性?

回答

3

Neil Slater已經提供了很多有用的一般性建議。

在您的具體實例中,規範化是重要的。如果添加以下幾行代碼

... 
X = dataset[:,0:3] 
from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler() 
X = scaler.fit_transform(X) 

你會得到你的玩具數據100%的準確度,甚至更簡單的網絡結構。沒有規範化,優化器將無法工作。

+0

我收到一個錯誤:No module named preprocessig – Adriano10

+0

@ Adriano10:答案缺少'n',試着從sklearn.preprocessing導入StandardScaler' –

+0

@NeilSlater:謝謝,糾正了錯字 – Tobias

5

你可以嘗試以下的事情。我粗略地按重要性順序寫入這一點 - 即爲了我想嘗試的東西來解決準確性問題,您看到:

  1. 規範化輸入數據。通常你會採用訓練數據的平均值和標準差,並用它們來抵消+縮放所有進一步的輸入。這裏有一個standard normalising function in sklearn。請記住以相同的方式處理您的測試數據(使用訓練數據的平均值和標準偏差,而不是重新計算)

  2. 訓練更多的時代。對於少量特徵和有限訓練集大小的問題,在網絡收斂之前,您經常需要運行數千個時代。您應該繪製訓練和驗證損失值,以查看網絡是否仍在學習,或者儘可能最佳地收斂。

  3. 對於您的簡單數據,我會避免relu激活。你可能聽說他們是某種「最好的」,但是像大多數NN選項一樣,他們有很好的問題類型,有些問題他們不是最好的選擇。我認爲你的問題隱藏層的tanh或sigmoid激活會更好。保存非常深的網絡和/或圖像/音頻的卷積問題。

  4. 使用更多培訓數據。不清楚你餵食它多少,但神經網絡在大量訓練數據中效果最好。

  5. 假設您已經有很多訓練數據 - 增加隱藏層的大小。更復雜的關係需要更多隱藏的神經元(有時更多層)以使NN能夠表達決策表面的「形狀」。 Here is a handy browser-based network allowing you to play with that idea and get a feel for it

  6. 在隱藏圖層後添加一個或多個dropout layers或添加其他正則化。網絡可能過於合適(儘管訓練準確性爲0.5,我懷疑它不是)。與relu不同的是,使用dropout幾乎可以解決更嚴格的NN問題 - 在很多情況下它可以提高泛化能力。少量退出(〜0.2)可能有助於解決您的問題,但像大多數超參數一樣,您需要搜索最佳值。

最後,你想找到的關係總是有可能讓你從X預測Y並不是真的存在。在這種情況下,從神經網絡獲得的正確結果並不比猜測Y好。

+0

我試圖增加訓練數據,但我注意到當我增加它的準確性下降。爲何會發生這種情況? – Adriano10

+0

@ Adriano10:如果沒有深入介入這個問題,實在不可能說。然而,這可能是隨機波動(準確率<50%很可能是其他地方首先破損)。我按照我會嘗試的方式編寫答案。所以你應該先看看規範化 - 你輸入的那些高正數會阻止任何NN正常工作。 –

+0

非常感謝!這個答案很棒!如果你不介意,我有一個相關的問題。不過,我相信這是另一個問題的原因。關於第二種選擇,你能否澄清我們如何看待網絡融合還是仍然在學習? –