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++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值