pytorch不同层设置不同学习率(代码片段)

呆呆象呆呆 呆呆象呆呆     2022-12-25     132

关键词:

1 主要目标

不同的参数可能需要不同的学习率,本文主要实现的是不同层中参数的不同学习率设置。

尤其是当我们在使用预训练的模型时,需要对一些除了主干网络以外的分支进行单独修改并进行初始化,其他主干网络层的参数采用预训练的模型参数进行初始化,这个时候我们希望在进行训练过程中,除主干网络只进行微调,不需要过多改变参数,因此需要设置较小的学习率。而改正后的其它层则需要以较大的步子去收敛,学习率往往要设置大一点。

2 针对全局的统一学习率设置

根据你选择的优化器的类把具体设置的lr作为可选参数的一部分传入到新建的优化器类初始化中。

优化器初始化方式一般如下所示

其中源码中对应第一个参数的要求为可以迭代索引的参数集合或者字典(理解这一部分就是实现之后不同学习率的设置)

代码举例

optimizer = optim.SGD(net.parameters(), lr=0.001 )

3 针对不同层设置不一样的学习率

其核心就是以字典或者字典列表的形式进行

  • 不同参数的集合行程参数组(字典构成的列表中的每一项都是会形成一个参数组,然后针对这个参数组可以有不一样的优化器的参数设置)
  • 每一个参数组所需要的都是一个参数的迭代器正如所有参数的集合迭代器net.parameters()

方法一

最简单的方法:(适合比较简单的网络)通过实例化之后的网络模型索引到对应的层,索引到具体的参数集合

举例:对偏置和权重采用不同的学习率(也需要进行一层一层的引用进行单个字典的声明)

    optimizer = optim.SGD([
                    'params': net.net1.weight,'lr': 1e-2,
                    'params': net.net1.bias, 'lr': 1e-1])

同时也可以通过列表的方式把不同层组织起来

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.net1 = nn.Linear(2,10)
        self.net2 = nn.Linear(10,1)
    def forward(self, x):
        x = self.net1(x)
        x = self.net2(x)
        return x
net = Net()
# 以字典的形式进行对不同参数组的所需要的优化参数定义
optimizer = optim.SGD([
                    'params': [net.net1.weight,net.net2.weight],'lr': 1e-2,
                    'params': [net.net1.bias,net.net2.bias], 'lr': 1e-1])
for epoch in range(100):
        print("Epoch:  Lr::.2E".format(epoch,optimizer.state_dict()['param_groups'][0]['lr']))
        print("Epoch:  Lr::.2E".format(epoch,optimizer.state_dict()['param_groups'][1]['lr']))
        optimizer.step()

好像只能对一个具体的层进行参数的学习率设置,而不能再细化下去对每个层的不同位置的参数进行学习率的精细调整(因为它需要可以构成一个参数组的可迭代索引对象)

方法二

最常用的方法:在网络结构(也可以是层,因为层也继承于nn.Moduel)使用类内函数.parameters(),这样就可以通过该函数获得一个层或者网络的参数迭代器,用来初始化优化器

例1

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.net1 = nn.Linear(2,10)
        self.net2 = nn.Linear(10,1)
    def forward(self, x):
        x = self.net1(x)
        x = self.net2(x)
        return x
net = Net()
# 以字典的形式进行对不同参数组的所需要的优化参数定义
optimizer = optim.SGD([
        "params":net.net1.parameters(),
        "params":net.net1.parameters(),"lr":1e-5,],
        lr=1e-2, #默认参数
    )

例2

通过一些常用的函数获得参数迭代器lambda,map,filterid

用我们自定义的网络为例

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.conv1 = nn.Conv2d(3,32,3)
        self.conv2 = nn.Conv2d(32,24,3)
        self.prelu = nn.PReLU()
        for m in self.modules():
            if isinstance(m,nn.Conv2d):
                nn.init.xavier_normal_(m.weight.data)
                nn.init.constant_(m.bias.data,0)
            if isinstance(m,nn.Linear):
                m.weight.data.normal_(0.01,0,1)
                m.bias.data.zero_()
 
    def forward(self, input):
        out = self.conv1(input)
        out = self.conv2(out)
        out = self.prelu(out)
        return out

model = Net()
conv_params = list(map(id,model.conv1.parameters()))   #提出前两个卷积层存放参数的地址
conv_params += list(map(id,model.conv2.parameters()))
prelu_params = []
for m in model.modules():    #找到Prelu的参数
    if isinstance(m, nn.PReLU):
        prelu_params += m.parameters()
 
#假象网络比我写的很大,还有一部分参数,这部分参数使用另一个学习率
rest_params = filter(lambda x:id(x) not in conv_params+list(map(id,prelu_params)),model.parameters())  #提出剩下的参数
print(list(rest_params))
'''
>> []   #是空的,因为我举的例子没其他参数了
'''
import torch.optim as optim
 
optimizer = optim.Adam(['params':model.conv1.parameters(),'lr':0.2,
                        'params':model.conv2.parameters(),'lr':0.2,
                        'params':prelu_params,'lr':0.02,
                        'params':rest_params,'lr':0.3
])

例3

class net(nn.Module):
    def __init__(self):
        super(net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, 1)
        self.conv2 = nn.Conv2d(64, 64, 1)
        self.conv3 = nn.Conv2d(64, 64, 1)
        self.conv4 = nn.Conv2d(64, 64, 1)
        self.conv5 = nn.Conv2d(64, 64, 1)
    def forward(self, x):
        out = conv5(conv4(conv3(conv2(conv1(x)))))
        return out
net = net()
lr = 0.001
conv5_params = list(map(id, net.conv5.parameters()))
conv4_params = list(map(id, net.conv4.parameters()))
base_params = filter(lambda p: id(p) not in conv5_params + conv4_params,
                     net.parameters())
optimizer = torch.optim.SGD([
            'params': base_params,
            'params': net.conv5.parameters(), 'lr': lr * 100,
            'params': net.conv4.parameters(), 'lr': lr * 100,
            , lr=lr, momentum=0.9)

    
    

例4

resnet101为例,分层设置学习率。

model = torchvision.models.resnet101(pretrained=True)
large_lr_layers = list(map(id,model.fc.parameters()))
small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
optimizer = torch.optim.SGD([
            "params":large_lr_layers,
            "params":small_lr_layers,"lr":1e-4
            ],lr = 1e-2,momenum=0.9)

注:large_lr_layers学习率为 1e-2small_lr_layers学习率为 1e-4,两部分参数共用一个momenum

LAST 参考文献

Pytorch中,动态调整学习率、不同层设置不同学习率和固定某些层训练的方法_我的博客有点东西-CSDN博客

pytorch 模型不同层设置不同的学习率 - 华为云

pytorch在不同的层使用不同的学习率_pytorch在不同的层设置不同的学习率-CSDN博客_pytorch 不同层不同学习率

torch.optim - PyTorch中文文档

Python filter() 函数 | 菜鸟教程

Python map() 函数 | 菜鸟教程

pytorch中对bias参数单独设置学习率

关于按参数设置学习率,请参考《PyTorchDocumentation|Per-parameteroptions》关于单独设置学习率,请参考《PyTorchTricks集锦|9.对不同层使用不同学习率》其主要思路是:在优化器中对某些参数指定使用的特定学习率,来替... 查看详情

第十七篇pytorch学习率调整策略

文章目录摘要1、对不同层设置不同的学习率应用举例2、等间隔调整学习率StepLR应用举例3、按需调整学习率MultiStepLR应用举例4、指数衰减调整学习率ExponentialLR应用举例5、余弦退火调整学习率CosineAnnealingLR应用举例6、自适应调整... 查看详情

pytorch优化器与学习率设置详解(代码片段)

...;之后逐渐减小学习率,来寻找最优解。那么在Pytorch中,如在训练过程中动态地调整学习率呢?目录优化器Optimizer只训练模型的一部分参数不同部分的参数设置不同的学习率(以及其他属性)Optimizer基本... 查看详情

pytorch训练深度学习小技巧收集(代码片段)

1、对不同的网络层配置不同的学习率importtorchoptimizer=torch.optim.Adam([dict(params=model.conv1.parameters(),weight_decay=5e-4),dict(params=model.conv2.parameters(),weight_decay=0)],lr=args.lr)#Onlyperformweight-decayonfirstconvolution. 查看详情

如何在 Pytorch 中应用分层学习率?

】如何在Pytorch中应用分层学习率?【英文标题】:Howtoapplylayer-wiselearningrateinPytorch?【发布时间】:2019-01-1823:06:53【问题描述】:我知道可以冻结网络中的单个层,例如仅训练预训练模型的最后一层。我正在寻找一种将某些学习... 查看详情

pytorch两种不同分类层的设计方法(代码片段)

问题涉及到图像分类的网络的最后一层分类层,有两种实现方法,如下所示,你更偏向于哪种方法呢?方法方法1importtorchfromtorchimportnn'''测试池化和卷积组合的分类层'''classMyNet(nn.Module):def__init__(s... 查看详情

pytorch学习(代码片段)

PyTorch官网PyTorch官方教程PyTorch官方文档动手学深度学习PyTorch版安装新建环境:condacreate--nametorchpython=3.7安装一些可能要用到的包(非必须,看自己情况):condainstallnumpycondainstallspydercondainstalljupyternotebook安装PyTorch:condainstallpytorc... 查看详情

pytorch快速搭建多个具有相同卷积核尺寸不同卷积核数量的卷积层(代码片段)

问题本文主要介绍啊快速搭建多个具有相同卷积核尺寸不同卷积核数量的卷积层。方法快速搭建三个卷积层结构,每个卷积层的参数如下所示:3@3x316@3x332@3x364@3x3x@yxy其中x为卷积核数量,y为卷积核大小简单方法importtorchfromtorchimport... 查看详情

pytorch快速搭建多个具有相同卷积核尺寸不同卷积核数量的卷积层(代码片段)

问题本文主要介绍啊快速搭建多个具有相同卷积核尺寸不同卷积核数量的卷积层。方法快速搭建三个卷积层结构,每个卷积层的参数如下所示:3@3x316@3x332@3x364@3x3x@yxy其中x为卷积核数量,y为卷积核大小简单方法importtorchfromtorchimport... 查看详情

pytorch训练技巧(代码片段)

Pytorch训练技巧文章目录Pytorch训练技巧1、指定GPU编号2、查看模型每层输出详情3、梯度裁剪(GradientClipping)4、扩展单张图片维度5、独热编码6、防止验证模型时爆显存7、学习率衰减8、冻结某些层的参数1、指定GPU编号设... 查看详情

《深度学习笔记》——pytorch调整学习率(代码片段)

1定义调整学习率函数defadjust_learning_rate(optimizer,epoch,lr):"""SetsthelearningratetotheinitialLRdecayedby10every2epochs"""#optimizer表示优化器对象lr*=(0.1**(epoch//2))forparam_groupinop 查看详情

pytorch模型查看网络参数的梯度以及参数更新是否正确,优化器学习率的分层设置(代码片段)

主要目标有的时候想看一下设置了优化器和学习率之后是否按照我设置的样子去进行更新,所以想查看一下网络参数中的及各相关变量:更新前的值优化器中的学习率计算出loss之后的梯度值更新后的值有了这几个值,... 查看详情

pytorch笔记:调整学习率(torch.optim.lr_scheduler)(代码片段)

1概述 torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learningrate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。2 lr_scheduler调整策略举例2.1 torch.optim.lr_sc... 查看详情

pytorch动态调整学习率,学习率自动下降,根据loss下降(代码片段)

0为什么引入学习率衰减?我们都知道几乎所有的神经网络采取的是梯度下降法来对模型进行最优化,其中标准的权重更新公式:W+=α∗ gradient W+=\\alpha*\\textgradientW+=α∗ gradient 学习率α\\alphaα控制... 查看详情

深度学习-pytorch环境搭建(windows)(代码片段)

文章目录版本选择Python安装Anaconda安装PyTorch安装PyCham测试前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。本文主要参考PyTorch文档版本选择不同操作系统&#... 查看详情

工作小结四(代码片段)

...ayarenegative.Thisiscurrentlynotsupported,butwillbeaddedinfuturereleases.4.pytorch读取修改预训练模型5.pytorch设置不同层的学习率1.关于VSCode一直出现“Extensionloading。。。”问题描述:最近使用VSCode调试python的时候,突然python无法加载解决方案:... 查看详情

pytorch入门pytorch神经网络工具(代码片段)

Pytorch神经网络工具前向传播反向传播神经网络工具箱nnnn.Modulenn.funtional优化器动态修改学习率核心组件层:神经网络的基本结构,将输入张量幻化为输出张量模型:层组成的网络损失函数:参与学习的目标函数... 查看详情

[pytorch]pytorch保存模型与加载模型(转)(代码片段)

转自:知乎目录:保存模型与加载模型冻结一部分参数,训练另一部分参数采用不同的学习率进行训练1.保存模型与加载简单的保存与加载方法:#保存整个网络torch.save(net,PATH)#保存网络中的参数,速度快,占空间少torch.save(net.state... 查看详情