我使用 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 的输出..
最佳答案
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 的工作更容易,但这会使前后缩放有点复杂。
关于sequence - 用于预测顺序数据的 pybrain LSTM 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25439910/