2015-03-30 61 views
1

我想用神經網絡逼近簡單的一維函數(僅限輸入層)。我嘗試了不同的設置(學習速率,動量,隱藏節點數量等)和I似乎在僅接近1個週期(0; 2PI) - 比方說 - 正弦函數時能夠取得好的結果。 當我嘗試多個週期的正弦函數時,事情變得非常快。網絡看起來似乎能夠以一種體面的方式接近第一個週期,但之後網絡的輸出值進入一個恆定值的線性線(該線在0到-0.5之間,取決於設置) 。我嘗試了很多設置,但即使有大量的交互,它也沒有變好。 這裏似乎是什麼問題?對於具有數十個隱藏層神經元的ANN來說,這不是一件容易的事嗎?神經網絡的周期函數逼近失敗

我使用Python與PyBrain包。相關的代碼是在這裏:

from pybrain.tools.shortcuts import buildNetwork 
from pybrain.datasets import SupervisedDataSet 
from pybrain.supervised.trainers import BackpropTrainer 
from pybrain.structure import TanhLayer 
import numpy as np 
import random 

random.seed(0) 

def rand(a, b): #returns random number between (a,b) 
    return (b-a)*random.random() + a 

def singenerate_check(points_num,bottom,top): #generates random testing data 
    pat_check = SupervisedDataSet(1,1) 
    for i in range(points_num): 
     current = rand(bottom,top) 
     pat_check.addSample(current,np.sin(current)) 
    return pat_check  

ds = SupervisedDataSet(1,1) #initalizing dataset 
points_num = 100 
element = 10 * np.pi/points_num 
for i in range(points_num): #generating data 
    ds.addSample(element*i+0.01,np.sin(element*i+0.01)+0.05*rand(-1,+1)) 
net = buildNetwork(1,20,1,bias=True) 
trainer = BackpropTrainer(net,ds,learningrate=0.25,momentum=0.1,verbose=True)    
trainer.trainOnDataset(ds,30000) #number of iterations 

testsample_count = 500 
pat_check = singenerate_check(testsample_count, 0, 10*np.pi) 
for j in range(testsample_count): 
    print "Sample: " + str(pat_check.getSample(j)) 
error = trainer.testOnData(pat_check, verbose=True) #verifying  

回答

0

與一個隱藏層的神經網絡可以與任何所需的精度有限區間逼近任意連續函數。然而,間隔和精度的長度將取決於隱藏的神經元的數量。

當您增加間隔時,如果隱藏的神經元數保持不變,則降低精度。如果你想增加間隔而不降低準確性,你需要添加更多隱藏的神經元。