【发布时间】: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这样的范围内。另外,我不确定线性隐藏层的目的是什么(如发布的代码中所示),这通常可以吸收到下一层的权重中。 -
我知道这是一个老问题,但我只是想知道你是否解决了你的问题,如果解决了,你能分享一下吗?
标签: python machine-learning neural-network regression pybrain