您好,登錄后才能下訂單哦!
torch.optim的靈活使用詳解
1. 基本用法:
要構(gòu)建一個(gè)優(yōu)化器Optimizer,必須給它一個(gè)包含參數(shù)的迭代器來優(yōu)化,然后,我們可以指定特定的優(yōu)化選項(xiàng),
例如學(xué)習(xí)速率,重量衰減值等。
注:如果要把model放在GPU中,需要在構(gòu)建一個(gè)Optimizer之前就執(zhí)行model.cuda(),確保優(yōu)化器里面的參數(shù)也是在GPU中。
例子:
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
2. 靈活的設(shè)置各層的學(xué)習(xí)率
將model中需要進(jìn)行BP的層的參數(shù)送到torch.optim中,這些層不一定是連續(xù)的。
這個(gè)時(shí)候,Optimizer的參數(shù)不是一個(gè)可迭代的變量,而是一個(gè)可迭代的字典
(字典的key必須包含'params'(查看源碼可以得知optimizer通過'params'訪問parameters),
其他的key就是optimizer可以接受的,比如說'lr','weight_decay'),可以將這些字典構(gòu)成一個(gè)list,
這樣就是一個(gè)可迭代的字典了。
注:這個(gè)時(shí)候,可以在optimizer設(shè)置選項(xiàng)作為關(guān)鍵字參數(shù)傳遞,這時(shí)它們將被認(rèn)為是默認(rèn)值(當(dāng)字典里面沒有這個(gè)關(guān)鍵字參數(shù)key-value對(duì)時(shí),就使用這個(gè)默認(rèn)的參數(shù))
This is useful when you only want to vary a single option, while keeping all others consistent between parameter groups.
例子:
optimizer = SGD([ {'params': model.features12.parameters(), 'lr': 1e-2}, {'params': model.features22.parameters()}, {'params': model.features32.parameters()}, {'params': model.features42.parameters()}, {'params': model.features52.parameters()}, ], weight_decay1=5e-4, lr=1e-1, momentum=0.9)
上面創(chuàng)建的optim.SGD類型的Optimizer,lr默認(rèn)值為1e-1,momentum默認(rèn)值為0.9。features12的參數(shù)學(xué)習(xí)率為1e-2。
靈活更改各層的學(xué)習(xí)率
torch.optim.optimizer.Optimizer的初始化函數(shù)如下:
__init__(self, params, lr=<object object>, momentum=0, dampening=0, weight_decay=0, nesterov=False)
params (iterable): iterable of parameters to optimize or dicts defining parameter groups (params可以是可迭代的參數(shù),或者一個(gè)定義參數(shù)組的字典,如上所示,字典的鍵值包括:params,lr,momentum,dampening,weight_decay,nesterov)
想要改變各層的學(xué)習(xí)率,可以訪問optimizer的param_groups屬性。type(optimizer.param_groups) -> list
optimizer.param_groups[0].keys() Out[21]: ['dampening', 'nesterov', 'params', 'lr', 'weight_decay', 'momentum']
因此,想要更改某層參數(shù)的學(xué)習(xí)率,可以訪問optimizer.param_groups,指定某個(gè)索引更改'lr'參數(shù)就可以。
def adjust_learning_rate(optimizer, decay_rate=0.9): for para in optimizer.param_groups: para['lr'] = para['lr']*decay_rate
重寫torch.optim,加上L1正則
查看torch.optim.SGD等Optimizer的源碼,發(fā)現(xiàn)沒有L1正則的選項(xiàng),而L1正則更容易得到稀疏解。
這個(gè)時(shí)候,可以更改/home/smiles/anaconda2/lib/python2.7/site-packages/torch/optim/sgd.py文件,模擬L2正則化的操作。
L1正則化求導(dǎo)如下:
dw = 1 * sign(w)
更改后的sgd.py如下:
import torch from torch.optim.optimizer import Optimizer, required class SGD(Optimizer): def __init__(self, params, lr=required, momentum=0, dampening=0, weight_decay1=0, weight_decay2=0, nesterov=False): defaults = dict(lr=lr, momentum=momentum, dampening=dampening, weight_decay1=weight_decay1, weight_decay2=weight_decay2, nesterov=nesterov) if nesterov and (momentum <= 0 or dampening != 0): raise ValueError("Nesterov momentum requires a momentum and zero dampening") super(SGD, self).__init__(params, defaults) def __setstate__(self, state): super(SGD, self).__setstate__(state) for group in self.param_groups: group.setdefault('nesterov', False) def step(self, closure=None): """Performs a single optimization step. Arguments: closure (callable, optional): A closure that reevaluates the model and returns the loss. """ loss = None if closure is not None: loss = closure() for group in self.param_groups: weight_decay1 = group['weight_decay1'] weight_decay2 = group['weight_decay2'] momentum = group['momentum'] dampening = group['dampening'] nesterov = group['nesterov'] for p in group['params']: if p.grad is None: continue d_p = p.grad.data if weight_decay1 != 0: d_p.add_(weight_decay1, torch.sign(p.data)) if weight_decay2 != 0: d_p.add_(weight_decay2, p.data) if momentum != 0: param_state = self.state[p] if 'momentum_buffer' not in param_state: buf = param_state['momentum_buffer'] = torch.zeros_like(p.data) buf.mul_(momentum).add_(d_p) else: buf = param_state['momentum_buffer'] buf.mul_(momentum).add_(1 - dampening, d_p) if nesterov: d_p = d_p.add(momentum, buf) else: d_p = buf p.data.add_(-group['lr'], d_p) return loss
一個(gè)使用的例子:
optimizer = SGD([ {'params': model.features12.parameters()}, {'params': model.features22.parameters()}, {'params': model.features32.parameters()}, {'params': model.features42.parameters()}, {'params': model.features52.parameters()}, ], weight_decay1=5e-4, lr=1e-1, momentum=0.9)
以上這篇關(guān)于torch.optim的靈活使用詳解(包括重寫SGD,加上L1正則)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。