人工智能编程:如何为神经网络的不同参数设置不同的学习率?

专栏推荐



正文

import torch

from torch import nn

from torch import optim

class Net(nn.Module):

def __init__(self):

super(Net,self).__init__()

self.features=nn.Sequential(

nn.Conv2d(3,6,5),

nn.ReLU(True),

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(x.shape[0],-1)

x=self.classifier(x)

return x

现在有一个如上所示的神经网络,我们对其进行实例化net=Net()

#定义一个优化器,优化方法为SGD

#优化的参数是net.parameters()也就是所有的参数

#对这些所有的参数的优化的学习率为1

optimizer=optim.SGD(params=net.parameters(),lr=1)

#print(optimizer)

#SGD (

#Parameter Group 0

# dampening: 0

# lr: 1

# momentum: 0

# nesterov: False

# weight_decay: 0

#)

optimizer.zero_grad()#梯度清零,还可以使用net.zero_grad()完成梯度清零操作

input=torch.randn(1,3,32,32)#创造一个样本batch-size为1,通道为3,大小为32×32

out=net(input)

#print(input.size())torch.Size([1, 3, 32, 32])

为不同的子网络设置不同的学习率

使用SGD的优化方式

对features的优化学习率为1e-5

对classifier的优化学习率为1e-2

这样就实现了对不同子网络的优化

optimizer=optim.SGD([

{'params':net.features.parameters()},

{'params':net.classifier.parameters(),'lr':1e-4}

],lr=1e-5)

#print(optimizer)

#SGD (

#Parameter Group 0

# dampening: 0

# lr: 1e-05

# momentum: 0

# nesterov: False

# weight_decay: 0

#Parameter Group 1

# dampening: 0

# lr: 0.01

# momentum: 0

# nesterov: False

# weight_decay: 0

#)

每有一个params参数就有一个Group组

手动调整学习率

for param_group in optimizer.param_groups:

param_group['lr']*=0.1

人工智能编程:如何为神经网络的不同参数设置不同的学习率?

人工智能编程:如何为神经网络的不同参数设置不同的学习率?

人工智能编程:如何为神经网络的不同参数设置不同的学习率?

人工智能编程:如何为神经网络的不同参数设置不同的学习率?

人工智能编程:如何为神经网络的不同参数设置不同的学习率?


学习率衰减

对于一阶梯度进行优化的方法而言,开始的时候更新的幅度是比较大的,也就是说刚开始进行梯度下降的时候可以将学习率设置的大一些,但是训练集的loss下降到一定的程度之后,使用这个太大的学习率就会导致loss一直来回震荡。那么此时我们就可以进行学习率的衰减,在深度学习框架pytorch中可以使用torch.optim.lr_scheduler来完成。

访问参数组

optimizer.param_groups所有的参数组

optimizer.param_groups[0]获取到第一个参数组

optimizer.param_groups[0]['lr']获取第一个参数组的lr,也就是学习率

optimizer.param_groups[0]['weight_decay']获取第一个参数数组的weight,这个是正则化参数λ

既然可以获取到,那么我们就可以通过修改这个属性来改变训练过程中的学习率

optimizer.param_groups[0]['lr']=1e-5

为了防止有多个参数组,我们可以遍历所有的参数组,然后设置学习率

for param_group in optimizer.param_groups:

param_group['lr']=1e-5

这样就给所有的参数组设置学习率了

我们可以将其封装成一个方法来使用

def set_learning_rate(optimizer,lr):

for param_grop in optimizer.param_groups:

param_group['lr']=lr

具体使用的时候,我们可以根据epoch的次数来设置,如下所示当epoch为20次的时候就可以调整学习率了。

if epoch==20:

set_learning_rate(optimizer,0.01)


分享到:


相關文章: