【问题标题】:Different Results Running 2 Keras Models Sequentially vs Separately依次运行 2 个 Keras 模型和分别运行 2 个 Keras 模型的不同结果
【发布时间】:2020-08-27 14:45:35
【问题描述】:

我有 2 个 Keras 模型 - GRU 和 LSTM - 我在 Jupyter Notebook 上运行。当然,除了它们使用的层之外,两者都有相同的实现——LSTM 与 GRU。这是我的代码:


# 1st Model - GRU

if run_gru:

    model_gru = Sequential()

    model_gru.add(CuDNNGRU(75, return_sequences=True, input_shape=(i1,i2)))
    model_gru.add(CuDNNGRU(units=30, return_sequences=True))
    model_gru.add(CuDNNGRU(units=30))
    model_gru.add(Dense(units=1, activation="sigmoid"))
    model_gru.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # optimizer="adam"

    history_gru = model_gru.fit(x, y, epochs = 200, batch_size = 64, validation_data = (x2, y2), shuffle = False, callbacks = [EarlyStopping(patience=100, restore_best_weights=True)])


# 2nd Model - LSTM

if run_lstm:

    model_lstm = Sequential()

    model_lstm.add(CuDNNLSTM(75, return_sequences=True, input_shape=(i1,i2)))
    model_lstm.add(CuDNNLSTM(units=30, return_sequences=True))
    model_lstm.add(CuDNNLSTM(units=30))
    model_lstm.add(Dense(units=1, activation="sigmoid"))
    model_lstm.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # optimizer="adam"

    history_lstm = model_lstm.fit(x, y, epochs = 200, batch_size = 64, validation_data = (x2, y2), shuffle = False, callbacks = [EarlyStopping(patience=100, restore_best_weights=True)])

这是我单独运行每个模型时的结果(即每次运行后重新启动内核):

  • run_gru = True; run_lstm = False -> GRU 的 val_acc = 58.13953%
  • run_gru = False; run_lstm = True -> LSTM 的 val_acc = 51.16279%

但是,如果我在 GRU 之后在同一内核运行期间立即运行 LSTM(即同时运行而不重新启动),我的结果现在如下:

  • run_gru = True; run_lstm = True -> GRU 的 val_acc = 58.13953%(与之前相同)但 LSTM 的 val_acc = 79.06977%(更好)

我想知道是否有人猜测为什么第二个模型(LSTM)现在具有更好的准确性,即使两者都是独立的模型。

我怀疑第二个模型窃取了第一个模型的结果,所以我去检查了两个模型在 epoch 1 的损失。我发现对于每个模型,epoch 1 的损失是相同的,这意味着 LSTM 没有窃取第一个模型 (GRU) 的权重/结果。此外,第二个模型的摘要表明它是一个全新的模型(即从第 1 层开始,而不是第 4 层)。我尝试将restore_best_weights 设置为False,但它仍然会导致模型2 的巨大差异。

我知道我可以单独运行每个,但我想在训练模型后将它们一起运行以执行进一步分析。此外,我可以保持原样并在 GRU 之后立即运行 LSTM,并使用 LSTM 来预测结果,但似乎我可能遗漏了一些非常明显的东西,导致了这些不同的结果。提前致谢!

【问题讨论】:

  • 你在GPU上训练模型时,每次权重都是随机初始化的,所以结果不能完美重现,你训练了多长时间?
  • 我设置了一个随机种子,这样无论我运行多少次,结果都是一致的。至于训练时间,每次大约需要5-15分钟。
  • 您能否使用虚拟数据重现相同的行为并添加可重现的脚本?如果是,那么值得一看,否则这可能只是一个随机训练问题。

标签: python tensorflow keras deep-learning lstm


【解决方案1】:

在做了一些research 之后,事实证明即使你在同一个内核运行中定义了 2 个不同的模型,来自第 2 个模型的层仍然会添加到第 1 个。这就是为什么当我运行第二个模型时,第 1 个时期的损失将始终相同,但最终结果会有所不同,因为第二个模型 = 来自第一个模型的层 + 来自第二个模型的层。

正如here 解释的那样,我应该使用K.clear_session() 删除旧的层/节点,以便每个模型都是一个新的开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多