自定义学习率

warm up + 自定义学习率策略(如cos)

from math import cos, pi
from torch.optim.lr_scheduler import _LRScheduler


class CustomScheduler(_LRScheduler):
    def __init__(self, optimizer, base_lr, max_steps, warmup_steps, eta_min=0, last_epoch=-1):
        self.base_lr = base_lr
        self.warmup_lr_init = 0.0001
        self.max_steps: int = max_steps
        self.warmup_steps: int = warmup_steps
        self.power = 2
        self.eta_min = eta_min
        super(CustomScheduler, self).__init__(optimizer, -1, False)
        self.last_epoch = last_epoch

    def get_warmup_lr(self):
        alpha = float(self.last_epoch) / float(self.warmup_steps)
        return [self.base_lr * alpha for _ in self.optimizer.param_groups]

    def get_lr(self):
        if self.last_epoch == -1:
            return [self.warmup_lr_init for _ in self.optimizer.param_groups]
        if self.last_epoch < self.warmup_steps:
            return self.get_warmup_lr()
        else:
            alpha = self.func()
            return [(self.base_lr-self.eta_min) * alpha + self.eta_min for _ in self.optimizer.param_groups]

    def func(self):
        alpha = (
            1
            - float(self.last_epoch - self.warmup_steps)
            / float(self.max_steps - self.warmup_steps))
        return alpha


class PolyScheduler(CustomScheduler):
    def __init__(self, optimizer, base_lr, max_steps, warmup_steps, eta_min=0, last_epoch=-1):
        super().__init__(optimizer, base_lr, max_steps, warmup_steps, eta_min, last_epoch)

    def func(self):
        alpha = pow(
            1
            - float(self.last_epoch - self.warmup_steps)
            / float(self.max_steps - self.warmup_steps),
            self.power,
        )
        return alpha


class CosineScheduler(CustomScheduler):
    def __init__(self, optimizer, base_lr, max_steps, warmup_steps, eta_min=0, last_epoch=-1):
        super().__init__(optimizer, base_lr, max_steps, warmup_steps, eta_min, last_epoch)
        
    def func(self):
        alpha = cos(
            pi / 2
            * float(self.last_epoch - self.warmup_steps)
            / float(self.max_steps - self.warmup_steps))
        return alpha

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中可以通过自定义损失函数和学习率调整策略来优化模型的训练效果。 自定义损失函数: 在PyTorch中,可以通过继承`nn.Module`类,自定义损失函数。下面是一个例子: ```python import torch.nn as nn class CustomLoss(nn.Module): def __init__(self): super().__init__() def forward(self, inputs, targets): loss = ... # 计算自定义损失函数 return loss ``` 在自定义损失函数中,需要实现`forward`方法,接受模型的输出与标签作为输入,并返回损失值。 学习率调整策略: PyTorch中提供了多种学习率调整策略,包括学习率衰减、学习率重启、余弦退火等。可以通过继承`torch.optim.lr_scheduler._LRScheduler`类,自定义学习率调整策略。下面是一个例子: ```python import torch.optim.lr_scheduler as lr_scheduler class CustomScheduler(lr_scheduler._LRScheduler): def __init__(self, optimizer, last_epoch=-1): super().__init__(optimizer, last_epoch) def get_lr(self): lr = ... # 计算自定义学习率调整策略 return [lr for _ in self.optimizer.param_groups] ``` 在自定义学习率调整策略中,需要实现`get_lr`方法,返回一个列表,其中每个元素是一个浮点数,代表每个参数组的学习率。 在训练过程中,可以将自定义损失函数和学习率调整策略传递给优化器,例如: ```python import torch.optim as optim model = ... criterion = CustomLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) scheduler = CustomScheduler(optimizer) for epoch in range(num_epochs): for batch in data_loader: inputs, targets = batch outputs = model(inputs) loss = criterion(outputs, targets) optimizer.zero_grad() loss.backward() optimizer.step() scheduler.step() ``` 在每个epoch结束时,调用`scheduler.step()`方法来更新学习率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值