神经网络的周期函数逼近失败

时间:2015-03-30 22:51:37

标签: python neural-network approximation sine

我试图用神经网络近似简单的一维函数(仅1个输入层。)我尝试了不同的设置(学习率,动量,隐藏节点数等),我似乎能够取得好成绩结果只接近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    

1 个答案:

答案 0 :(得分:0)

具有一个隐藏层的神经网络可以在有限区间内以任何所需精度逼近任何连续函数。然而,间隔和准确度的长度将取决于隐藏神经元的数量。

当您增加间隔时,如果隐藏神经元的数量保持不变,则会降低准确度。如果你想在不降低准确度的情况下增加间隔,你需要添加更多隐藏的神经元。

相关问题