PyTorch框架中使用早停止Early Stopping(含详细代码)

1.什么是早停止?为什么使用早停止?

早停止(Early Stopping)是 当达到某种或某些条件时,认为模型已经收敛,结束模型训练,保存现有模型的一种手段

机器学习或深度学习中,有很大一批算法是依靠梯度下降,求来优化模型的。是通过更新参数,让Loss往小的方向走,来优化模型的。可参考BP神经网络推导过程详解

关于模型何时收敛(模型训练好了,性能达到要求了或不能再优化了),此时我们可以采取一些判断标准:

1.验证集上的Loss在模型多次迭代后,没有下降
2.验证集上的Loss开始上升
3.验证集上的准确率在模型多次迭代后,没有上升
3.验证集上的准确率开始下降
……
这时,一般可以认为,模型没必要再训练了,可以及时结束训练了。这就被称为早停止,也是避免模型过拟合的一种方法(不等模型拟合,就结束训练了)。

2.如何使用早停止?

early_stopping.py

import numpy as np
import torch
import os

class EarlyStopping:
    """Early stops the training if validation loss doesn't improve after a given patience."""
    def __init__(self, save_path, patience=7, verbose=False, delta=0):
        """
        Args:
            save_path : 模型保存文件夹
            patience (int): How long to wait after last time validation loss improved.
                            Default: 7
            verbose (bool): If True, prints a message for each validation loss improvement. 
                            Default: False
            delta (float): Minimum change in the monitored quantity to qualify as an improvement.
                            Default: 0
        """
        self.save_path = save_path
        self.patience = patience
        self.verbose = verbose
        self.counter = 0
        self.best_score = None
        self.early_stop = False
        self.val_loss_min = np.Inf
        self.delta = delta

    def __call__(self, val_loss, model):

        score = -val_loss

        if self.best_score is None:
            self.best_score = score
            self.save_checkpoint(val_loss, model)
        elif score < self.best_score + self.delta:
            self.counter += 1
            print(f'EarlyStopping counter: {self.counter} out of {self.patience}')
            if self.counter >= self.patience:
                self.early_stop = True
        else:
            self.best_score = score
            self.save_checkpoint(val_loss, model)
            self.counter = 0

    def save_checkpoint(self, val_loss, model):
        '''Saves model when validation loss decrease.'''
        if self.verbose:
            print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')
        path = os.path.join(self.save_path, 'best_network.pth')
        torch.save(model.state_dict(), path)	# 这里会存储迄今最优模型的参数
        self.val_loss_min = val_loss

把该文件拷贝到自己项目中,
在需要使用早停止的文件中,导入:

from early_stopping import EarlyStopping

使用示例(大致代码):

train_losses = []
train_acces = []
# 用数组保存每一轮迭代中,在测试数据上测试的损失值和精确度,也是为了通过画图展示出来。
eval_losses = []
eval_acces = []

save_path = ".\\" #当前目录下
early_stopping = EarlyStopping(save_path)

for e in range(20000):


    # 4.1==========================训练模式==========================
    train_loss = 0
    train_acc = 0
    model.train()   # 将模型改为训练模式

    # 每次迭代都是处理一个小批量的数据,batch_size是64
    for im, label in train_data:
        im = Variable(im)
        targets = Variable(label)

        # 计算前向传播,并且得到损失函数的值
        outputs = model(im)
        loss = criterion(outputs, targets)

        #add by tyb

        #model.save_metrics(metrics)
        # 反向传播,记得要把上一次的梯度清0,反向传播,并且step更新相应的参数。
        optimizer.zero_grad()

        loss.backward()
        optimizer.step()
        #scheduler.step()

        # 记录误差
        train_loss += loss.item()

        # 计算分类的准确率
        out_t = outputs.argmax(dim=1) #取出预测的最大值
        num_correct = (out_t == targets).sum().item()
        acc = num_correct / im.shape[0]
        train_acc += acc

    train_losses.append(train_loss / len(train_data))
    train_acces.append(train_acc / len(train_data))



    # 4.2==========================每次进行完一个训练迭代,就去测试一把看看此时的效果==========================
    # 在测试集上检验效果
    eval_loss = 0
    eval_acc = 0

    model.eval()  # 将模型改为预测模式



    # 每次迭代都是处理一个小批量的数据,batch_size是128
    for im, label in test_data:

        #print("test_data len:",len(test_data))
        im = Variable(im)  # torch中训练需要将其封装即Variable,此处封装像素即784
        label = Variable(label)  # 此处为标签

        out = model(im)  # 经网络输出的结果
        loss = criterion(out, label)  # 得到误差

        # 记录误差
        eval_loss += loss.item()

        # 记录准确率
        out_t = out.argmax(dim=1)  # 取出预测的最大值的索引
        num_correct = (out_t == label).sum().item()  # 判断是否预测正确
        acc = num_correct / im.shape[0]  # 计算准确率
        eval_acc += acc

    eval_losses.append(eval_loss / len(test_data))
    eval_acces.append(eval_acc / len(test_data))
    #scheduler.step()

    print('epoch: {}, Train Loss: {:.6f}, Train Acc: {:.6f}, Eval Loss: {:.6f}, Eval Acc: {:.6f}'
          .format(e, train_loss / len(train_data), train_acc / len(train_data),
                  eval_loss / len(test_data), eval_acc / len(test_data)))

     
    # 早停止
    early_stopping(eval_loss, model)
    #达到早停止条件时,early_stop会被置为True
    if early_stopping.early_stop:
        print("Early stopping")
        break #跳出迭代,结束训练

未用早停止:训练集和验证集上的accuracy和loss曲线
在这里插入图片描述
使用早停止:训练集和验证集上的accuracy和loss曲线
在这里插入图片描述

3. Refferences

  1. 在 Pytorch 中实现 early stopping
  2. 线性代数及其应用——“早停止”与“L2正则”的关系
  3. BP神经网络推导过程详解
  • 66
    点赞
  • 326
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: PyTorch Early Stopping是一种用于训练深度学习模型的技术。当训练模型时,我们通常会设置一个固定的训练轮数,然后在每个训练轮结束后评估模型的性能。然而,有时模型在训练过程会出现过拟合的情况,即模型在训练集上表现良好,但在未见过的数据上表现不佳。 为了解决过拟合问题,Early Stopping技术引入了一个称为“patience”的超参数。Patience表示在模型性能不再提升时需要等待的训练轮数。具体来说,当模型在超过patience个训练轮数后性能没有明显提升时,训练将被提前停止,从而避免了继续训练过拟合的模型。 实现Early Stopping的一种常见方法是使用验证集(validation set)。在每个训练轮结束后,将训练好的模型在验证集上进行评估,并记录模型的性能指标,如损失函数或准确率。如果模型的性能指标在连续的patience个训练轮都没有明显提升,那么就说明模型已经达到了性能的极限,此时训练过程将被停止PyTorch提供了一些开源的工具库,如torch.optim和torchvision等,这些工具库Early Stopping的实现。在使用PyTorch进行深度学习模型训练时,我们可以通过在每个训练轮结束后进行模型性能评估,并比较连续的几次评估结果,来判断是否需要提前停止训练。 总而言之,PyTorch Early Stopping是一种用于避免模型过拟合的技术,通过在每个训练轮结束后评估模型性能,并设置适当的patience值,可以在训练过程及时停止模型的训练,从而获得更好的泛化能力和性能。 ### 回答2: PyTorch是一个广泛使用的开源深度学习框架,而Early Stopping则是一种用于训练过程自动停止模型训练的技术。PyTorch提供了一种方便的方法来实现Early StoppingEarly Stopping主要通过监控模型在验证集上的性能指标来判断是否停止训练。在训练过程,可以在每个训练周期结束后对验证集进行评估,并根据评估结果来判断当前模型的性能是否有所提升。 通常情况下,可以设置一个patience参数,该参数表示如果在连续多个训练周期性能指标没有提升,就认为模型已经停止改进,从而停止训练。在模型训练过程,当连续多个周期性能指标没有提升时,可以通过设置一个计数器来进行累计,并与patience进行比较。 当计数器达到patience时,可以选择在当前训练周期结束后停止训练,并保存最佳模型参数。这个最佳模型参数是根据验证集上的性能指标来确定的,通常是在训练过程保存验证集上性能最好的模型参数。 通过使用Early Stopping技术,可以防止模型过拟合,并能更加高效地训练深度学习模型。PyTorch提供了一些库函数和回调函数,可以方便地在训练过程实现Early Stopping。例如,可以使用`torchbearer`库来实现Early Stopping,并设置patience参数来控制训练的停止

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做个好男人!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值