pytorch學習 | 提取參數(shù)及自定義初始化
點擊上方“程序員大白”,選擇“星標”公眾號
重磅干貨,第一時間送達
導讀
?pytorch實踐中,有時提取出的層結構并不夠,還需要對里面的參數(shù)進行初始化,那么如何提取出網絡的參數(shù)并對其初始化呢?
有時候提取出的層結構并不夠,還需要對里面的參數(shù)進行初始化,那么如何提取出網絡的參數(shù)并對其初始化呢?
首先 nn.Module 里面有兩個特別重要的關于參數(shù)的屬性,分別是 named_parameters()和 parameters()。named_parameters() 是給出網絡層的名字和參數(shù)的迭代器,parameters()會給出一個網絡的全部參數(shù)的選代器。
import?os
import?torch
import?torch.nn?as?nn
import?torch.optim?as?optim
import?torch.backends.cudnn?as?cudnn
import?torch.nn.init?as?init
import?argparse
import?torch.autograd.variable?as?variable
class?SimpleCNN(nn.Module):
????def?__init__(self):
????????super(SimpleCNN,self).__init__()??#b,3,32,32
????????layer1=nn.Sequential()
????????layer1.add_module('conv1',nn.Conv2d(in_channels=3,out_channels=32,kernel_size=3,stride=1,padding=1))
????????#b,32,32,32
????????layer1.add_module('relu1',nn.ReLU(True))
????????layer1.add_module('pool1',nn.MaxPool2d(2,2))
????????#b,32,16,16
????????self.layer1=layer1
????????layer2=nn.Sequential()
????????layer1.add_module('conv2',nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,stride=1,padding=1))
????????#b,64,16,16
????????layer2.add_module('relu2',nn.ReLU(True))
????????layer2.add_module('pool2',nn.MaxPool2d(2,2))
????????#b,64,8,8
????????self.layer2=layer2
????????layer3=nn.Sequential()
????????layer3.add_module('conv3',?nn.Conv2d(in_channels=64,?out_channels=128,?kernel_size=3?,stride=1,?padding?=?1))?
????????#b,128,8,8
????????layer3.add_module('relu3',?nn.ReLU(True))
????????layer3.add_module('poo13',?nn.MaxPool2d(2,?2))#b,128,4,4
????????self.layer3=layer3
????????layer4?=nn.Sequential()
????????layer4.add_module('fc1',nn.Linear(in_features=2048,?out_features=512?))
????????layer4.add_module('fc_relu1',?nn.ReLU(True))
????????layer4.add_module('fc2?',?nn.Linear(in_features=512,?out_features=64?))
????????layer4.add_module('fc_relu2',?nn.ReLU(True))
????????layer4.add_module('fc3',?nn.Linear(64,?10))
????????self.layer4?=?layer4
????def?forward(self,x):
????????conv1=self.layer1(x)
????????conv2=self.layer2(conv1)
????????conv3=self.layer3(conv2)
????????fc_input=conv3.view(conv3.size(0),-1)
????????fc_output=self.layer4(fc_input)
????return?fc_output
model=SimpleCNN()
for?param?in?model.named_parameters():
????print(param[0])
可以得到每一層參數(shù)的名字,輸出為

如何對權重做初始化呢 ? 非常簡單,因為權重是一個 Variable ,所以只需要取出其中的 data 屬性,然后對它進行所需要的處理就可以了。
for?m?in?model.modules():
????if?isinstance(m,nn.Conv2d):
????????init.normal(m.weight.data)?#通過正態(tài)分布填充張量
????????init.xavier_normal(m.weight.data)?
#xavier均勻分布的方法來init,來自2010年的論文“Understanding?the?difficulty?of?training?deep?feedforward?neural?networks”
????????init.kaiming_normal(m.weight.data)?
#來自2015年何凱明的論文“Delving?deep?into?rectifiers:?Surpassing?human-level?performance?on?ImageNet?classification”
????????m.bias.data.fill_(0)
????elif?isinstance(m,nn.Linear):
????????m.weight.data.normal_()
通過上面的操作,對將卷積層中使用 PyTorch 里面提供的方法的權重進行初始化,這樣就能夠使用任意我們想使用的初始化,甚至我們可以自己定義初始化方法并對權重進行初始化 。
更多初始化方法參考【torch.nn.init】https://pytorch-cn.readthedocs.io/zh/latest/package_references/nn_init/
推薦閱讀
關于程序員大白
程序員大白是一群哈工大,東北大學,西湖大學和上海交通大學的碩士博士運營維護的號,大家樂于分享高質量文章,喜歡總結知識,歡迎關注[程序員大白],大家一起學習進步!
評論
圖片
表情


