python - 哪些参数应该用于提前停止?

标签 python keras deep-learning conv-neural-network

我正在使用 Keras 为我的项目训练神经网络。 Keras 提供了提前停止的功能。我可以知道应该观察哪些参数来避免我的神经网络通过使用提前停止来过度拟合吗?

最佳答案

early stopping

早期停止基本上是在您的损失开始增加(或者换句话说,验证准确度开始下降)时停止训练。根据documents用法如下;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

值取决于您的实现(问题、批量大小等),但通常是为了防止我会使用过拟合;

  1. 监控validation loss(需要使用cross 验证或至少训练/测试集)通过设置 monitor 'val_loss' 的参数。
  2. min_delta 是一个阈值,用于将某个时期的损失量化为 改善与否。如果loss的差值低于min_delta,则量化 因为没有改善。最好将其保留为 0,因为我们感兴趣 当损失变得更糟时。
  3. patience 参数表示一旦你的损失开始增加(停止改进)之前停止的时期数。 这取决于您的实现,如果您使用非常小的批处理大学习率你的损失zig-zag(准确度会更嘈杂)所以最好设置一个 大的 patience 参数。如果您使用大批量小批量 学习率你的损失会更平滑,所以你可以使用 较小的 patience 参数。无论哪种方式,我都会将其保留为 2 所以我会 给模型更多机会。
  4. verbose 决定要打印的内容,将其保留为默认值 (0)。
  5. mode 参数取决于你监控数量的方向 有(它应该是减少还是增加),因为我们监控损失,我们可以使用 min。但是让我们离开 keras 为我们处理并将其设置为 auto

所以我会使用类似的东西并通过绘制有和没有提前停止的错误损失来进行实验。

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

对于回调的工作方式可能存在歧义,我将尝试解释更多。在模型上调用 fit(... callbacks=[es]) 后,Keras 会调用给定的回调对象预定函数。这些函数可以称为on_train_beginon_train_endon_epoch_beginon_epoch_endon_batch_beginon_batch_end。在每个时期结束时调用提前停止回调,将最佳监测值与当前值进行比较,如果满足条件则停止(自观察到最佳监测值以来已经过去了多少时期,是否超过耐心参数,两者之间的差异最后一个值大于 min_delta 等..)。

正如@BrentFaust 在评论中指出的那样,模型的训练将继续进行,直到满足 Early Stopping 条件或满足 fit() 中的 epochs 参数(默认 = 10) .设置 Early Stopping 回调不会使模型训练超出其 epochs 参数。因此,使用较大的 epochs 值调用 fit() 函数将从 Early Stopping 回调中受益更多。

关于python - 哪些参数应该用于提前停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906048/

相关文章:

python - 将 yaml 文件加载为 dict

python - Pandas 条件列计数(复杂映射)

python - 将 mp3 文件格式化为用于 CNN 机器学习的频谱图

r - Keras 模型中训练和验证样本较小时如何衡量过拟合

python - 为什么 K.log 值在 keras 中给我 nan

machine-learning - 如何在caffe和torch中设置本地偏差?

c++ - 动态规划/内存(计算三元组)

deep-learning - yolov5输出的解读

matlab - 如何在自定义数据集上执行 RCNN 对象检测?

python - 如何使类的公共(public)属性在初始化后只读?