Keras LSTM输入 - 预测抛物线轨迹

时间:2017-11-02 15:50:39

标签: deep-learning keras lstm recurrent-neural-network keras-layer

我想预测球落下的轨迹。那条轨迹是抛物线的。我知道LSTM对此可能太多了(即更简单的方法就足够了)。 我认为我们可以在最后使用2个LSTM图层和一个Dense图层。

我想要的最终结果是给模型3高度h0,h1,h2并让它预测h3。然后,我想给它h1,h2和先前输出的h3来预测h4,依此类推,直到我可以预测整个轨迹。

首先,第一个LSTM层的输入形状是什么? 它是input_shape =(3,1)吗? 其次,LSTM是否能够预测抛物线路径?

我几乎是一条扁平线,而不是抛物线,我想排除我误解如何喂食和塑造输入的可能性。

谢谢

1 个答案:

答案 0 :(得分:2)

输入形状的格式为(samples, timeSteps, features)

您唯一的功能是“身高”,所以features = 1 由于您要输入不同长度的序列,因此可以使用timeSteps = None

因此,您的input_shape可能是(None, 1) 由于我们将在下面使用stateful=True图层,因此我们可以使用batch_input_shape=(1,None,1)。选择所需的“样本”数量。

您的模型确实可以预测轨迹,但可能需要不止一层。 (关于有多少层和单元取决于知道LSTM内部匹配如何工作的确切答案。)

培训

现在,首先你需要训练你的网络(只有这样才能开始预测好事)。

对于训练,假设您有一个[h1,h2,h3,h4,h5,h6...]序列,正确序列中的真值。 (我建议你实际上有很多序列(样本),所以你的模型学得更好)。

对于此序列,您希望输出预测下一步,然后您的目标将为[h2,h3,h4,h5,h6,h7...]

因此,假设您有一个data数组,其形状为(manySequences, steps, 1),您可以:

x_train = data[:,:-1,:]    
y_train = data[:,1:,:]

现在,您的图层应该使用return_sequences=True。 (每个输入步骤都会产生一个输出步骤)。然后用这些数据训练模型。

此时,无论您使用stateful=True还是stateful=False都不是很相关。 (但如果是真的,那么在每个纪元和序列之前总是需要model.reset_state()

<强>测算:

对于预测,您可以在模型中使用stateful=True。这意味着当您输入h1时,它将生成h2。当您输入h2时,它会记住“当前速度”(模型的state)以预测正确的h3

(在训练阶段,有这个并不重要,因为你一次输入整个序列。所以在长序列的步骤之间理解速度)。

您可以将方法reset_states()设为set_current_speed_to(0)。只要您要输入的步骤是序列中的第一步,您就会使用它。

然后你可以做这样的循环:

model.reset_states() #make speed = 0
nextH = someValueWithShape((1,1,1))  

predictions = [nextH]

for i in range(steps):
    nextH = model.predict(nextH)    
    predictions.append(nextH)

an example here,但使用了两个功能。不同之处在于我使用了两个模型,一个用于培训,一个用于预测,但您只能使用return_sequences=Truestateful=True一个模型(开始时不要忘记reset_states()每个时代的训练)。