Pytorch 實(shí)現(xiàn)權(quán)重初始化
在TensorFlow中,權(quán)重的初始化主要是在聲明張量的時(shí)候進(jìn)行的。 而PyTorch則提供了另一種方法:首先應(yīng)該聲明張量,然后修改張量的權(quán)重。通過(guò)調(diào)用torch.nn.init包中的多種方法可以將權(quán)重初始化為直接訪(fǎng)問(wèn)張量的屬性。
1、不初始化的效果
在Pytorch中,定義一個(gè)tensor,不進(jìn)行初始化,打印看看結(jié)果:
w = torch.Tensor(3,4) print (w)
可以看到這時(shí)候的初始化的數(shù)值都是隨機(jī)的,而且特別大,這對(duì)網(wǎng)絡(luò)的訓(xùn)練必定不好,最后導(dǎo)致精度提不上,甚至損失無(wú)法收斂。
2、初始化的效果
PyTorch提供了多種參數(shù)初始化函數(shù):
torch.nn.init.constant(tensor, val) torch.nn.init.normal(tensor, mean=0, std=1) torch.nn.init.xavier_uniform(tensor, gain=1)
等等。詳細(xì)請(qǐng)參考:http://pytorch.org/docs/nn.html#torch-nn-init
注意上面的初始化函數(shù)的參數(shù)tensor,雖然寫(xiě)的是tensor,但是也可以是Variable類(lèi)型的。而神經(jīng)網(wǎng)絡(luò)的參數(shù)類(lèi)型Parameter是Variable類(lèi)的子類(lèi),所以初始化函數(shù)可以直接作用于神經(jīng)網(wǎng)絡(luò)參數(shù)。實(shí)際上,我們初始化也是直接去初始化神經(jīng)網(wǎng)絡(luò)的參數(shù)。
讓我們?cè)囋囆Ч?
w = torch.Tensor(3,4) torch.nn.init.normal_(w) print (w)
3、初始化神經(jīng)網(wǎng)絡(luò)的參數(shù)
對(duì)神經(jīng)網(wǎng)絡(luò)的初始化往往放在模型的__init__()函數(shù)中,如下所示:
class Net(nn.Module):
def __init__(self, block, layers, num_classes=1000):
self.inplanes = 64
super(Net, self).__init__()
***
*** #定義自己的網(wǎng)絡(luò)層
***
for m in self.modules():
if isinstance(m, nn.Conv2d):
n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
m.weight.data.normal_(0, math.sqrt(2. / n))
elif isinstance(m, nn.BatchNorm2d):
m.weight.data.fill_(1)
m.bias.data.zero_()
***
*** #定義后續(xù)的函數(shù)
***
也可以采取另一種方式:
定義一個(gè)權(quán)重初始化函數(shù),如下:
def weights_init(m):
classname = m.__class__.__name__
if classname.find('Conv2d') != -1:
init.xavier_normal_(m.weight.data)
init.constant_(m.bias.data, 0.0)
elif classname.find('Linear') != -1:
init.xavier_normal_(m.weight.data)
init.constant_(m.bias.data, 0.0)
在模型聲明時(shí),調(diào)用初始化函數(shù),初始化神經(jīng)網(wǎng)絡(luò)參數(shù):
model = Net(*****) model.apply(weights_init)
以上這篇Pytorch 實(shí)現(xiàn)權(quán)重初始化就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python urls.py的三種配置寫(xiě)法實(shí)例詳解
這篇文章主要介紹了Python urls.py的三種配置寫(xiě)法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
python?類(lèi)型轉(zhuǎn)換函數(shù)示例詳解
這篇文章主要介紹了python?類(lèi)型轉(zhuǎn)換函數(shù)示例詳解,通過(guò)float()將一個(gè)字符串或數(shù)字轉(zhuǎn)換為浮點(diǎn)數(shù),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05
Python openpyxl 遍歷所有sheet 查找特定字符串的方法
今天小編就為大家分享一篇Python openpyxl 遍歷所有sheet 查找特定字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
淺談Python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入
數(shù)據(jù)導(dǎo)入是所有數(shù)模編程的第一步,比你想象的更重要。Python 語(yǔ)言中數(shù)據(jù)導(dǎo)入的方法很多。對(duì)于數(shù)學(xué)建模問(wèn)題編程來(lái)說(shuō),選擇什么方法最好呢?答案是:沒(méi)有最好的,只有最合適的。對(duì)于不同的問(wèn)題,不同的算法,以及所調(diào)用工具包的不同實(shí)現(xiàn)方法,對(duì)于數(shù)據(jù)就會(huì)有不同的要求2021-06-06
xpath無(wú)法定位tbody標(biāo)簽解決方法示例
這篇文章主要介紹了xpath無(wú)法定位tbody標(biāo)簽解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
關(guān)于Python 3中print函數(shù)的換行詳解
最近在學(xué)習(xí)python3,發(fā)現(xiàn)了一個(gè)問(wèn)題想著總結(jié)出來(lái),所以下面這篇文章主要給大家介紹了關(guān)于Python 3中print函數(shù)換行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)需要的朋友們具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
在Python中使用AOP實(shí)現(xiàn)Redis緩存示例
本篇文章主要介紹了在Python中使用AOP實(shí)現(xiàn)Redis緩存示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
python爬蟲(chóng)請(qǐng)求頭設(shè)置代碼
在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲(chóng)請(qǐng)求頭如何設(shè)置內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-07-07
PyTorch使用GPU訓(xùn)練的兩種方法實(shí)例
pytorch是一個(gè)非常優(yōu)秀的深度學(xué)習(xí)的框架,具有速度快,代碼簡(jiǎn)潔,可讀性強(qiáng)的優(yōu)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于PyTorch使用GPU訓(xùn)練的兩種方法,需要的朋友可以參考下2022-05-05

