專欄推薦
正文
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)
閱讀更多 幻風的AI之路 的文章