新聞中心
這篇文章主要介紹了pytorch如何在網(wǎng)絡中添加可訓練參數(shù)和修改預訓練權重文件,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
實踐中,針對不同的任務需求,我們經(jīng)常會在現(xiàn)成的網(wǎng)絡結構上做一定的修改來實現(xiàn)特定的目的。
假如我們現(xiàn)在有一個簡單的兩層感知機網(wǎng)絡:
# -*- coding: utf-8 -*- import torch from torch.autograd import Variable import torch.optim as optim x = Variable(torch.FloatTensor([1, 2, 3])).cuda() y = Variable(torch.FloatTensor([4, 5])).cuda() class MLP(torch.nn.Module): def __init__(self): super(MLP, self).__init__() self.linear1 = torch.nn.Linear(3, 5) self.relu = torch.nn.ReLU() self.linear2 = torch.nn.Linear(5, 2) def forward(self, x): x = self.linear1(x) x = self.relu(x) x = self.linear2(x) return x model = MLP().cuda() loss_fn = torch.nn.MSELoss(size_average=False) optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) for t in range(500): y_pred = model(x) loss = loss_fn(y_pred, y) print(t, loss.data[0]) model.zero_grad() loss.backward() optimizer.step() print(model(x))
現(xiàn)在想在前向傳播時,在relu之后給x乘以一個可訓練的系數(shù),只需要在__init__函數(shù)中添加一個nn.Parameter類型變量,并在forward函數(shù)中乘以該變量即可:
class MLP(torch.nn.Module): def __init__(self): super(MLP, self).__init__() self.linear1 = torch.nn.Linear(3, 5) self.relu = torch.nn.ReLU() self.linear2 = torch.nn.Linear(5, 2) # the para to be added and updated in train phase, note that NO cuda() at last self.coefficient = torch.nn.Parameter(torch.Tensor([1.55])) def forward(self, x): x = self.linear1(x) x = self.relu(x) x = self.coefficient * x x = self.linear2(x) return x
注意,Parameter變量和Variable變量的操作大致相同,但是不能手動調(diào)用.cuda()方法將其加載在GPU上,事實上它會自動在GPU上加載,可以通過model.state_dict()或者model.named_parameters()函數(shù)查看現(xiàn)在的全部可訓練參數(shù)(包括通過繼承得到的父類中的參數(shù)):
print(model.state_dict().keys()) for i, j in model.named_parameters(): print(i) print(j)
輸出如下:
odict_keys(['linear1.weight', 'linear1.bias', 'linear2.weight', 'linear2.bias']) linear1.weight Parameter containing: -0.3582 -0.0283 0.2607 0.5190 -0.2221 0.0665 -0.2586 -0.3311 0.1927 -0.2765 0.5590 -0.2598 0.4679 -0.2923 -0.3379 [torch.cuda.FloatTensor of size 5x3 (GPU 0)] linear1.bias Parameter containing: -0.2549 -0.5246 -0.1109 0.5237 -0.1362 [torch.cuda.FloatTensor of size 5 (GPU 0)] linear2.weight Parameter containing: -0.0286 -0.3045 0.1928 -0.2323 0.2966 0.2601 0.1441 -0.2159 0.2484 0.0544 [torch.cuda.FloatTensor of size 2x5 (GPU 0)] linear2.bias Parameter containing: -0.4038 0.3129 [torch.cuda.FloatTensor of size 2 (GPU 0)]
這個參數(shù)會在反向傳播時與原有變量同時參與更新,這就達到了添加可訓練參數(shù)的目的。
如果我們有原先網(wǎng)絡的預訓練權重,現(xiàn)在添加了一個新的參數(shù),原有的權重文件自然就不能加載了,我們需要修改原權重文件,在其中添加我們的新變量的初始值。
調(diào)用model.state_dict查看我們添加的參數(shù)在參數(shù)字典中的完整名稱,然后打開原先的權重文件:
a = torch.load("OldWeights.pth") a是一個collecitons.OrderedDict類型變量,也就是一個有序字典,直接將新參數(shù)名稱和初始值作為鍵值對插入,然后保存即可。
a = torch.load("OldWeights.pth") a["layer1.0.coefficient"] = torch.FloatTensor([1.2]) a["layer1.1.coefficient"] = torch.FloatTensor([1.5]) torch.save(a, "Weights.pth")
現(xiàn)在權重就可以加載在修改后的模型上了。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“pytorch如何在網(wǎng)絡中添加可訓練參數(shù)和修改預訓練權重文件”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設計公司,關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道,更多相關知識等著你來學習!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網(wǎng)站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享題目:pytorch如何在網(wǎng)絡中添加可訓練參數(shù)和修改預訓練權重文件-創(chuàng)新互聯(lián)
分享鏈接:http://fisionsoft.com.cn/article/dgjigc.html