使用 pybrain 进行神经网络回归

Posted

技术标签:

【中文标题】使用 pybrain 进行神经网络回归【英文标题】:neural networks regression using pybrain 【发布时间】:2013-05-28 14:40:41 【问题描述】:

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

第一个函数将我的 numpy 数组形式的数据转换为 pybrain SupervisedDataset。我使用 SupervisedDataset 是因为根据 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。我尝试使用 buildNetwork 函数作为构建网络的快捷方式,但效果不佳。我还尝试了隐藏层中不同类型的层和不同数量的节点,但没有成功。

有人知道我做错了什么吗?此外,一些 pybrain 回归示例真的很有帮助!我看的时候找不到。

提前致谢

【问题讨论】:

如果您对神经网络感兴趣,可以考虑加入机器学习网站:area51.stackexchange.com/proposals/41738/machine-learning 很确定你希望输出层是线性回归——你可能还想使用 sigmoidal/tanh 隐藏单元 严格来说不一定是线性的,但它最不是一个激活,其输出限制在0..1 这样的范围内。另外,我不确定线性隐藏层的目的是什么(如发布的代码中所示),这通常可以吸收到下一层的权重中。 我知道这是一个老问题,但我只是想知道你是否解决了你的问题,如果解决了,你能分享一下吗? 【参考方案1】:

pybrain.tools.neuralnets.NNregression是一个工具

学习以数值方式预测一组数据的目标,其中 可选的在线进度图。

所以它似乎非常适合为您的回归任务构建神经网络。

【讨论】:

【参考方案2】:

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

首先,我建议您使用与您所使用的不同的层激活配置。特别是,对于初学者,尝试对网络中的隐藏层使用 sigmoidal 非线性,对输出层使用线性激活。这是迄今为止典型受监督网络最常见的设置,应该可以帮助您入门。

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

【讨论】:

【参考方案3】:

正如 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()

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

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

可以简化为一个单一的线性变换,即它们对应的层也可以被消除,而不会减少可以近似的函数集。神经网络的一个重要点是激活函数在隐藏层中是非线性的。

【讨论】:

【参考方案4】:

正如 Andre Holzner 所解释的,隐藏层应该是非线性的。 Andre 的代码示例很棒,但是当您拥有更多功能而没有那么多数据时,它就无法正常工作。在这种情况下,由于隐藏层很大,我们得到了很好的近似值,但是当您处理更复杂的数据时,仅输出层中的线性函数是不够的,您应该对特征进行归一化并且目标在 [0..1] 范围内.

【讨论】:

以上是关于使用 pybrain 进行神经网络回归的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyBrain 进行神经网络训练不会收敛

数据挖掘入门系列教程之使用神经网络(基于pybrain)识别数字手写集MNIST

PyBrain - 如何根据测试数据验证我训练有素的网络?

如何使用 pybrain 黑盒优化训练神经网络以监督数据集?

训练 LSTM 神经网络以预测 pybrain、python 中的时间序列

python 利用pybrain库实现的BP神经网络 算法 不会画收敛图 求助