深度学习防止过拟合----EarlyStopping(早停策略)

深度学习中,当我们在训练一个模型的时候,如果设置的epoch太小或者太大,都将影响模型的泛化性能。epoch过小,模型不能学习到样本的主要特征;epoch过大,模型学习的“太好了”,会造成过拟合的情况。下边介绍一种防止模型过拟合的策略。

一、早停法(EarlyStopping)简介

在大多数关于监督神经网络训练的介绍性论文中,你可以看到类似于图1所示的图表。纵坐标代表损失值的大小,横坐标代表训练的轮数。随着训练轮数的增加,训练集合的损失值先降低最后趋于平缓。而验证集的损失值先下降后上升。我们训练模型的目的是为了得到一个泛化性能比较好的模型,即在验证集上误差(损失值)较小。我们选择验证集损失值的最小处的训练轮数(epoch),提前终止训练,一方面保存最佳的模型,另一方面节省了训练时间。

图一:理想化的训练集误差和验证集的误差

然而,对于真实的神经网络训练,验证集误差的演变并不像图1所示的那样平滑,而更像图2所示。

                                                图二:一个真实的验证误差曲线

真实的验证误差曲线几乎总是有多个局部最小值。如何选取合适的训练轮数是我们要考虑的主要问题。

二、如何使用早停法

我们搜索那些产生最低泛化误差的标准,以及那些具有最佳“性价比”的标准,即对于给定的泛化误差需要最少的训练,或者(平均而言)在一定的训练时间内产生最低的泛化误差。以下是三类主流停止准则。

第一类停止准则

Eopt(t)的值定义是在迭代到t之前获得的最小验证集误差。

GL(t)叫做泛化损失,表示为验证误差相对于最小值的增加(以百分比为单位)

高泛化损失是停止训练的候选准则之一,因为它直接表明过拟合(验证集的损失值开始上升,即泛化性能开始下降)。我们选择一个合适的阈值,当泛化损失超过这个阈值就停止训练。

第二类停止准则

然而,当训练速度过快的时候,我们想要模型继续训练,我们要抑制停止。当训练误差仍然快速减小时,泛化损失有更高的机会被“修复”。我们认为,在误差缓慢减小时才会出现过拟合。为了形式化这个概念,我们定义一个长度为k的训练条带是一个编号为n + 1:::n + k的k次序列,即度量进展(measure progress)其中n可以被k整除。

这个公式表示条带期间的平均训练误差比条带期间的最小训练误差大多少。在训练的不稳定阶段,训练集误差会上升而不是下降。这是有意为之的,因为许多训练算法有时会通过在权重空间中采取不适当的大步骤而产生这种“抖动”。然而,进度度量保证在长期运行中接近零,除非训练是全局不稳定的(例如振荡)。因此,我们引入第二个停止准则,即泛化损失和进展的商。当大于阈值时,停止训练。

第三类停止准则

最后一类停止准则为:当泛化错误在连续s个周期内增长的时候停止。

当验证集错误在连续s个周期内出现增长的时候,我们假设这样的现象表明了过拟合,它与错误增长了多大独立。这个停止标准可以度量局部的变化,因此可以用在剪枝算法中,即在训练阶段,允许误差可以比前面最小值高很多时候保留。

早停early stopping)是一种在训练过程中用防止过拟合的技术。它通过在验证集上监测模型的性能,并在性能不再提升时停止训练,从而避免过拟合。对于YOLO V8训练早停,可以参考以下步骤: 1. 准备数据集和配置文件:首先,确保你已经准备好了自己的数据集和相应的配置文件。数据集应包含标注的图像和相应的标签文件,配置文件应包含模型的参数设置和路径信息。 2. 加载预训练模型:在YOLO V8训练中,通常会使用一个预训练的模型作为初始模型。你可以使用已经训练好的权重文件来加载模型。 3. 定义早停条件:在训练过程中,你需要定义早停的条件。一种常见的方法是监测模型在验证集上的性能,并设置一个阈值。当模型的性能在连续的几个epoch中没有提升时,就可以停止训练。 4. 训练模型:使用加载的预训练模型和定义的早停条件,开始训练模型。在每个epoch结束后,计算模型在验证集上的性能,并与之前的最佳性能进行比较。如果性能没有提升,则计数器加1,否则重置计数器。当计数器达到早停的阈值时,停止训练。 5. 保存最佳模型:在训练过程中,你可以保存在验证集上性能最好的模型。这样,即使早停停止了训练,你仍然可以使用最佳模型进行推理或进一步的训练。 下面是一个示例代码,演示了如何在YOLO V8训练中使用早停: ```python # 导入必要的库和模块 import torch from torch.utils.data import DataLoader from torchvision import transforms from yolo_v8 import YOLOv8 from dataset import CustomDataset from early_stopping import EarlyStopping # 定义数据集和配置文件路径 data_dir = 'path/to/dataset' config_file = 'path/to/config' # 定义数据预处理和转换 transform = transforms.Compose([ transforms.Resize((416, 416)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 创建数据集和数据加载器 dataset = CustomDataset(data_dir, config_file, transform=transform) dataloader = DataLoader(dataset, batch_size=8, shuffle=True) # 创建模型和优化器 model = YOLOv8() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 创建早停对象 early_stopping = EarlyStopping(patience=5, verbose=True) # 训练模型 for epoch in range(100): for images, targets in dataloader: # 前向传播和计算损失 outputs = model(images) loss = compute_loss(outputs, targets) # 反向传播和更新参数 optimizer.zero_grad() loss.backward() optimizer.step() # 在验证集上计算性能并更新早停对象 val_loss = validate(model, val_dataloader) early_stopping(val_loss, model) # 检查是否早停 if early_stopping.early_stop: print("Early stopping") break # 保存最佳模型 torch.save(early_stopping.best_model.state_dict(), 'best_model.pt') ``` 请注意,上述代码中的`YOLOv8`、`CustomDataset`、`compute_loss`、`validate`和`EarlyStopping`都是需要根据你的具体情况进行定义和实现的。你需要根据自己的数据集和模型进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值