不同的结果 运行 2 个 Keras 模型顺序 vs 单独

Different Results Running 2 Keras Models Sequentially vs Separately

我有 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)])

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

但是,如果我 运行 LSTM 在同一个内核 运行 之后紧跟在 GRU 之后(即 运行 两者都没有重新启动),我现在的结果如下:

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

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

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

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

here所述,我应该使用K.clear_session()删除旧的layers/nodes,这样每个模型都是一个新的开始。