人工智能編程:如何為神經網絡的不同參數設置不同的學習率?

專欄推薦



正文

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)


分享到:


相關文章: