中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • pytorch如何在網絡中添加可訓練參數和修改預訓練權重文件

pytorch如何在網絡中添加可訓練參數和修改預訓練權重文件

發布時間:2021-08-05 13:51:53 來源:億速云 閱讀:364 作者:小新 欄目:開發技術

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

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

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

# -*- 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如何在網絡中添加可訓練參數和修改預訓練權重文件”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金溪县| 莱西市| 洪泽县| 安化县| 益阳市| 依安县| 林西县| 临夏县| 湘乡市| 桑日县| 丹阳市| 安阳市| 宁蒗| 乌什县| 贵港市| 湾仔区| 杨浦区| 九龙县| 西藏| 介休市| 晋江市| 襄城县| 田阳县| 招远市| 桐庐县| 武清区| 榆林市| 宝鸡市| 墨脱县| 资兴市| 舒兰市| 独山县| 界首市| 姚安县| 湖口县| 栾城县| 县级市| 嘉黎县| 新巴尔虎左旗| 平塘县| 报价|