在 keras 中保存最佳模型

Posted

技术标签:

【中文标题】在 keras 中保存最佳模型【英文标题】:Saving best model in keras 【发布时间】:2018-06-25 09:22:46 【问题描述】:

我在 keras 中训练模型时使用以下代码

from keras.callbacks import EarlyStopping

model = Sequential()
model.add(Dense(100, activation='relu', input_shape = input_shape))
model.add(Dense(1))

model_2.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])


model.fit(X, y, epochs=15, validation_split=0.4, callbacks=[early_stopping_monitor], verbose=False)

model.predict(X_test)

但最近我想获得最好的训练模型,因为我正在训练的数据在“高 val_loss vs epochs”图中给出了很多峰值,我想使用模型中最好的模型。

有什么方法或功能可以帮助解决这个问题吗?

【问题讨论】:

【参考方案1】:

EarlyStopping 和 ModelCheckpoint 是您需要的 Keras 文档。

您应该在 ModelCheckpoint 中设置save_best_only=True。如果需要任何其他调整,都是微不足道的。

只是为了帮助您更多,您可以查看here on Kaggle的用法。


如果上面的 Kaggle 示例链接不可用,请在此处添加代码:

model = getModel()
model.summary()

batch_size = 32

earlyStopping = EarlyStopping(monitor='val_loss', patience=10, verbose=0, mode='min')
mcp_save = ModelCheckpoint('.mdl_wts.hdf5', save_best_only=True, monitor='val_loss', mode='min')
reduce_lr_loss = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=7, verbose=1, epsilon=1e-4, mode='min')

model.fit(Xtr_more, Ytr_more, batch_size=batch_size, epochs=50, verbose=0, callbacks=[earlyStopping, mcp_save, reduce_lr_loss], validation_split=0.25)

【讨论】:

能否在此处附上示例?如果链接断开,答案将变得无用 因为 ReduceLROnPlateau 我得到了Keyerror: 'lr' 。为什么?? @NeerajKumar:请阅读realpython.com/python-keyerror 和tensorflow.org/api_docs/python/tf/keras/callbacks/…。如果阅读这些文档对您没有帮助,请发布一个单独的问题以及导致错误的代码部分。【参考方案2】:

EarlyStoppingrestore_best_weights 参数可以解决问题:

restore_best_weights:是否从监测量的最佳值的epoch恢复模型权重。如果为False,则使用训练最后一步得到的模型权重。

所以不确定您的early_stopping_monitor 是如何定义的,但是使用所有默认设置并看到您已经导入了EarlyStopping,您可以这样做:

early_stopping_monitor = EarlyStopping(
    monitor='val_loss',
    min_delta=0,
    patience=0,
    verbose=0,
    mode='auto',
    baseline=None,
    restore_best_weights=True
)

然后就像你已经做的那样,用callbacks=[early_stopping_monitor] 打电话给model.fit()

【讨论】:

这是正确的答案。其他答案票数较多的原因,可能是因为restore_best_weights已经在2018年10月发布的Keras 2.2.3中引入,即在this answer之后。 Man...Keras 只是简单了! 当它没有设法提前停止但完成所有时期时,它是否仍会恢复最佳权重【参考方案3】:

我猜model_2.compile 是一个错字。 如果您想将最佳模型 w.r.t 保存到 val_losses,这应该会有所帮助 -

checkpoint = ModelCheckpoint('model-epoch:03d-acc:03f-val_acc:03f.h5', verbose=1, monitor='val_loss',save_best_only=True, mode='auto')  

model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

model.fit(X, y, epochs=15, validation_split=0.4, callbacks=[checkpoint], verbose=False)

【讨论】:

以上是关于在 keras 中保存最佳模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GridSearch 保存具有最佳参数的 Keras 模型

tf.keras 如何保存 ModelCheckPoint 对象

如果 Keras 结果不可重现,那么比较模型和选择超参数的最佳做法是啥?

keras 中像素级二进制分类的最佳损失函数

Keras:最佳时期选择

在 PyTorch 中保存训练模型的最佳方法是啥? [关闭]