專欄推薦正文
現(xiàn)在有一個(gè)如上所示的神經(jīng)網(wǎng)絡(luò),我們對其進(jìn)行實(shí)例化net=Net() #定義一個(gè)優(yōu)化器,優(yōu)化方法為SGD #優(yōu)化的參數(shù)是net.parameters()也就是所有的參數(shù) #對這些所有的參數(shù)的優(yōu)化的學(xué)習(xí)率為1 optimizer=optim.SGD(params=net.parameters(),lr=1) #print(optimizer)
optimizer.zero_grad()#梯度清零,還可以使用net.zero_grad()完成梯度清零操作 input=torch.randn(1,3,32,32)#創(chuàng)造一個(gè)樣本batch-size為1,通道為3,大小為32×32 out=net(input) #print(input.size())torch.Size([1, 3, 32, 32]) 為不同的子網(wǎng)絡(luò)設(shè)置不同的學(xué)習(xí)率使用SGD的優(yōu)化方式 對features的優(yōu)化學(xué)習(xí)率為1e-5 對classifier的優(yōu)化學(xué)習(xí)率為1e-2 這樣就實(shí)現(xiàn)了對不同子網(wǎng)絡(luò)的優(yōu)化
#print(optimizer)
每有一個(gè)params參數(shù)就有一個(gè)Group組 手動(dòng)調(diào)整學(xué)習(xí)率for param_group in optimizer.param_groups: param_group['lr']*=0.1 學(xué)習(xí)率衰減對于一階梯度進(jìn)行優(yōu)化的方法而言,開始的時(shí)候更新的幅度是比較大的,也就是說剛開始進(jìn)行梯度下降的時(shí)候可以將學(xué)習(xí)率設(shè)置的大一些,但是訓(xùn)練集的loss下降到一定的程度之后,使用這個(gè)太大的學(xué)習(xí)率就會(huì)導(dǎo)致loss一直來回震蕩。那么此時(shí)我們就可以進(jìn)行學(xué)習(xí)率的衰減,在深度學(xué)習(xí)框架pytorch中可以使用torch.optim.lr_scheduler來完成。 訪問參數(shù)組optimizer.param_groups所有的參數(shù)組 optimizer.param_groups[0]獲取到第一個(gè)參數(shù)組 optimizer.param_groups[0]['lr']獲取第一個(gè)參數(shù)組的lr,也就是學(xué)習(xí)率 optimizer.param_groups[0]['weight_decay']獲取第一個(gè)參數(shù)數(shù)組的weight,這個(gè)是正則化參數(shù)λ 既然可以獲取到,那么我們就可以通過修改這個(gè)屬性來改變訓(xùn)練過程中的學(xué)習(xí)率 optimizer.param_groups[0]['lr']=1e-5 為了防止有多個(gè)參數(shù)組,我們可以遍歷所有的參數(shù)組,然后設(shè)置學(xué)習(xí)率 for param_group in optimizer.param_groups: param_group['lr']=1e-5 這樣就給所有的參數(shù)組設(shè)置學(xué)習(xí)率了 我們可以將其封裝成一個(gè)方法來使用 def set_learning_rate(optimizer,lr): for param_grop in optimizer.param_groups: param_group['lr']=lr 具體使用的時(shí)候,我們可以根據(jù)epoch的次數(shù)來設(shè)置,如下所示當(dāng)epoch為20次的時(shí)候就可以調(diào)整學(xué)習(xí)率了。 if epoch==20: set_learning_rate(optimizer,0.01) |
|