咨询热线020-66889888
诚信为本:市场永远在变,诚信永远不变。

咨询热线

13988888888
手机:020-66889888
电话:13988888888
地址:海南省海口市58号
邮箱:admin@youweb.com

顺达资讯

>>你的位置: 首页 > 顺达资讯

关于优化器optimizer的使用心得

发布时间:2024-07-08 14:24:38

优化器的参数划分(以基本的SGD优化器为例,其他优化器的参数划分基本类似)

torch.optim.SGD( params, lr=required, momentum=0, dampening=0, weight_decay=0, nesterov=False )

具体各个参数的含义可以去看看pytorch官网,这里不会重述,主要讲的是一些使用的问题。

所有optimizer 的参数可以看作2类:
第一类:优化器的基本参数--就是优化器基本的设置参数。 对于torch.optim.SGD中需要设置的参数: lr momentum weight_decay nesterov dampening(不常用 主要用法是乘到梯度g上的一个数:grad*(1-dampening) 相当于在权重更新时:减少梯度的更新力度,变相增加动量更新的力度)。

第二类:优化器所需优化的网络参数params, 一般使用的时候,输入的是整个训练模型 model的属性_parameters,可以表示为model.parameters()。

细节问题:要注意仔细检查是否将自定义的 nn.Paramters 可学习参数 送入到优化器进行训练(很多人在网络,或者loss中 自己定义可学习的参数,但是发现训练不work甚至掉点,很大部分原因就是优化器根本没有对这些自定义的可学习参数nn.Parameters进行训练),因为在将model的参数添加到optimizer时,一般不会将自定义的参数自动的导入到优化器之中 这需要自己手动导入 --- 在 自定义可学习参数 时,这一点尤其不能忘!!

检查的方法就是看自定义的参数在训练的过程中有没有梯度(require_grad是不是T),且有了梯度后,参数会不会更新(有没有添加到optimizer中)。

补充一句:有的高手为了更精细的训练模型,甚至逐层调整学习率进行训练,从方法上讲,这个并不难,实际上你只要将你想“特殊对待”的那一层模型的权重挑出来放在自定义的一个list中,然后使用 add_param_group 对那一层模型的权重进行优化器的基本参数设置就可以了,难点只是设置成什么才会提点,而不是如何设置。

细节:对于训练过程,一般的操作是先get训练model --- 而后在构建optimizer之前把model导入到gpu之中 --- 最后才是构建optimizer,目的是将导入到GPU上的模型参数与优化器进行绑定。

最好用的关于优化器optimizer的创建方法,可以参考yolo系列的代码,如下:

pg0, pg1, pg2=[],[],[]
    # optimizer parameter groups 设置3个优化器参数组list 
    # -- 分组绑定优化器参数的好处在于可以针对不同的参数组,采取不同的优化策略 
    # -- 比如我们可以将模型中所有卷积层的权重参数筛选出来,并放在同一个list中 
    # -- 在向optimizer添加参数时,可以针对卷积层权重参数进行权重衰减的优化,例子如下:
for k, v in self.model.named_modules():
    if hasattr(v, "bias") and isinstance(v.bias, nn.Parameter):
        pg2.append(v.bias)  # biases 添加模型层中所有偏置参数 到list pg2
    if isinstance(v, nn.BatchNorm2d) or "bn" in k:
        pg0.append(v.weight)  # no decay 添加模型层中所有BN层的权重参数 到list pg0
    elif hasattr(v, "weight") and isinstance(v.weight, nn.Parameter):
        pg1.append(v.weight)  # apply decay 添加模型层中所有卷积层的权重参数 到list pg1
    .... #可以添加 自己定义 的 可学习  的 参数,这部分筛选就比较自由了,自己想训model的哪部分就筛选出来用于训练。
        
optimizer=torch.optim.SGD(
    pg0, lr=lr, momentum=self.momentum, nesterov=True
) # 创建并设置优化器对象 optimizer --- 优化器基本参数设置就是这么几个:lr   momentum   weight_decay   nesterov   dampening

optimizer.add_param_group(
{"params": pg1, "weight_decay": self.weight_decay}# 这里仅仅对 卷积层 权重参数 使用权重衰减
)  # add pg1 with weight_decay 如果你想“细调”,可以在这里再加一个基本参数设置,例如'lr':xxx

optimizer.add_param_group({"params": pg2})

咨询热线:020-66889888
站点分享:
友情链接:
手机:13988888888
电话:020-66889888
地址:海南省海口市58号
Copyright © 2012-2018 顺达注册-顺达娱乐-顺达官方站 版权所有
ICP备案编号:琼ICP备88889999号