首页 文章

Pybrain - lstm序列坏预测

提问于
浏览
1

嗨,

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

[0,0.66,0,0.66,0,0,0,5,0,0,0,0,1,18,0,0,0,0,0,0,0]

我在python中的代码与以下代码相同:

Pybrain time series prediction using LSTM recurrent nets

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 . 我应该如何调整我的网络以获得良好的结果?

谢谢

2 回答

  • 0

    到目前为止,我对 Pybrain 没有任何经验 - 但是我使用了许多类似的ML包 - 但是我看到这是一个 regression 任务而不是 classification . 因此,网络永远不会提供0作为结果,但它将提供越来越接近0或任何所需的序列成员的结果 . 因此,随着增加,你可以接近0而不是0.1

    EPOCHS_PER_CYCLE = 5
    

    要么

    CYCLES = 50
    

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

  • 0

    众所周知,神经网络是通用的拨款者,并且给定数据集将尝试创建将尽可能最好地表示数据集的内部状态 . 本质上是试图通过复杂的公式复制数据中的模式 .

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

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

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

    注意:我不确定你的训练方法中有什么“循环”和“epochspercycle” . 看起来你正在训练几个时代汇总错误,然后进入一个新的循环 . 而不是为每个纪元运行一次数据集并输出平均错误 .

相关问题