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