2014-03-06 93 views
1

我使用前饋,反傳,多層神經網絡,我使用雙曲線函數作爲由具有-1到1範圍內,但最小誤差不會低於5.8激活功能而且我希望少一點,你可以在100000次迭代後看到輸出結果。 graph of error against iterations in NN如何決定激活功能的神經網絡

我想這是因爲我的輸出範圍爲大於1,和乙狀結腸功能範圍只有-1到1。有人建議我爲我所需的輸出範圍是0到2.5,我可以如何克服這個問題。建議我哪個激活函數最適合這個範圍。

回答

2

改造如果您正在尋求減少產量錯誤,有幾件事情在之前調整節點的激活功能。

首先,你有一個偏置節點?偏置節點有幾個含義,但是 - 與這個討論最相關 - 它們允許網絡輸出轉換到所需的輸出範圍。作爲this reference狀態:

The use of biases in a neural network increases the capacity of the network to solve problems by allowing the hyperplanes that separate individual classes to be offset for superior positioning.

這篇文章提供了一個很好的討論: Role of Bias in Neural Networks。 這一個也不錯:Why the BIAS is necessary in ANN? Should we have separate BIAS for each layer?

第二種方法:它通常有助於規範化您的輸入和輸出。當你注意,你的乙狀結腸提供一系列的+/- 1.努力學習有一定範圍的0功能,1000的時候(例如)這個小範圍內可能會有問題。爲了幫助學習,通常會縮放和翻譯輸入以適應節點激活功能。在這個例子中,可以將範圍除以500,產生0到2的範圍,然後從這個範圍減去1。以這種方式,輸入已被歸一化到-1到1的範圍,這更好地適合激活功能。需要注意的是網絡輸出應該規格化:第一,500

添加+1到輸出,然後乘以你的情況,你可能會考慮0.8縮放輸入,然後從結果中減去1。然後,您將網絡輸出添加1,然後乘以1.25以恢復所需的範圍。請注意,此方法可能最容易完成,因爲它不會像增加偏差那樣直接更改網絡拓撲。

最後,有你有改變隱藏節點的數量實驗?雖然我相信前兩個選項是提高性能的更好選擇,但您可以試試這個。 (就像一個參考點,我不記得修改激活函數形狀的實例比選項1和2提高了網絡響應。)

下面是關於隱藏層/節點配置的一些很好的討論: multi-layer perceptron (MLP) architecture: criteria for choosing number of hidden layers and size of the hidden layer? How to choose number of hidden layers and nodes in neural network?

24輸入使您的問題高維之一。確保您的訓練數據集充分覆蓋輸入狀態空間,並確保您是測試數據,並且訓練數據來自具有類似代表性的人羣。(在訓練神經網絡時,請看「交叉驗證」討論)。

+0

實際上是我想要的輸出範圍爲0〜5000,我試圖將這個範圍由5000並獲得結果後我再乘以5000,這裏錯誤得到糾正。但是,我仍然會嘗試按照你的建議進行,因爲在測試NN時,我只是在給定的輸入組合中獲得正確的輸出,而對於其他輸入則沒有給出正確的輸出。在這裏,我使用了一個偏置節點,因爲我的輸入數字是24(節點:24 + 1),而在隱藏層中,我使用的是一般規則,即(#inputs + #outputs)*(2/3)。 – lkkkk

+0

請建議是否有任何規則初始設置隨機權重,我有輸入數量:24(二進制0和1)+ 1偏差,隱藏節點:18,輸出:1(範圍:0到5000)。什麼應該是錯誤的確切曲線。 – lkkkk

+0

使用隨機初始權重。看看這個鏈接:http://stackoverflow.com/questions/20027598/why-should-weights-of-neural-networks-be-initialized-to-random-numbers – Throwback1986

2

香草雙曲線函數是:

def sigmoid(x): 
    return 1/(1+math.e**-x) 

你可以變換到:

def mySigmoid(x): 
    return 2.5/(1+math.e**-x) 

爲了讓你想

+0

我嘗試了你的建議選項,但它給錯誤:OverflowError:(34,'數字結果超出範圍') – lkkkk

+0

是這種方式,我可以設置所需的值在-1到1之間除以一些數字和在得到結果後,我可以再次使用sigmoid函數將該結果再乘以相同的數字。 – lkkkk

+0

@Latik:您可能無法對[-1,1]輸出應用線性變換,因爲這會從激活函數的「乙狀結構」中消失。請在try/catch中將調用包裝爲'mySigmoid',並在異常時打印'x'的值。我不知道x'的'什麼價值是導致此錯誤 – inspectorG4dget