簡體   English   中英

神經網絡的實現

[英]Implemention of Neural Networks

我試圖了解如何實現神經網絡。 因此,我創建了自己的數據集。 Xtrain是numpy.random浮動。 Ytrain是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%的精度:(

我懷疑30%的准確性是學習率設定值和訓練步驟設定值的組合。

我使用model.fit(train, ytrain, nb_epoch=5, batch_size=32)運行您的代碼片段,經過5個紀元的訓練,其准確率約為28%。 在相同的設置下,但將訓練步驟增加到nb_epoch=50 ,損耗下降到nb_epoch=50 ish,並且精度提高到40%。 進一步增加訓練步驟應使模型進一步收斂。 除此之外,您還可以嘗試使用更大的學習率設置來配置模型,這可以使收斂更快:

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

盡管要小心,但不要將學習率設置得太大,否則您的損失可能會增加。

編輯:NN因具有對極其復雜的功能進行建模的潛力而聞名,但是,模型是否真正產生良好的性能取決於模型的設計,訓練和與特定應用相關的許多其他問題。

匡忠禹的答案是正確的,它表明您可能需要訓練更長的時間或學習速度有所不同。

我要補充一點,您的網絡越深,融合之前就需要對其進行訓練的時間越長。 對於諸如sign(sin(1 / x ^ 3))之類的相對簡單的功能,您可以擺脫比您所使用的網絡更小的網絡。

此外,softmax可能不是最佳的輸出層。 您只需要產生-1或1即可。單個tanh單位似乎效果很好。 當您想學習有限集上的概率分布時,通常使用softmax。 (出於類似的原因,您可能希望將誤差函數從交叉熵切換為均方誤差。)

嘗試使用一個具有S形隱藏層的網絡以及一個只有一個tanh單元的輸出層的網絡。 然后試一下圖層大小和學習率。 如果您不能僅憑一個結果就可能添加第二個隱藏層,但是如果不必要的話,我也不會感到驚訝。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM