Keras:最佳时代选择

时间:2017-11-21 20:16:56

标签: callback neural-network keras

我正在尝试编写一些选择最佳纪元的逻辑来运行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;

逻辑背后的想法是这样的;为了获得最佳模型,选择的时期应选择具有最低损失值的模型,但必须高于训练损失值以避免过度拟合。

一般来说,这个纪元选择方法正常。但是,如果测试损失值从一开始就低于火车损失,那么这种方法选择零时期(见下文)。 enter image description here

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

所以,我的问题是:

1)你能告诉我你要写什么代码来解释图中显示的情况(以及测试和火车损失曲线交叉的情况)。我会说策略是采用最小差异的价值。

2)我很有可能以错误的方式解决这个问题。我知道Keras有一个回调功能但我不喜欢使用save_best_only功能的想法,因为它可以保存过度装配的模型。关于更有效的时代选择方法的任何建议都会很棒。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

下面是一个简单的示例,说明如何在Keras中使用早期弯腰:

首先必须导入:

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;丹尼尔的最佳答案。