3

我使用 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..

4

1 回答 1

2

pybrain sigmoidLayer 正在实现 sigmoid 压缩函数,您可以在此处看到:

sigmoid 压缩函数代码

相关部分是这样的:

def sigmoid(x):
""" Logistic sigmoid function. """
return 1. / (1. + safeExp(-x))

因此,无论 x 的值是多少,它都只会返回 0 到 1 之间的值。出于这个原因以及其他原因,将输入和输出值缩放到 0 到 1 之间是一个好主意。例如,将所有输入除以最大值(假设最小值不低于 0),输出也相同。然后对结果执行相反的操作(例如,如果您在开始时除以 25,则乘以 25)。

另外,我不是 pybrain 专家,但我想知道您是否需要 OUTPUTS = 4?看起来您的数据中只有一个输出,所以我想知道您是否可以只使用 OUTPUTS = 1。

您也可以尝试将输入和输出缩放到 sigmoid 曲线的特定部分(例如,在 0.1 和 0.9 之间)以使 pybrain 的工作更容易,但这会使缩放前后的缩放更加复杂。

于 2014-08-25T23:37:11.853 回答