Pytorch:代码实现不同层设置不同的学习率,选择性学习某些层参数

1,如何动态调整学习率

在使用pytorch进行模型训练时,经常需要随着训练的进行逐渐降低学习率,在pytorch中给出了非常方面的方法:

假设我们定义了一个优化器:

import torch
import torch.nn as nn
optimizer = torch.optim(model.parameters(), lr = 0.01, momentum = 0.9)

该优化器的初始化学习为0.01,

如果我们学习每个"n" 个epoch把学习率降低为原来的0.9倍,则需要声明一个学习率调节器:

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

其中:

optimizer: 前面声明的优化器;

 

step_size: 每step_size个epoch学习率降低为原来的gamma倍,

last_epoch: 当前所处的epoch

例如:

 # Assuming optimizer uses lr = 0.05 for all groups
 # lr = 0.05     if epoch < 30
 # lr = 0.005    if 30 <= epoch < 60
 # lr = 0.0005   if 60 <= epoch < 90
 # ...
 scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
 for epoch in range(100):
     scheduler.step()
     train(...)
     validate(...)

另外其他常用的更新策略类似:

torch.optim.lr_scheduler.ExponentialLR(optimizergammalast_epoch=-1)

torch.optim.lr_scheduler.CosineAnnealingLR(optimizerT_maxeta_min=0last_epoch=-1)

torch.optim.lr_scheduler.ReduceLROnPlateau(optimizermode='min'factor=0.1patience=10verbose=Falsethreshold=0.0001threshold_mode='rel'cooldown=0min_lr=0eps=1e-08)

torch.optim.lr_scheduler.LambdaLR(optimizerlr_lambdalast_epoch=-1)

2,如何选择性学习某些参数

对于我们现有的模型model,通过调整参数的requires_grad 属性控制该模型是否参与求导运算

for name, param in model.named_parameters():
    if param.requires_grad:
        print("requires_grad: True ", name)
    else:
        print("requires_grad: False ", name)

如果模型中包含多个子模块,可用通过

sub_block = model.children()

 

获取该模块,然后通过迭代索引的方式获取参数:

for name, param in sub_block.named_parameters()

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值