pytorch中优化器总结

以SGD优化器为例:

# -*- coding: utf-8 -*-
#@Time    :2019/7/3 22:31
#@Author  :XiaoMa

from torch import nn as nn
import torch as t
from torch.autograd import Variable as V
#定义一个LeNet网络
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.features=nn.Sequential(
            nn.Conv2d(3,6,5),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
            nn.Conv2d(6,16,5),
            nn.ReLU(),
            nn.MaxPool2d(2,3)
        )
        
        self.classifier=nn.Sequential(\
            nn.Linear(16*5*5,120),
            nn.ReLU(),
            nn.Linear(120,84),
            nn.ReLU(),
            nn.Linear(84,10)
            )
    def forward(self, x):
        x=self.features(x)
        x=x.view(-1,16*5*5)
        x=self.classifier(x)
        return x
net=Net()

from torch import optim #优化器
optimizer=optim.SGD(params=net.parameters(),lr=1)
optimizer.zero_grad()   #梯度清零,相当于net.zero_grad()

input=V(t.randn(1,3,32,32))
output=net(input)
output.backward(output)     #fake backward
optimizer.step()    #执行优化

#为不同子网络设置不同的学习率,在finetune中经常用到
#如果对某个参数不指定学习率,就使用默认学习率
optimizer=optim.SGD(
    [{'param':net.features.parameters()},    #学习率为1e-5
    {'param':net.classifier.parameters(),'lr':1e-2}],lr=1e-5
)

#只为两个全连接层设置较大的学习率,其余层的学习率较小
special_layers=nn.ModuleList([net.classifier[0],net.classifier[3]])
special_layers_params=list(map(id,special_layers.parameters()))
base_params=filter(lambda p:id(p) not in special_layers_params,net.parameters())

optimizer=t.optim.SGD([
    {'param':base_params},
    {'param':special_layers.parameters(),'lr':0.01}
],lr=0.001)

调整学习率主要有两种做法。一种是修改optimizer.param_groups中对应的学习率,另一种是新建优化器(更简单也是更推荐的做法),由于optimizer十分轻量级,构建开销很小,故可以构建新的optimizer。但是新建优化器会重新初始化动量等状态信息,这对使用动量的优化器来说(如自带的momentum的sgd),可能会造成损失函数在收敛过程中出现震荡。

如:

#调整学习率,新建一个optimizer
old_lr=0.1
optimizer=optim.SGD([
                {'param':net.features.parameters()},
                {'param':net.classifiers.parameters(),'lr':old_lr*0.5}],lr=1e-5)
                

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值