【问题标题】:Looping Different Data Sets and Predicting with LSTM循环不同的数据集并使用 LSTM 进行预测
【发布时间】:2020-05-19 01:52:18
【问题描述】:

我已经在 keras、LSTM 上工作了一段时间,但还是相当新的。

我面临一个问题,每次我使用 keras LSTM 进行训练和预测时都需要重新启动 Jupyter Notebook。

当我需要使用相同的 LSTM 模型设置循环使用不同数据集的多个预测时,这会出现问题。

另一种方法是按数据集训练和预测数据集,每次预测完成后重新启动并运行,这将是一个非常繁琐的过程。

例如:

for i in ...: # Loop for different data set

    ...

    # Create LSTM Model
    model = Sequential()
    model.add(LSTM(units=32,
                   activation='relu',
                   batch_input_shape=(1, timestep_n, feature_n),
                   return_sequences=True))
    model.add(Dense(units=1, 
                    activation='relu'))
    model.compile(loss='mean_squared_error', optimizer=adam, metrics=['accuracy'])
    ...

    # Train Model
    model.fit(x, y, epochs=100)

    ...

    # Predict
    result = model.predict(x_p)

    # End Loop for next data set

我尝试在创建每个训练模型之前清除会话,但预测的值与我运行单个训练和预测时的值不同。

    session = tf.get_default_session()
    if session is not None:
        session.close()
    K.clear_session()
    gc.collect()

我还使用了随机种子,希望每次运行都能获得相同的值。为了一致性。

    SEED = 1
    np.random.seed(SEED)
    tf.set_random_seed(SEED)
    random.seed(SEED)

我正在考虑在每个循环中声明/创建一个“新”LSTM 模型来预测不同数据集的值,而无需手动重新启动笔记本并为每个数据集运行。

即使我在循环结束时执行del model,内存也没有被正确清除。

有人可以帮忙吗?

【问题讨论】:

  • 为什么要遍历 LSTM 模型?
  • 本质上是为了减少在代码的不同运行中加载不同数据集的手动工作量。我希望,在循环中,我可以重新启动一个 LSTM 模型来训练和预测不同数据集的值,在每个循环中启动一个“清洁状态”或“新”LSTM 模型,这样后续的数据集就不会在循环中的前一个模型之上进行训练。
  • 尝试构建一个模型函数,然后在每个循环调用函数model=MyModel(),然后你的所有model.compilemodel.fitmodel.predict,然后存储结果
  • 嗯...我试过了,但预测的结果还是一样。可能与 LSTM 状态在每个循环后没有被重置或某些东西保持内存有关。为什么旧模型的内存会影响新模型是没有意义的。设置 LSTM stateful = True,并不能解决这个问题,因为我也在使用 return_sequence = True。

标签: python keras jupyter-notebook lstm recurrent-neural-network


【解决方案1】:

你得到了什么:

for i in ...: # Loop for different data set

...

model = None
# Create LSTM Model
model = Sequential()
...

【讨论】:

  • 以单个数据集(ID:25)为例(不是实际的数据集编号),我有11个数字用于输入序列[35、37、42、36、36...24 ] 并且预期输出为 26 只需为这个单一数据集单独运行一个 LSTM 模型,它就会预测输出 29(无需清除 Keras Session)。但是一旦我把它放在一个循环中,其他 ID 在 ID:25 之前运行,输出预测为 33。清除 Keras 会话后,输出 31。
  • 但是如果我在循环中首先运行 ID:25,它将预测输出 29(不清除 Keras Session),但后续 ID 会有所不同。我确实理解这些数字在序列方面有点随机,因此是准确的。但我注意到,无论是否循环,清除 Keras 会话都会给我输出 31。抱歉我的措辞。
  • 我可能不理解你或API,但在每次迭代中你都添加到LSTM模型(model.add),那怎么可能一样呢?
  • model.summary() 在每个循环中为我提供了相同数量的层。即使我在循环结束时使用了 del 模型,结果也是一样的。我认为 model = Sequential() 应该启动一个新模型?如果是这样,我如何创建一个新模型?
  • 如果在每次迭代中定义模型之前按照答案中的建议进行操作:model = None 会发生什么?
猜你喜欢
  • 2018-09-24
  • 2021-10-17
  • 2020-09-29
  • 1970-01-01
  • 2017-09-14
  • 2021-09-15
  • 2019-11-29
相关资源
最近更新 更多