1. 程式人生 > >pytorch自定義初始化權重

pytorch自定義初始化權重

在常見的pytorch程式碼中,我們見到的初始化方式都是呼叫init類對每層所有引數進行初始化。但是,有時我們有些特殊需求,比如用某一層的權重取優化其它層,或者手動指定某些權重的初始值。

核心思想就是構造和該層權重同一尺寸的矩陣去對該層權重賦值。但是,值得注意的是,pytorch中各層權重的資料型別是nn.Parameter,而不是Tensor或者Variable。


import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

# 第一一個卷積層,我們可以看到它的權值是隨機初始化的
w=torch.nn.Conv2d(2,2,3,padding=1)
print(w.weight)


# 第一種方法
print("1.使用另一個Conv層的權值")
q=torch.nn.Conv2d(2,2,3,padding=1) # 假設q代表一個訓練好的卷積層
print(q.weight) # 可以看到q的權重和w是不同的
w.weight=q.weight # 把一個Conv層的權重賦值給另一個Conv層
print(w.weight)

# 第二種方法
print("2.使用來自Tensor的權值")
ones=torch.Tensor(np.ones([2,2,3,3])) # 先建立一個自定義權值的Tensor,這裡為了方便將所有權值設為1
w.weight=torch.nn.Parameter(ones) # 把Tensor的值作為權值賦值給Conv層,這裡需要先轉為torch.nn.Parameter型別,否則將報錯
print(w.weight)


附:Variable和Parameter的區別

Parameter 是torch.autograd.Variable的一個字類,常被用於Module的引數。例如權重和偏置。

Parameters和Modules一起使用的時候會有一些特殊的屬性。parameters賦值給Module的屬性的時候,它會被自動加到Module的引數列表中,即會出現在Parameter()迭代器中。將Varaible賦給Module的時候沒有這樣的屬性。這可以在nn.Module的實現中詳細看一下。這樣做是為了儲存模型的時候只儲存權重偏置引數,不儲存節點值。所以複寫Variable加以區分。

另外一個不同是parameter不能設定volatile,而且require_grad預設設定為true。Varaible預設設定為False.

引數: 
parameter.data 得到tensor資料 
parameter.requires_grad 預設為True, BP過程中會求導 
Parameter一般是在Modules中作為權重和偏置,自動加入引數列表,可以進行儲存恢復。和Variable具有相同的運算。

我們可以這樣簡單區分,在計算圖中,資料(包括輸入資料和計算過程中產生的feature map等)時variable型別,該型別不會被儲存到模型中。 網路的權重是parameter型別,在計算過程中會被更新,將會被儲存到模型中。