YOLOV8替换Lion优化器

avatar
作者
猴君
阅读量:0

YOLOV8替换Lion优化器

1 优化器介绍博客

参考bilibili讲解视频

论文地址:https://arxiv.org/abs/2302.06675

代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py

"""PyTorch implementation of the Lion optimizer.""" import torch from torch.optim.optimizer import Optimizer     class Lion(Optimizer):   r"""Implements Lion algorithm."""     def __init__(self, params, lr=1e-4, betas=(0.9, 0.99), weight_decay=0.0):     """Initialize the hyperparameters.     Args:       params (iterable): iterable of parameters to optimize or dicts defining         parameter groups       lr (float, optional): learning rate (default: 1e-4)       betas (Tuple[float, float], optional): coefficients used for computing         running averages of gradient and its square (default: (0.9, 0.99))       weight_decay (float, optional): weight decay coefficient (default: 0)     """       if not 0.0 <= lr:       raise ValueError('Invalid learning rate: {}'.format(lr))     if not 0.0 <= betas[0] < 1.0:       raise ValueError('Invalid beta parameter at index 0: {}'.format(betas[0]))     if not 0.0 <= betas[1] < 1.0:       raise ValueError('Invalid beta parameter at index 1: {}'.format(betas[1]))     defaults = dict(lr=lr, betas=betas, weight_decay=weight_decay)     super().__init__(params, defaults)     @torch.no_grad()   def step(self, closure=None):     """Performs a single optimization step.     Args:       closure (callable, optional): A closure that reevaluates the model         and returns the loss.     Returns:       the loss.     """     loss = None     if closure is not None:       with torch.enable_grad():         loss = closure()       for group in self.param_groups:       for p in group['params']:         if p.grad is None:           continue           # Perform stepweight decay         p.data.mul_(1 - group['lr'] * group['weight_decay'])           grad = p.grad         state = self.state[p]         # State initialization         if len(state) == 0:           # Exponential moving average of gradient values           state['exp_avg'] = torch.zeros_like(p)           exp_avg = state['exp_avg']         beta1, beta2 = group['betas']           # Weight update         update = exp_avg * beta1 + grad * (1 - beta1)         p.add_(torch.sign(update), alpha=-group['lr'])         # Decay the momentum running average coefficient         exp_avg.mul_(beta2).add_(grad, alpha=1 - beta2)       return loss 

2 在相应的文件夹内新建lion_pytorch.py文件

在这里插入图片描述

3 在trianer.py中添加Lion优化器

在这里插入图片描述

from ultralytics.engine.lion_pytorch import Lion    #Lion optimizer 

然后在末尾build_optimizer函数中添加判断是否使用Lion优化器:
在这里插入图片描述

def build_optimizer(self, model, name="auto", lr=0.001, momentum=0.9, decay=1e-5, iterations=1e5): ·······       elif name == "Lion":         optimizer = Lion(g[2], lr=lr, betas=(momentum, 0.99), weight_decay=0.0) ······· 

4 设置Lion优化器并训练查看

方法1:defalut.yaml中修改默认设置:
在这里插入图片描述
方法2:训练文件中自定义设置:
在这里插入图片描述Lion优化器默认的学习率改为为1e-4,不然就是yolov8中默认的0.01。

运行训练文件后可以看到如下提示则修改成功:
在这里插入图片描述

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!