Keras: 最佳的epoch选择

6

我正在尝试编写一些逻辑,以选择在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 应该选择损失值最低的模型,但它必须高于训练损失值,以避免过拟合。
总的来说,这种 epoch 选择方法效果还不错。然而,如果测试损失值从一开始就低于训练损失,那么这种方法会选择零 epoch(见下文)。
现在我可以添加另一个 if 语句来评估测试损失和训练损失之间的差异是正还是负,然后针对每种情况编写逻辑,但是如果差异开始是正的,然后变成负的会发生什么?我感到困惑,没有能够编写有效的代码。
因此,我的问题是:
1)您能否向我展示您将编写哪些代码来解决图中显示的情况(以及测试损失和训练损失曲线相交的情况)。我认为策略是选择具有最小差异的值。

2) 我很可能走了错误的路。我知道Keras有一个回调特性,但我不喜欢使用save_best_only功能,因为它可能会保存过拟合的模型。对于更有效的时期选择方法有什么建议吗?


4
我相信您直觉上正在寻找“提前停止”的概念。有关此概念在Keras中的另一篇文章在此处,您可能需要查看patience参数。 - cdeterman
@cdeterman 非常有趣的链接。这可能正是我正在寻找的东西。我会去看看,如果有任何问题,我会回来问你的。 - Agrippa
2个回答

4

使用Keras中提供的EarlyStopping功能。 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)

请参考此链接获取更多信息。


3

以下是一个简单的示例,演示如何在Keras中使用早停法:



最初的回答
  • First necessarily import:

    from keras.callbacks import EarlyStopping, ModelCheckpoint
    
  • Setup Early Stopping

    # 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)]
    
  • Train neural network

    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
    

请查看完整示例此处

还请查看:当网络完全收敛时停止Keras训练;Daniel的最佳答案。

“Original Answer”翻译成中文是“最初的回答”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接