我已经用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的输出。
发布于 2014-08-26 07:37:12
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方面的专家,但我想知道您是否需要输出= 4?看起来您的数据中只有一个输出,所以我想知道您是否可以只使用output = 1。
您还可以尝试将输入和输出缩放到sigmoid曲线的特定部分(例如,在0.1和0.9之间),以使pybrain的工作更容易,但这会使缩放前后的缩放稍微复杂一些。
https://stackoverflow.com/questions/25439910
复制相似问题