基于pybrain的神经网络回归

2024-10-02 02:36:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用一个前馈网络来解决一个回归问题,我一直在尝试使用PyBrain来解决这个问题。由于pybrain的引用中没有回归的例子,所以我尝试将它的分类示例改为回归,但是没有成功(分类示例可以在这里找到:http://pybrain.org/docs/tutorial/fnn.html)。以下是我的代码:

第一个函数将我的numpy数组形式的数据转换为pybrain supervieddataset。我使用supervieddataset是因为根据pybrain的引用,当问题是回归时,它是要使用的数据集。参数是具有特征向量(数据)及其预期输出(值)的数组:

def convertDataNeuralNetwork(data, values):

fulldata = SupervisedDataSet(data.shape[1], 1)

for d, v in zip(data, values):

    fulldata.addSample(d, v)    

return fulldata

接下来是运行回归的函数。train_data和train_values是列车特征向量,其预期输出、test_data和test_values是试验特征向量及其预期输出:

regressionTrain = convertDataNeuralNetwork(train_data, train_values)

regressionTest = convertDataNeuralNetwork(test_data, test_values)

fnn = FeedForwardNetwork()

inLayer = LinearLayer(regressionTrain.indim)
hiddenLayer = LinearLayer(5)
outLayer = GaussianLayer(regressionTrain.outdim)

fnn.addInputModule(inLayer)
fnn.addModule(hiddenLayer)
fnn.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

fnn.addConnection(in_to_hidden)
fnn.addConnection(hidden_to_out)

fnn.sortModules()

trainer = BackpropTrainer(fnn, dataset=regressionTrain, momentum=0.1, verbose=True, weightdecay=0.01)

for i in range(10):

    trainer.trainEpochs(5)

    res = trainer.testOnClassData(dataset=regressionTest )

    print res

当我打印res时,它的值都是0。我试过使用build network函数作为构建网络的捷径,但效果并不理想。我也尝试过不同的层和隐藏层中不同数量的节点,但没有成功。

有人知道我做错了什么吗?另外,一些pybrain回归的例子真的会有帮助!我一看就找不到。

提前谢谢


Tags: to数据函数intestdatatrainhidden
3条回答

^{}是一个工具

Learns to numerically predict the targets of a set of data, with optional online progress plots.

所以它看起来很适合为你的回归任务构建一个神经网络。

正如Ben Allison最初指出的,为了使网络能够逼近任意值(即不一定在0..1范围内),在最后一层中使用具有有限输出范围的激活函数非常重要。例如,线性激活函数应该能很好地工作。

下面是一个从pybrain的基本元素构建的简单回归示例:

#----------
# build the dataset
#----------
from pybrain.datasets import SupervisedDataSet
import numpy, math

xvalues = numpy.linspace(0,2 * math.pi, 1001)
yvalues = 5 * numpy.sin(xvalues)

ds = SupervisedDataSet(1, 1)
for x, y in zip(xvalues, yvalues):
    ds.addSample((x,), (y,))

#----------
# build the network
#----------
from pybrain.structure import SigmoidLayer, LinearLayer
from pybrain.tools.shortcuts import buildNetwork

net = buildNetwork(1,
                   100, # number of hidden units
                   1,
                   bias = True,
                   hiddenclass = SigmoidLayer,
                   outclass = LinearLayer
                   )
#----------
# train
#----------
from pybrain.supervised.trainers import BackpropTrainer
trainer = BackpropTrainer(net, ds, verbose = True)
trainer.trainUntilConvergence(maxEpochs = 100)

#----------
# evaluate
#----------
import pylab
# neural net approximation
pylab.plot(xvalues,
           [ net.activate([x]) for x in xvalues ], linewidth = 2,
           color = 'blue', label = 'NN output')

# target function
pylab.plot(xvalues,
           yvalues, linewidth = 2, color = 'red', label = 'target')

pylab.grid()
pylab.legend()
pylab.show()

附带说明(因为在代码示例中有一个带有线性激活函数的隐藏层):在任何隐藏层中,线性函数都不有用,因为:

  • 该层输入端的权重形成一个线性变换
  • 激活函数是线性的
  • 输出端到该层的权重形成一个线性变换

它可以简化为一个单一的线性变换,也就是说,它们对应的层也可以被消除,而不必对可逼近的函数集进行任何简化。神经网络的一个重要特点是隐层中的激活函数是非线性的。

我想这里可能会发生一些事情。

首先,我建议使用与您使用的不同的层激活配置。特别是,对于初学者,尝试对网络中的隐藏层使用sigmoidal非线性,并对输出层使用线性激活。这是一个典型的监控网络的最常见的设置,应该可以帮助您开始。

我注意到的第二件事是,您的培训师中的weightDecay参数有一个相对较大的值(尽管什么构成“相对较大”取决于您的输入和输出值的自然比例)。对于初学者,我将删除该参数,或者将其值设置为0。权重衰减是一个正则化器,它有助于防止网络过度拟合,但如果您将该参数的值增加过多,则网络权重将很快全部变为0(然后网络的梯度基本上为0,因此学习将停止)。只有在培训期间验证数据集的性能开始下降时,才将weightDecay设置为非零值。

相关问题 更多 >

    热门问题