人工智能编程:若何为神经收集的不合参数设置不合的进修率?_参数_梯度
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(1655,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)
本文系作者个人观点,不代表本站立场,转载请注明出处!