如何解析Pytorch基礎(chǔ)中網(wǎng)絡(luò)參數(shù)初始化問題,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)專注于二連浩特企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城建設(shè)。二連浩特網(wǎng)站建設(shè)公司,為二連浩特等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站建設(shè),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
對于模型參數(shù),我們可以進(jìn)行訪問;
由于Sequential由Module繼承而來,所以可以使用Module鐘的parameter()或者named_parameters方法來訪問所有的參數(shù);
例如,對于使用Sequential搭建的網(wǎng)絡(luò),可以使用下列for循環(huán)直接進(jìn)行遍歷:
for name, param in net.named_parameters(): print(name, param.size())
當(dāng)然,也可以使用索引來按層訪問,因?yàn)楸旧砭W(wǎng)絡(luò)也是按層搭建的:
for name, param in net[0].named_parameters(): print(name, param.size(), type(param))
當(dāng)我們獲取某一層的參數(shù)信息后,可以使用data()和grad()函數(shù)來進(jìn)行值和梯度的訪問:
weight_0 = list(net[0].parameters())[0] print(weight_0.data) print(weight_0.grad) # 反向傳播前梯度為None Y.backward() print(weight_0.grad)
當(dāng)我們參用for循環(huán)獲取每層參數(shù),可以采用如下形式對w和偏置b進(jìn)行初值設(shè)定:
for name, param in net.named_parameters(): if 'weight' in name: init.normal_(param, mean=0, std=0.01) print(name, param.data) for name, param in net.named_parameters(): if 'bias' in name: init.constant_(param, val=0) print(name, param.data)
當(dāng)然,我們也可以進(jìn)行初始化函數(shù)的自定義設(shè)置:
def init_weight_(tensor): with torch.no_grad(): tensor.uniform_(-10, 10) tensor *= (tensor.abs() >= 5).float() for name, param in net.named_parameters(): if 'weight' in name: init_weight_(param) print(name, param.data)
這里注意一下torch.no_grad()的問題;
該形式表示該參數(shù)并不隨著backward進(jìn)行更改,常常用來進(jìn)行局部網(wǎng)絡(luò)參數(shù)固定的情況;
如該連接所示:關(guān)于no_grad()
可以自定義Module類,在forward中多次調(diào)用同一個層實(shí)現(xiàn);
如上章節(jié)的代碼所示:
class FancyMLP(nn.Module): def __init__(self, **kwargs): super(FancyMLP, self).__init__(**kwargs) self.rand_weight = torch.rand((20, 20), requires_grad=False) # 不可訓(xùn)練參數(shù)(常數(shù)參數(shù)) self.linear = nn.Linear(20, 20) def forward(self, x): x = self.linear(x) # 使用創(chuàng)建的常數(shù)參數(shù),以及nn.functional中的relu函數(shù)和mm函數(shù) x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1) # 復(fù)用全連接層。等價于兩個全連接層共享參數(shù) x = self.linear(x) # 控制流,這里我們需要調(diào)用item函數(shù)來返回標(biāo)量進(jìn)行比較 while x.norm().item() > 1: x /= 2 if x.norm().item() < 0.8: x *= 10 return x.sum()
所以可以看到,相當(dāng)于同時在同一個網(wǎng)絡(luò)中調(diào)用兩次相同的Linear實(shí)例,所以變相實(shí)現(xiàn)了參數(shù)共享;
suo'yi注意一下,如果傳入Sequential模塊的多層都是同一個Module實(shí)例的話,則他們共享參數(shù);
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
當(dāng)前標(biāo)題:如何解析Pytorch基礎(chǔ)中網(wǎng)絡(luò)參數(shù)初始化問題
當(dāng)前鏈接:http://www.rwnh.cn/article28/gsphcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、ChatGPT、虛擬主機(jī)、網(wǎng)站改版、網(wǎng)站維護(hù)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)