Keras:最佳时期选择

Posted

技术标签:

【中文标题】Keras:最佳时期选择【英文标题】:Keras: Optimal epoch selection 【发布时间】:2018-05-05 10:32:38 【问题描述】:

我正在尝试编写一些逻辑来选择最佳时期来在 Keras 中运行神经网络。我的代码保存了一组时期的训练损失和测试损失,然后根据一些逻辑选择最合适的时期。代码如下所示:

ini_epochs = 100

df_train_loss = DataFrame(data=history.history['loss'], columns=['Train_loss']); 
df_test_loss = DataFrame(data=history.history['val_loss'], columns=['Test_loss']);
df_loss = concat([df_train_loss,df_test_loss], axis=1)

Min_loss = max(df_loss['Test_loss'])
for i in range(ini_epochs):
    Test_loss = df_loss['Test_loss'][i];
    Train_loss = df_loss['Train_loss'][i]; 
    if Test_loss >  Train_loss and Test_loss < Min_loss:
        Min_loss = Test_loss;

逻辑背后的想法是这样的;为了得到最好的模型,所选择的epoch应该选择损失值最低的模型,但必须高于训练损失值以避免过拟合。

一般来说,这种历元选择方法工作正常。但是,如果测试损失值从一开始就低于训练损失,则此方法选择一个为零的时期(见下文)。

现在我可以添加另一个 if 语句来评估测试和火车损失之间的差异是正还是负,然后为每种情况编写逻辑,但是如果差异开始为正然后最终为负,会发生什么情况。我很困惑,无法编写有效的代码。

所以,我的问题是:

1) 你能告诉我你将如何编写什么代码来解释图表中显示的情况(以及测试和训练损失曲线交叉的情况)。我会说策略是以最小差异取值。

2) 我很有可能会走错路。我知道 Keras 有回调功能,但我不喜欢使用 save_best_only 功能的想法,因为它可以保存过度拟合的模型。任何关于更有效的时代选择方法的建议都会很棒。

【问题讨论】:

相信您在直觉上寻找“提前停止”的概念。关于 Keras 这个概念的另一篇文章是here,您可能会在其中查看patience 参数。 @cdeterman 非常有趣的链接。这可能正是我正在寻找的。如果我有任何问题,会检查出来给你。 【参考方案1】:

使用 Keras 中提供的 EarlyStopping。早期停止基本上是在您的损失开始增加(或者换句话说验证准确性开始降低)时停止训练。使用 ModelCheckpoint 将模型保存在您想要的任何位置。

from keras.callbacks import EarlyStopping, ModelCheckpoint

STAMP = 'simple_lstm_glove_vectors_%.2f_%.2f'%(rate_drop_lstm,rate_drop_dense)
early_stopping =EarlyStopping(monitor='val_loss', patience=5)
bst_model_path = STAMP + '.h5'
model_checkpoint = ModelCheckpoint(bst_model_path, save_best_only=True, save_weights_only=True)

hist = model.fit(data_train, labels_train, \
        validation_data=(data_val, labels_val), \
        epochs=50, batch_size=256, shuffle=True, \
         callbacks=[early_stopping, model_checkpoint])

model.load_weights(bst_model_path)

请参阅此link 了解更多信息

【讨论】:

【参考方案2】:

这里有一个简单的例子来说明如何在 Keras 中使用 early sooping:

首先必须导入:

from keras.callbacks import EarlyStopping, ModelCheckpoint

设置提前停止

# Set callback functions to early stop training and save the best model so far
callbacks = [EarlyStopping(monitor='val_loss', patience=2),
         ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)]

训练神经网络

history = network.fit(train_features, # Features
                  train_target, # Target vector
                  epochs=20, # Number of epochs
                  callbacks=callbacks, # Early stopping
                  verbose=0, # Print description after each epoch
                  batch_size=100, # Number of observations per batch
                  validation_data=(test_features, test_target)) # Data for evaluation

查看完整示例 here。

另请查看:Stop Keras Training when the network has fully converge;丹尼尔的最佳答案。

【讨论】:

以上是关于Keras:最佳时期选择的主要内容,如果未能解决你的问题,请参考以下文章

keras 模型上的特征选择

“金三银四” 是找工作的最佳时期吗?

“金三银四”是找工作的最佳时期吗?那倒未必

优化最佳特征的数量

Keras,在每个时期获取一层的输出

Keras 中的 TensorBoard 回调不尊重适合的初始时期?