【问题标题】:Keras model not saving correctlyKeras 模型未正确保存
【发布时间】:2019-03-14 09:25:48
【问题描述】:

我正在 Keras 中训练一个神经网络,但是当新数据出现并且我尝试重新训练它时,它在 epochs 中的损失与我第一次训练我的模型时一样高。

 checkpoint = ModelCheckpoint('my_model.h5', monitor='loss', verbose=1, save_best_only=True, mode='min')
 callbacks_list = [checkpoint]
 model.fit(X_train,y_train, batch_size = batch_size, epochs = epochs, callback = callbacks_list)
 new_model = load_model('my_model.h5')

正如这里Keras: How to save model and continue training? 所建议的那样,我尝试在modelnew_model 中预测相同的数据,并使用以下方法测量差异:

assert_allclose(model.predict(x_train),
            new_model.predict(x_train),
            1e-5)

事实上,我得到了断言错误,我什至使用了tol = 1e-2,这让我觉得我的模型没有按应有的方式加载。任何人都知道为什么会发生这种情况?

【问题讨论】:

  • 我假设从模型检查点加载时函数load_model() 不正确。它只存储模型的权重。尝试使用load_weights() 加载权重。 Example
  • 据我所知,如果你不输入save_weights_only = True,整个模型都会被保存,至少 Keras 文档是这么说的。

标签: python tensorflow keras


【解决方案1】:

ModelCheckpoint 保存在训练中损失较少的模型权重。

您的model 已保存最后一个时期的权重。

如果您的模型的最后一个 epoch 不是损失较少的那个,则保存的模型 (new_model) 的权重与原始模型的权重不匹配,并且预测不一样。

【讨论】:

  • 好的,有道理。但是,当我重新训练我的模型时,似乎即使重新训练中的损失更高,模型也会更新,这不应该发生,对吧?任何线索为什么会发生?
  • 如果你想保存最后一个epoch,不要在你的model.fit中调用回调model.fit(X_train,y_train, batch_size = batch_size, epochs = epochs),而是使用model.save('my_model.h5')
  • 抱歉,我自己可能没有解释清楚。我想保存最好的时期,并用那个时期重新训练我的模型,但如果损失没有改善,我不想更新我保存的前一个时期。
  • 我不知道这是否可能。您可以手动更改已保存模型的名称,例如 my_model1.h5、my_model2.h5 ... 然后通过 result = model.evaluate(x=x_train,y=y_train)print("{0}: {1:.2%}".format(model.metrics_names[1], result[1])) 检查最佳模型 acc
猜你喜欢
  • 2020-06-20
  • 2020-05-28
  • 1970-01-01
  • 2015-04-14
  • 2013-11-23
  • 2018-03-02
  • 2019-01-26
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多