使用pybrain进行神经网络回归

Alb*_*o A 9 python regression machine-learning neural-network pybrain

我需要解决前馈网络的回归问题,并且我一直在尝试使用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
Run Code Online (Sandbox Code Playgroud)

接下来,是运行回归的功能.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
Run Code Online (Sandbox Code Playgroud)

当我打印res时,它的所有值都是0.我已经尝试使用buildNetwork函数作为构建网络的快捷方式,但它不能正常工作.我还在隐藏层中尝试了不同类型的层和不同数量的节点,没有运气.

有人知道我做错了什么吗?此外,一些pybrain回归示例真的会有所帮助!我看的时候找不到任何东西.

提前致谢

pio*_*kuc 5

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

通过可选的在线进度图,学习数字预测一组数据的目标.

所以它似乎非常适合为你的回归任务构建一个神经网络.


And*_*ner 5

正如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()
Run Code Online (Sandbox Code Playgroud)

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

  • 该层输入侧的权重形成线性变换
  • 激活功能是线性的
  • 在该层的输出侧的权重形成线性变换

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