【发布时间】: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