当前位置: 首页 > 面试题库 >

如何使用Keras RNN模型预测未来的日期或事件?

融焕
2023-03-14
问题内容

这是我训练完整模型并保存它的代码:

num_units = 2
activation_function = 'sigmoid'
optimizer = 'adam'
loss_function = 'mean_squared_error'
batch_size = 10
num_epochs = 100

# Initialize the RNN
regressor = Sequential()

# Adding the input layer and the LSTM layer
regressor.add(LSTM(units = num_units, activation = activation_function, input_shape=(None, 1)))

# Adding the output layer
regressor.add(Dense(units = 1))

# Compiling the RNN
regressor.compile(optimizer = optimizer, loss = loss_function)

# Using the training set to train the model
regressor.fit(x_train, y_train, batch_size = batch_size, epochs = num_epochs)
regressor.save('model.h5')

之后,我看到大多数时候人们都建议我们使用测试数据集来检查预测,这也是我尝试过并获得良好结果的结果。

但是问题出在我创建的模型的使用上。我想对未来30天或每分钟的天气预报。现在,我拥有训练有素的模型,但是无法获得所能做的事情或使用什么代码来使用该模型并无法预测未来30天或一分钟的价格。

请给我建议出路。一个星期以来,我一直在解决这个问题,无法进行任何成功的尝试。

这是存储库的链接,可以在其中找到完整的可运行代码,模型和数据集:
我的html" target="_blank">存储库链接


问题答案:

好吧,您需要一个stateful=True模型,因此您可以将其一个接一个地提供给另一个预测,以获取下一个预测,并使模型始终认为每个输入不是新序列,而是前一个序列的后继。

修改代码和培训

我在代码中看到,有人试图让自己y成为一个转变x(预测下一步的好选择)。但是这里的预处理也存在一个大问题:

training_set = df_train.values
training_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 prediction

for 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 safety
model.reset_states()

该代码使用2个特征的序列,移动的将来步长预测以及与此答案稍有不同但基于相同原理的方法来执行此操作。

我创建了两个模型(一个stateful=False用于训练而无需每次都需要重置状态-永远不要忘记在开始新序列时重置状态-
另一个stateful=True用于从训练后的模型中复制权重以预测未来)

https://github.com/danmoller/TestRepo/blob/master/TestBookLSTM.ipynb



 类似资料:
  • 我有一个在AWS Lambda上运行的基于微服务的应用程序。其中两个微服务,最关键的,使用事件源/cqrs。 背景:(这也是我整理思想的地方) 我正在使用这个库并将事件存储在DynamoDB中,并将预测存储在AWS S3中。 写入部分的工作方式很有魅力:每个命令调用都从DynamoDB加载聚合的当前状态(通过处理程序运行事件和/或加载缓存的聚合),它根据一些业务逻辑决定接受或拒绝命令,然后使用键条

  • 我没有使用任何日期选择器仍然代码工作正常。我已经选择了输入类型日期和一切工作正常。现在我想禁用未来的日期。我该怎么做呢? 编辑:通过其他方式解决问题 我用过日期选择器 它是如此容易实现。只需安装npm包 同时安装力矩传感器 导入库 在构造函数中 dateChange函数 最后是渲染函数 这里使用maxDate函数来禁用未来的日期。 资料来源:https://www.npmjs.com/packag

  • 例如,使用我训练的模型来预测未来的数据。也可能是随机/自定义范围。假设我想预测2017年的逐日降雨数据。或者得到25-02-2017的预测数据。也可能是数据集结束后的X天的数据。

  • 问题内容: 我有一个使用Keras和Tensorflow作为后端训练的模型,但是现在我需要将我的模型转换为特定应用程序的张量流图。我尝试执行此操作并进行了预测以确保其正常工作,但是与从model.predict()收集的结果进行比较时,我得到了非常不同的值。例如: 返回: keras预测的值是正确的,但tf图的结果却不正确。 如果它有助于了解最终的预期应用程序,那么我将使用tf.gradients

  • 问题内容: 我正在尝试将“ dd-MM-yy”格式解析为对象。问题在于它试图猜测日期的世纪。 如果从01到31指定,年份将解释为2000年代(21世纪),而32 t0 99被认为是1900年代(20世纪)。 谁能帮我?我该如何指定我只能整洁地工作在21世纪。我并没有完全尝试根据条件来处理诸如操作字符串或更改日期之类的技巧。 问题答案: 您可以使用方法更改用于解释2位数据输入的世纪。 将于2040年

  • 在我们的组织中,我们有一些微服务和许多库。 有些库定义的“public”类不用于公共用途-仅在多个包中的库内部(因此不能是包私有的) 我想添加一些类似于Kotlin的“内部”修饰符的内容—一个checkstyle规则/注释处理器/测试组件,用于验证使用者应用程序是否不导入这些类。 例如,我将它们标记为@ForInternalUsageOnly或放入包com.ourorg.mylib.interna