python PyTorch參數(shù)初始化和Finetune
前言
這篇文章算是論壇PyTorch Forums關于參數(shù)初始化和finetune的總結,也是我在寫代碼中用的算是“最佳實踐”吧。最后希望大家沒事多逛逛論壇,有很多高質(zhì)量的回答。
參數(shù)初始化
參數(shù)的初始化其實就是對參數(shù)賦值。而我們需要學習的參數(shù)其實都是Variable,它其實是對Tensor的封裝,同時提供了data,grad等借口,這就意味著我們可以直接對這些參數(shù)進行操作賦值了。這就是PyTorch簡潔高效所在。

所以我們可以進行如下操作進行初始化,當然其實有其他的方法,但是這種方法是PyTorch作者所推崇的:
def weight_init(m):
# 使用isinstance來判斷m屬于什么類型
if isinstance(m, nn.Conv2d):
n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
m.weight.data.normal_(0, math.sqrt(2. / n))
elif isinstance(m, nn.BatchNorm2d):
# m中的weight,bias其實都是Variable,為了能學習參數(shù)以及后向傳播
m.weight.data.fill_(1)
m.bias.data.zero_()
Finetune
往往在加載了預訓練模型的參數(shù)之后,我們需要finetune模型,可以使用不同的方式finetune。
局部微調(diào)
有時候我們加載了訓練模型后,只想調(diào)節(jié)最后的幾層,其他層不訓練。其實不訓練也就意味著不進行梯度計算,PyTorch中提供的requires_grad使得對訓練的控制變得非常簡單。
model = torchvision.models.resnet18(pretrained=True) for param in model.parameters(): param.requires_grad = False # 替換最后的全連接層, 改為訓練100類 # 新構造的模塊的參數(shù)默認requires_grad為True model.fc = nn.Linear(512, 100) # 只優(yōu)化最后的分類層 optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
全局微調(diào)
有時候我們需要對全局都進行finetune,只不過我們希望改換過的層和其他層的學習速率不一樣,這時候我們可以把其他層和新層在optimizer中單獨賦予不同的學習速率。比如:
ignored_params = list(map(id, model.fc.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params,
model.parameters())
optimizer = torch.optim.SGD([
{'params': base_params},
{'params': model.fc.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
其中base_params使用1e-3來訓練,model.fc.parameters使用1e-2來訓練,momentum是二者共有的。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python中根據(jù)字符串調(diào)用函數(shù)的實現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython中根據(jù)字符串調(diào)用函數(shù)的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-06-06
python 創(chuàng)建彈出式菜單的實現(xiàn)代碼
這篇文章主要介紹了python 創(chuàng)建彈出式菜單的實現(xiàn)代碼的相關資料,需要的朋友可以參考下2017-07-07
Pandas對DataFrame單列/多列進行運算(map, apply, transform, agg)
這篇文章主要介紹了Pandas對DataFrame單列/多列進行運算(map, apply, transform, agg),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
Python中字符串String的基本內(nèi)置函數(shù)與過濾字符模塊函數(shù)的基本用法
這篇文章主要介紹了Python中字符串String的基本內(nèi)置函數(shù)與過濾字符模塊函數(shù)的基本用法 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
Python中的defaultdict模塊和namedtuple模塊的簡單入門指南
這篇文章主要介紹了Python中的defaultdict模塊和namedtuple模塊的簡單入門指南,efaultdict繼承自dict、namedtuple繼承自tuple,是Python中內(nèi)置的數(shù)據(jù)類型,需要的朋友可以參考下2015-04-04

