您好,
我的序列看起来像那样(加上更多的零):
[ 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。我应该如何调整我的网络以获得良好的结果?
谢谢
答案 0 :(得分:0)
到目前为止,我对Pybrain
没有任何经验 - 但是我使用了许多类似的ML包 - 但我认为这是一个回归任务,而不是分类即可。因此,网络永远不会提供0作为结果,但它将提供越来越接近0或任何所需的序列成员的结果。
所以你可以通过增加
EPOCHS_PER_CYCLE = 5
或
CYCLES = 50
可能你会达到0.01,然后是0.0025,依此类推。 如果您对此任务有进一步的经验,请写信给我。
答案 1 :(得分:0)
众所周知,神经网络是普遍适用者,并且给定数据集将尝试创建一个尽可能最好地表示数据集的内部状态。本质上是试图通过复杂的公式复制数据中的模式。
神经网络不会完全预测零,因为它是在连续尺度上工作而不是整数尺度。此外,它很可能平均预测为0.1,因为你的大多数目标都是0,而其余的都略微正向,将激活的输出偏向正值。
如果您想调整网络,我建议您从训练中保留一些最后的值,并使用一些作为验证集来查找正确数量的训练时期和隐藏节点。使用最后一个值作为测试集,可以很好地估计泛化误差。
目前,您似乎正在对相同的数据进行培训和测试,如果您想在序列中预测更多结果,则会对未来错误进行极具误导性的估算。
注意:我不确定"循环"和" epochspercycle"在你的训练方法。看起来你正在训练几个时代汇总错误,然后进入一个新的循环。而不是为每个纪元运行一次数据集并输出平均错误。