我使用pybrain编写了一个简单的代码来预测简单的顺序数据。 例如,0,1,2,3,4的序列将从网络获得5的输出。数据集指定剩余序列。 以下是我的代码实现
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SequentialDataSet
from pybrain.structure import SigmoidLayer, LinearLayer
from pybrain.structure import LSTMLayer
import itertools
import numpy as np
INPUTS = 5
OUTPUTS = 1
HIDDEN = 40
net = buildNetwork(INPUTS, HIDDEN, OUTPUTS, hiddenclass=LSTMLayer, outclass=LinearLayer, recurrent=True, bias=True)
ds = SequentialDataSet(INPUTS, OUTPUTS)
ds.addSample([0,1,2,3,4],[5])
ds.addSample([5,6,7,8,9],[10])
ds.addSample([10,11,12,13,14],[15])
ds.addSample([16,17,18,19,20],[21])
net.randomize()
trainer = BackpropTrainer(net, ds)
for _ in range(1000):
print trainer.train()
x=net.activate([0,1,2,3,4])
print x
我的屏幕上的输出每次都会显示[0.99999999 0.99999999 0.9999999 0.99999999]。我错过了什么?训练不够吗?因为trainer.train()
显示输出86.625 ..
答案 0 :(得分:2)
pybrain sigmoidLayer正在实现sigmoid压缩功能,你可以在这里看到:
sigmoid squashing function code
相关部分是:
def sigmoid(x):
""" Logistic sigmoid function. """
return 1. / (1. + safeExp(-x))
因此,无论x的值是多少,它都只会返回0到1之间的值。因此,对于其他人来说,最好将输入和输出值缩放到0到1之间。例如,将所有输入除以最大值(假设最小值不小于0),输出相同。然后用结果反过来(例如,如果你在开头除以25则乘以25)。
另外,我不是pybrain的专家,但我想知道你是否需要OUTPUTS = 4?看起来您的数据中只有一个输出,所以我想知道您是否可以使用OUTPUTS = 1.
您也可以尝试将输入和输出缩放到S形曲线的特定部分(例如介于0.1和0.9之间),以使pybrain的工作更容易,但这会使得缩放前后的缩放更复杂一些