【问题标题】:Pybrain - lstm sequence bad predictionsPybrain - lstm 序列错误预测
【发布时间】:2015-07-22 09:25:08
【问题描述】:

你好,

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

[ 0, 0.66 , 0 ,0.66 ,0 ,0 ,0 ,0.55 ,0 ,0 ,0 ,3.18 ,0 ,0 ,2 ,0.6 ,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 左右。我应该如何调整我的网络以获得好的结果?

谢谢

【问题讨论】:

    标签: python neural-network sequence pybrain lstm


    【解决方案1】:

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

    来接近 0 而不是 0.1
    EPOCHS_PER_CYCLE = 5
    

    CYCLES = 50 
    

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

    【讨论】:

    • 在改变周期或纪元时仍然得到 0.1 值:/
    • 包括其他结果在内的确切输出是什么?
    • 这是我的火车:pastebin.com/ejWxbLrG 这是输出:pastebin.com/HxtCy3fT 抱歉,我没有找到更好的方式来展示您
    • 所以我认为你必须将一个标准化的输入数据传递给学习者,这样它的值应该在 0 和 1 之间。
    • 对不起,它没有改善输出。我认为 lstm 不是解决这类问题的正确模型。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 2014-08-27
      • 2018-09-22
      • 2021-04-21
      • 1970-01-01
      • 2018-11-16
      • 2019-07-01
      • 2017-05-28
      相关资源
      最近更新 更多