不同的结果 运行 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)])
这是我分别 运行 每个模型时的结果(即在每个 运行 后重新启动内核):
run_gru = True; run_lstm = False
-> GRU 的 val_acc = 58.13953%
run_gru = False; run_lstm = True
-> LSTM 的 val_acc = 51.16279%
但是,如果我 运行 LSTM 在同一个内核 运行 之后紧跟在 GRU 之后(即 运行 两者都没有重新启动),我现在的结果如下:
run_gru = True; run_lstm = True
-> GRU 的 val_acc = 58.13953%(与之前相同)但 LSTM 的 val_acc = 79.06977%(更好)
我想知道是否有人猜到为什么第二个模型 (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,这样每个模型都是一个新的开始。
我有 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%
但是,如果我 运行 LSTM 在同一个内核 运行 之后紧跟在 GRU 之后(即 运行 两者都没有重新启动),我现在的结果如下:
run_gru = True; run_lstm = True
-> GRU 的 val_acc = 58.13953%(与之前相同)但 LSTM 的 val_acc = 79.06977%(更好)
我想知道是否有人猜到为什么第二个模型 (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,这样每个模型都是一个新的开始。