1

你好,

我有一个看起来像这样的序列(加上更多的零):

[ 0, 0.66 , 0 ,0.66 ,0 ,0 ,0 ,0.55 ,0 ,0 ,0 ,3.18 ,0 ,0 ,2 ,0.6 ,0]

我在 python 中有以下代码,其方式与:

使用 LSTM 循环网络的 Pybrain 时间序列预测

from pybrain.datasets import SequentialDataSet
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import LSTMLayer
from pybrain.supervised import RPropMinusTrainer
from itertools import cycle

ds = SequentialDataSet(1, 1)
for sample, next_sample in zip(train, cycle(train[1:])):
    ds.addSample(sample, next_sample)

net = buildNetwork(1, 5, 1, hiddenclass=LSTMLayer, outputbias=False, recurrent=True)
trainer = RPropMinusTrainer(net, dataset=ds)
train_errors = [] 
EPOCHS_PER_CYCLE = 5
CYCLES = 50
EPOCHS = EPOCHS_PER_CYCLE * CYCLES
for i in range(CYCLES):
    trainer.trainEpochs(EPOCHS_PER_CYCLE)
    train_errors.append(trainer.testOnData())
    epoch = (i+1) * EPOCHS_PER_CYCLE
    print("\r epoch {}/{}".format(epoch, EPOCHS), end="")
    stdout.flush()

在训练集上获得预测:

res=[]
for sample, target in ds.getSequenceIterator(0):
   r=net.activate(sample)
   res.append(r)

然后我注意到网络从不预测零,总是在 0.10 左右。我应该如何调整我的网络以获得良好的结果?

谢谢

4

2 回答 2

0

众所周知,神经网络是通用的占有者,并且给定一个数据集将尝试创建一个内部状态,该状态将尽可能地代表该数据集。本质上是试图通过一个复杂的公式来复制数据中的模式。

神经网络不会准确地预测你为零,因为它是在连续尺度而不是整数尺度上工作。此外,它很可能平均预测为 0.1,因为您的大多数目标为 0,而其余目标则略微为正,使激活的输出偏向正。

如果你想调整你的网络,我建议你从训练中保留一些最后的值,并使用一些作为验证集来找到正确数量的训练时期和隐藏节点。同时使用最后的值作为测试集来很好地估计泛化误差。

目前,您似乎正在对相同的数据进行训练和测试,如果您想预测序列中的更多结果,这会给您对未来错误的极具误导性的估计。

注意:我不确定您的训练方法中的“循环”和“epochspercycle”是什么。似乎您正在训练几个时期来汇总错误,然后进入新的循环。与在每个时期运行一次数据集并输出平均误差相反。

于 2015-10-14T14:06:25.010 回答
0

Pybrain到目前为止,我没有任何经验——但是我使用许多类似的 ML 包——但我认为这是一项回归任务而不是分类。因此,网络永远不会提供 0 作为结果,但它会提供越来越接近 0 或序列中任何所需成员的结果。所以你可以通过增加比 0.1 更接近 0

EPOCHS_PER_CYCLE = 5

或者

CYCLES = 50 

可能你会达到 0.01,然后是 0.0025,依此类推。如果您对此任务有进一步的经验,请写信给我。

于 2015-07-22T09:53:22.897 回答