我正在尝试编写一些逻辑,以选择在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
功能,因为它可能会保存过拟合的模型。对于更有效的时期选择方法有什么建议吗?
patience
参数。 - cdeterman