2016-11-30 227 views
2

我想了解如何實現神經網絡。所以我做了我自己的數據集。 Xtrain是numpy.random漂浮。 Ytrain is sign(sin(1/x^3) 嘗試實施神經網絡給我的結果很差,精度達到30%,隨機森林有100棵樹給出了97%,但是我聽說NN可以近似任何函數。錯在我的理解?神經網絡的實現

import numpy as np 
import keras 
import math 
from sklearn.ensemble import RandomForestClassifier as RF 
train = np.random.rand(100000) 
test = np.random.rand(100000) 
def g(x): 
    if math.sin(2*3.14*x) > 0: 
     if math.cos(2*3.14*x) > 0: 
      return 0 
     else: 
      return 1 
    else: 
     if math.cos(2*3.14*x) > 0: 
      return 2 
     else: 
      return 3 
def f(x): 
    x = (1/x) ** 3 
    res = [0, 0, 0, 0] 
    res[g(x)] = 1 
    return res 

ytrain = np.array([f(x) for x in train]) 
ytest = np.array([f(x) for x in test]) 
train = np.array([[x] for x in train]) 
test = np.array([[x] for x in test]) 

from keras.models import Sequential 
from keras.layers import Dense, Activation, Embedding, LSTM 

model = Sequential() 
model.add(Dense(100, input_dim=1)) 
model.add(Activation('sigmoid')) 
model.add(Dense(100)) 
model.add(Activation('sigmoid')) 
model.add(Dense(100)) 
model.add(Activation('sigmoid')) 
model.add(Dense(4)) 
model.add(Activation('softmax')) 
model.compile(optimizer='sgd', 
      loss='categorical_crossentropy', 
      metrics=['accuracy']) 

PS我嘗試了很多層,激活功能,喪失功能,優化,但從來沒有超過30%的準確率:(

+1

我投票結束這個問題作爲題外話,因爲這是關於神經網絡設計的一般問題,它會在其他stackexchange網站上得到更好的回答。 stackoverflow主要是編程問題。 – rds

回答

2

我懷疑,30%的準確率是小學習率設置和小訓練步設置的組合

我跑你的代碼片段model.fit(train, ytrain, nb_epoch=5, batch_size=32),經過5次時代的訓練後,它的準確率大約爲28%。使用相同的設置,但將訓練步驟增加到nb_epoch=50,損失降至〜1.157 ish,準確度提高到40%。進一步增加培訓步驟應該使模型進一步趨同。除此之外,你還可以嘗試配置具有較大的學習率設定的模型,可以使收斂速度快:

model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.1, momentum=0.9, nesterov=True), metrics=['accuracy']) 

雖然要小心,不要設置學習率過大,否則你的損失可能爆炸。

編輯: 神經網絡被稱爲具有建模極其複雜的功能的潛力,但是,模型是否實際上產生了良好的性能是一個問題,模型是如何設計,訓練,以及許多其他相關問題具體應用。

+0

好的,但我們怎樣才能比較40%的準確性與優化隨機森林解決方案產生97%的準確性?這是什麼原因? – SaveMyLife

+1

40%不是這個NN模型能夠做到的最好*性能(丟失1.157,它顯然沒有收斂)。這是一個表現,然後它實際收斂到全球最低點(我只訓練了50個時刻,表明它可以超過30%,但我沒有耐心去進一步訓練)。當NN模型正確調整並且實際收斂時,它有可能產生類似甚至更好的性能。 –

0

鍾育光的回答是正確的,指出你可能需要更長時間或以不同的學習速度進行訓練。

我會補充一點,你的網絡越深,在收斂之前你需要訓練的時間就越長。對於像sign(sin(1/x^3))這樣一個相對簡單的函數,你可能能夠擺脫比你所使用的網絡更小的網絡。

此外,softmax可能不是最好的輸出層。你只需要得到-1或1.一個單一的tanh單位看起來會好。當您想要學習有限集合上的概率分佈時,通常會使用softmax。 (由於類似的原因,您可能希望將錯誤函數從交叉熵切換到均方差)。

嘗試使用一個S形隱藏層和輸出層的網絡,只有一個tanh單元。然後玩弄圖層大小和學習率。也許再加上第二個隱藏層,如果你只用一個就不能得到結果,但是如果沒有必要,我不會感到驚訝。

附錄:在這種方法中,您將使用目標函數的直接計算來代替f(x),而不是您當前使用的單熱矢量。