Pytorch中针对不同层的weight和bias设置不同的学习率

本文介绍如何在PyTorch中为不同层设置不同学习率,包括整体调整各卷积层的学习率及单独设置权重与偏置项的学习率。
部署运行你感兴趣的模型镜像

在训练模型时,有时候依据需求需要对模型的不同层(比如convolutional layer, linear layer等)或者不同层的weght和bias设置不同的学习率,针对这个问题,我们有以下几种方式解决:

以5层卷积的模型为例:

class Net5(nn.Module):
    def __init__(self):
        super(Net5, self).__init__()

        self.baseConv = nn.Sequential(OrderedDict([
            ('conv1', nn.Conv2d(3, 128, 3, 1, 1)),
            ('relu1', nn.ReLU()),
            ('conv2', nn.Conv2d(128, 128, 3, 1, 1)),
            ('relu2', nn.ReLU()),
            ('conv3', nn.Conv2d(128, 128, 3, 1, 1)),
            ('relu3', nn.ReLU())])
        )

        self.conv4 = nn.Conv2d(128, 64, 3, 1, 1)
        self.conv5 = nn.Conv2d(64, 3, 3, 1, 1)

    def forward(self, x):
        h = self.baseConv(x)
        h = self.conv4(h)
        result = self.conv5(h)
        return result

1、对不同的层设置不同的学习率

假如此处对baseConv中三个卷积层设置学习率为lr=0.001,conv4与conv5的学习率为0.0001;

方式1:最简单的方式

    net = Net5()

    params = []
    params += [{'param': net.baseConv.parameters(), 'lr': 0.001}]
    params += [{'param': net.conv4.parameters(), 'lr': 0.0001}]
    params += [{'param': net.conv5.parameters(), 'lr': 0.0001}]
    solver = Adam(params=params)

方式2: 利用lis,map以及filter函数

    base_params = list(map(id, net.baseConv.parameters()))
    other_params = filter(lambda p: id(p) not in base_params, net.parameters())
    params = [{'param': net.baseConv.parameters(), 'lr': 0.001},
              {'param': other_params, 'lr': 0.0001}]
    solver = Adam(params=params)

2、对于不同层的weight和bias设置 不同的学习率

例如将Net5的前4个卷积层的weight的学习率设为0.001,bias的学习率为0.0001,第五个卷积层的weight和bias的学习率设为0.0001,这种设置方式如下:

    lr = 0.001
    params = []
    base_params = dict(net.baseConv.named_parameters())
    for key, value in base_params.items():
        if 'bias' not in key:
            params += [{'param': [value], 'lr': lr}]
        else:
            params += [{'param': [value], 'lr': lr * 0.1}]
    conv4_param = dict(net.conv4.named_parameters())
    for key, value in conv4_param.items():
        if 'bias' not in key:
            params += [{'param': [value], 'lr': lr}]
        else:
            params += [{'param': [value], 'lr': lr * 0.1}]
    params += [{'param': net.conv5.parameters(), 'lr': lr * 0.1}]
    solver = Adam(params=params)

以上的方法可实现针对Pytorch中需要为不同layer设计不同学习率。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>好的,用户想了解PyTorch中的LambdaLR学习率调度器怎么用,我需要详细说明它的用法参数。首先,我应该回忆LambdaLR的基本概念,它是通过自定义函数调整学习率的。接下来需要解释LambdaLR的参数,特别是lr_lambda,可以接受函数或列表。然后给出一个具体的使用例子,比如在训练循环中的应用。要注意代码示例的正确性,确保导入必要的模块,比如torch.optimtorch.optim.lr_scheduler。可能需要展示如何定义lambda函数,以及如何将调度器集成到优化器中。此外,用户可能想知道不同参数组合下的行为,比如多个优化器参数组的情况,这时候lr_lambda用列表来对应不同的组。还要提醒用户注意事项,比如lambda函数在每个epoch结束后调用,需要根据epoch来调整学习率。最后,生成相关问题,帮助用户扩展知识,比如比较其他调度器或LambdaLR的应用场景。需要检查引用是否相关,但根据提供的引用,可能没有直接关于LambdaLR的内容,所以引用可能用不上,但按照规则还是要在末尾添加引用标识。确保回答结构清晰,分步骤说明,代码正确,并且使用中文。</think>### PyTorch中LambdaLR学习率调度器的使用详解 #### 1. LambdaLR的核心作用 LambdaLR允许用户通过自定义函数动态调整优化器的学习率。其核心公式为: $$ \text{new\_lr} = \text{initial\_lr} \times \text{lambda}(epoch) $$ 其中`lambda`函数接收当前epoch数值作为输入,返回学习率缩放系数[^1]。 #### 2. 关键参数说明 ```python torch.optim.lr_scheduler.LambdaLR( optimizer, lr_lambda, last_epoch=-1, verbose=False ) ``` - **optimizer**:绑定的优化器对象(如Adam/SGD) - **lr_lambda**:核心参数,接受两种形式: - 单函数:应用于所有参数组 - 函数列表:为每个参数组指定独立函数 - **last_epoch**:恢复训练时的断点epoch - **verbose**:是否打印更新信息 #### 3. 使用示例 ```python import torch from torch.optim import SGD from torch.optim.lr_scheduler import LambdaLR # 初始化模型优化器 model = torch.nn.Linear(10, 2) optimizer = SGD(model.parameters(), lr=0.1) # 定义学习率调整策略:每epoch线性衰减 lambda_func = lambda epoch: 1.0 - epoch/10 scheduler = LambdaLR(optimizer, lr_lambda=lambda_func) # 训练循环 for epoch in range(10): # 训练步骤... optimizer.step() scheduler.step() print(f"Epoch {epoch}: lr = {scheduler.get_last_lr()}") ``` #### 4. 多参数组配置示例 ```python # 为不同参数组设置不同策略 optimizer = SGD([ {'params': model.weight, 'lr': 0.1}, {'params': model.bias, 'lr': 0.05} ]) scheduler = LambdaLR(optimizer, lr_lambda=[ lambda epoch: 0.9 ** epoch, # 权重参数指数衰减 lambda epoch: 0.8 ** epoch # 偏置参数更快衰减 ]) ``` #### 5. 注意事项 - 调度器应在每个epoch后调用`step()` - 初始学习率由优化器参数设置 - lambda函数应返回标量值 - 可通过`scheduler.get_last_lr()`获取当前学习率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值