【发布时间】:2015-03-30 22:51:36
【问题描述】:
我正在尝试使用神经网络(仅 1 个输入层)来逼近简单的一维函数。我尝试了不同的设置(学习率、动量、隐藏节点的数量等),我似乎能够达到很好的效果仅近似正弦函数的 1 个周期 (0;2PI) 时的结果。 当我尝试使用多个周期的正弦函数时,事情变得非常糟糕。网络似乎能够以一种不错的方式近似第一个周期,但之后网络的输出值进入一条恒定值线性线(该线介于 0 和 -0.5 之间,具体取决于设置) .我尝试了许多设置,但即使有大量的交互,它也不会变得更好。 这里似乎有什么问题?对于一个有几十个隐藏层神经元的人工神经网络来说,这不是一件容易的事吗?
我使用 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
【问题讨论】:
标签: python neural-network approximation trigonometry