4.3 优化器

本文介绍如何使用PyTorch实现随机梯度下降(SGD)算法,并演示了如何为模型的不同部分设置不同的学习率,以及如何调整学习率。通过定义LeNet网络并应用SGD优化器,展示了在深度学习中调整学习率的具体方法。

实现随机梯度下降算法(SGD)

应掌握:

  1. 优化方法的基本使用方法
  2. 如何对模型的不同部分设置不同的学习率
  3. 如何调整学习率
import torch as t
from torch.autograd import Variable as V
from torch import nn

#实现随机梯度下降算法(SGD)

#首先定义一个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,2)
        )

        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([
    {'params':net.features.parameters()}, #学习率为1e-5
    {'params':net.features.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 = optim.SGD([
    {'params':base_params},
    {'params':special_layers.parameters(),'lr':0.01}
    ],lr=0.001)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值