<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • pytorch如何在網絡中添加可訓練參數和修改預訓練權重文件-創(chuàng)新互聯

            這篇文章主要介紹了pytorch如何在網絡中添加可訓練參數和修改預訓練權重文件,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

            網站的建設成都創(chuàng)新互聯專注網站定制,經驗豐富,不做模板,主營網站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設計體驗!已為工商代辦等企業(yè)提供專業(yè)服務。

            實踐中,針對不同的任務需求,我們經常會在現成的網絡結構上做一定的修改來實現特定的目的。

            假如我們現在有一個簡單的兩層感知機網絡:

            # -*- 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))

            現在想在前向傳播時,在relu之后給x乘以一個可訓練的系數,只需要在__init__函數中添加一個nn.Parameter類型變量,并在forward函數中乘以該變量即可:

            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變量的操作大致相同,但是不能手動調用.cuda()方法將其加載在GPU上,事實上它會自動在GPU上加載,可以通過model.state_dict()或者model.named_parameters()函數查看現在的全部可訓練參數(包括通過繼承得到的父類中的參數):

            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)]

            這個參數會在反向傳播時與原有變量同時參與更新,這就達到了添加可訓練參數的目的。

            如果我們有原先網絡的預訓練權重,現在添加了一個新的參數,原有的權重文件自然就不能加載了,我們需要修改原權重文件,在其中添加我們的新變量的初始值。

            調用model.state_dict查看我們添加的參數在參數字典中的完整名稱,然后打開原先的權重文件:

            a = torch.load("OldWeights.pth") a是一個collecitons.OrderedDict類型變量,也就是一個有序字典,直接將新參數名稱和初始值作為鍵值對插入,然后保存即可。

            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")

            現在權重就可以加載在修改后的模型上了。

            感謝你能夠認真閱讀完這篇文章,希望小編分享的“pytorch如何在網絡中添加可訓練參數和修改預訓練權重文件”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯成都網站設計公司,關注創(chuàng)新互聯成都網站設計公司行業(yè)資訊頻道,更多相關知識等著你來學習!

            另外有需要云服務器可以了解下創(chuàng)新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

            分享題目:pytorch如何在網絡中添加可訓練參數和修改預訓練權重文件-創(chuàng)新互聯
            文章轉載:http://www.jbt999.com/article12/dgjigc.html

            成都網站建設公司_創(chuàng)新互聯,為您提供靜態(tài)網站、小程序開發(fā)、企業(yè)建站、全網營銷推廣、做網站、外貿網站建設

            廣告

            聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

            手機網站建設

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 日韩精品国产无码 | 啪啪婷婷五月天 | 一级免费卜片 | 手机看片自拍 | 99国产一区 |