好吧,您需要一个
stateful=True模型,因此您可以将其一个接一个地提供给另一个预测,以获取下一个预测,并使模型始终认为每个输入不是新序列,而是前一个序列的后继。
修改代码和培训
我在代码中看到,有人试图让自己
y成为一个转变
x(预测下一步的好选择)。但是这里的预处理也存在一个大问题:
training_set = df_train.valuestraining_set = min_max_scaler.fit_transform(training_set)x_train = training_set[0:len(training_set)-1]y_train = training_set[1:len(training_set)]x_train = np.reshape(x_train, (len(x_train), 1, 1))
LSTM图层数据的形状必须为
(number_of_sequences, number_of_steps,features)。
因此,您显然只创建了1个步骤的序列,这意味着LSTM根本不学习序列。(没有一个步骤只有一个步骤)。
假设您的数据是具有1个功能的单个唯一序列,则其数据的形状肯定应为
(1, len(x_train), 1)。
自然,
y_train也应该具有相同的形状。
反过来,这将要求您的LSTM层是
return_sequences=True-逐步
y增加长度的唯一方法。另外,为了获得良好的预测,您可能需要一个更复杂的模型(因为现在这将是真正的学习)。
完成后,您将训练模型,直到获得满意的结果。
预测未来
为了预测未来,您将需要
stateful=TrueLSTM层。
首先,您需要重置模型的状态:
model.reset_states()-每次将新序列输入到有状态模型中时都必须这样做。
然后,首先预测整个过程
X_train(模型需要用它来理解它在序列的哪一点,用技术术语来说:创建状态)。
predictions = model.predict(`X_train`) #this creates states
最后,您创建一个循环,从先前预测的最后一步开始:
future = []currentStep = predictions[:,-1:,:] #last step from the previous predictionfor i in range(future_pred_count): currentStep = model.predict(currentStep) #get the next step future.append(currentStep) #store the future steps#after processing a sequence, reset the states for safetymodel.reset_states()
例
该代码使用2个特征的序列,移动的将来步长预测以及与此答案稍有不同但基于相同原理的方法来执行此 *** 作。
我创建了两个模型(一个
stateful=False用于训练而无需每次都需要重置状态-永远不要忘记在开始新序列时重置状态-
另一个
stateful=True用于从训练后的模型中复制权重以预测未来)
https://github.com/danmoller/TestRepo/blob/master/TestBookLSTM.ipynb
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)