自己按照一些博客和教程並參考已有的程序寫了一個人工神經網路,對於2輸入1輸出的測試數據得到的結果都很滿意。然後準備做曲線擬合,使用直線比如y=x擬合效果很好,但是對於y=x^2這樣的曲線效果並不好。我是用曲線上的隨機點+結果進行訓練,在訓練過程中可以隨時停下來輸入一些值和曲線方程作比較。但是結果出來,出現了很怪異的問題:每次都是使用最後一次的輸入+輸出進行測試比較準確,輸入其他值測試結果就有很大偏差。接著讓它再跑一段時間再中斷輸入上次測試的數據,結果又有很大偏差。網路隠層3層,2輸入3輸出,訓練10萬以上。希望能和人工神經網路大神交流一下。。


卸腰!!!自己寫神經網路的訓練框架,首先要保證BP的過程的正確性,這是成功訓練的基石。怎麼保證?用有限差分的方法檢查一遍自己代碼算出來的梯度和有限差分的結果是否完全一致。這麼簡單的問題,二者的差異要控制在1e-4這種量級。

前向網路一般都不會有什麼問題,如果前向都寫不對,那不用寫了。

此外,訓練時,別一次給一個樣本,給一批,例如1000個,甚至10000個樣本。你這個是簡單擬合問題,10000個採樣點也不會爆內存。或者就乾脆就固定用這10000個樣本點,每次都用這批樣本計算梯度,然後看loss有沒有持續下降。如果沒有,而且震蕩的話,降低學習率。還是不行的話,不用想了,訓練框架寫錯了。

注意矩陣對齊,學習率不要設置的太大,初始化的時候矩陣別設置為0。

可以參考下我寫的CNN和LSTM框架:

LONGMIAOMIAO/Tiny_LSTM?

github.com圖標LONGMIAOMIAO/Tiny_CNN?

github.com圖標

你這個肯定是代碼寫的有問題。

你可以這樣:

設置網路層3層,輸入神經元為1,輸出神經元為1,中間有個隱藏層神經元為3。

然後輸入幾個數據,看一下網路的中間狀態和輸出結果,對比一下你自己手算的結果,看看哪裡對不上,然後做調試。


最重要的是找到問題,然後才是解決問題。簡化問題場景能有效幫助調試。


這點信息不好回答,你要逐步找問題。

1、把loss輸出一下,看是不是跳來跳去的,如果是,一般是學習率設的太高了,調低點。

2、隱藏層的神經元數量是怎麼確定的?要防止欠擬合和過擬合。

3、2輸入3輸出是怎麼做的我不太理解。你擬合直線,不應該是一個輸入x,一個輸入label(真實y),然後輸出的就是預測的y嗎?怎麼會3輸出?


不能逐個點測,所有點都對上了就過擬合了。用一個數據集,測試準確度的百分比。圖形越複雜擬合度越低。除非追求高精度,一般90%幾就可以了。你的訓練集肯定要比原曲線要寬的。

最後一個點會改變網路。


推薦閱讀:
相关文章