日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch中的参数初始化方法

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch中的参数初始化方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參數初始化(Weight Initialization)

PyTorch 中參數的默認初始化在各個層的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之間的均勻分布(Uniform distribution),其中 limit 是 1. / sqrt(fan_in) ,fan_in 是指參數張量(tensor)的輸入單元的數量

下面是幾種常見的初始化方式。

Xavier Initialization

Xavier初始化的基本思想是保持輸入和輸出的方差一致,這樣就避免了所有輸出值都趨向于0。這是通用的方法,適用于任何激活函數。

# 默認方法 for m in model.modules():if isinstance(m, (nn.Conv2d, nn.Linear)):nn.init.xavier_uniform_(m.weight)

也可以使用?gain?參數來自定義初始化的標準差來匹配特定的激活函數:

for m in model.modules():if isinstance(m, (nn.Conv2d, nn.Linear)):nn.init.xavier_uniform_(m.weight(), gain=nn.init.calculate_gain('relu'))

參考資料:

  • Understanding the difficulty of training deep feedforward neural networks

He et. al Initialization

torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

He initialization的思想是:在ReLU網絡中,假定每一層有一半的神經元被激活,另一半為0。推薦在ReLU網絡中使用。

# he initialization for m in model.modules():if isinstance(m, (nn.Conv2d, nn.Linear)):nn.init.kaiming_normal_(m.weight, mode='fan_in')

正交初始化(Orthogonal Initialization)

主要用以解決深度網絡下的梯度消失、梯度爆炸問題,在RNN中經常使用的參數初始化方法。

for m in model.modules():if isinstance(m, (nn.Conv2d, nn.Linear)):nn.init.orthogonal(m.weight)

Batchnorm Initialization

在非線性激活函數之前,我們想讓輸出值有比較好的分布(例如高斯分布),以便于計算梯度和更新參數。Batch Normalization 將輸出值強行做一次 Gaussian Normalization 和線性變換:

實現方法:

for m in model:if isinstance(m, nn.BatchNorm2d):nn.init.constant(m.weight, 1)nn.init.constant(m.bias, 0)

單層初始化

conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3) nn.init.xavier_uniform(conv1.weight) nn.init.constant(conv1.bias, 0.1)

模型初始化

def weights_init(m):classname = m.__class__.__name__if classname.find('Conv2d') != -1:nn.init.xavier_normal_(m.weight.data)nn.init.constant_(m.bias.data, 0.0)elif classname.find('Linear') != -1:nn.init.xavier_normal_(m.weight)nn.init.constant_(m.bias, 0.0) net = Net() net.apply(weights_init) #apply函數會遞歸地搜索網絡內的所有module并把參數表示的函數應用到所有的module上。

不建議訪問以下劃線為前綴的成員,他們是內部的,如果有改變不會通知用戶。更推薦的一種方法是檢查某個module是否是某種類型:

def weights_init(m):if isinstance(m, (nn.Conv2d, nn.Linear)):nn.init.xavier_normal_(m.weight)nn.init.constant_(m.bias, 0.0)

各種初始化方法:

import torch import torch.nn as nnw = torch.empty(2, 3)# 1. 均勻分布 - u(a,b) # torch.nn.init.uniform_(tensor, a=0, b=1) nn.init.uniform_(w) # tensor([[ 0.0578, 0.3402, 0.5034], # [ 0.7865, 0.7280, 0.6269]])# 2. 正態分布 - N(mean, std) # torch.nn.init.normal_(tensor, mean=0, std=1) nn.init.normal_(w) # tensor([[ 0.3326, 0.0171, -0.6745], # [ 0.1669, 0.1747, 0.0472]])# 3. 常數 - 固定值 val # torch.nn.init.constant_(tensor, val) nn.init.constant_(w, 0.3) # tensor([[ 0.3000, 0.3000, 0.3000], # [ 0.3000, 0.3000, 0.3000]])# 4. 對角線為 1,其它為 0 # torch.nn.init.eye_(tensor) nn.init.eye_(w) # tensor([[ 1., 0., 0.], # [ 0., 1., 0.]])# 5. Dirac delta 函數初始化,僅適用于 {3, 4, 5}-維的 torch.Tensor # torch.nn.init.dirac_(tensor) w1 = torch.empty(3, 16, 5, 5) nn.init.dirac_(w1)# 6. xavier_uniform 初始化 # torch.nn.init.xavier_uniform_(tensor, gain=1) # From - Understanding the difficulty of training deep feedforward neural networks - Bengio 2010 nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu')) # tensor([[ 1.3374, 0.7932, -0.0891], # [-1.3363, -0.0206, -0.9346]])# 7. xavier_normal 初始化 # torch.nn.init.xavier_normal_(tensor, gain=1) nn.init.xavier_normal_(w) # tensor([[-0.1777, 0.6740, 0.1139], # [ 0.3018, -0.2443, 0.6824]])# 8. kaiming_uniform 初始化 # From - Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification - HeKaiming 2015 # torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu') nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu') # tensor([[ 0.6426, -0.9582, -1.1783], # [-0.0515, -0.4975, 1.3237]])# 9. kaiming_normal 初始化 # torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu') nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu') # tensor([[ 0.2530, -0.4382, 1.5995], # [ 0.0544, 1.6392, -2.0752]])# 10. 正交矩陣 - (semi)orthogonal matrix # From - Exact solutions to the nonlinear dynamics of learning in deep linear neural networks - Saxe 2013 # torch.nn.init.orthogonal_(tensor, gain=1) nn.init.orthogonal_(w) # tensor([[ 0.5786, -0.5642, -0.5890], # [-0.7517, -0.0886, -0.6536]])# 11. 稀疏矩陣 - sparse matrix # 非零元素采用正態分布 N(0, 0.01) 初始化. # From - Deep learning via Hessian-free optimization - Martens 2010 # torch.nn.init.sparse_(tensor, sparsity, std=0.01) nn.init.sparse_(w, sparsity=0.1) # tensor(1.00000e-03 * # [[-0.3382, 1.9501, -1.7761], # [ 0.0000, 0.0000, 0.0000]])

Xavier均勻分布

torch.nn.init.xavier_uniform_(tensor, gain=1) xavier初始化方法中服從均勻分布U(?a,a) ,分布的參數a = gain * sqrt(6/fan_in+fan_out), 這里有一個gain,增益的大小是依據激活函數類型來設定 eg:nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain(‘relu’)) PS:上述初始化方法,也稱為Glorot initialization""" torch.nn.init.xavier_uniform_(tensor, gain=1) 根據Glorot, X.和Bengio, Y.在“Understanding the dif×culty of training deep feedforward neural networks”中描述的方法,用一個均勻分布生成值,填充輸入的張量或變量。結果張量中的值 采樣自U(-a, a),其中a= gain * sqrt( 2/(fan_in + fan_out))* sqrt(3). 該方法也被稱為Glorot initialisat參數: tensor – n維的torch.Tensor gain - 可選的縮放因子 """ import torch from torch import nn w=torch.Tensor(3,5) nn.init.xavier_uniform_(w,gain=1) print(w)

Xavier正態分布

torch.nn.init.xavier_normal_(tensor, gain=1) xavier初始化方法中服從正態分布, mean=0,std = gain * sqrt(2/fan_in + fan_out)kaiming初始化方法,論文在《 Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification》,公式推導同樣從“方差一致性”出法,kaiming是針對xavier初始化方法在relu這一類激活函數表現不佳而提出的改進,詳細可以參看論文。""" 根據Glorot, X.和Bengio, Y. 于2010年在“Understanding the dif×culty of training deep feedforward neural networks”中描述的方法,用一個正態分布生成值,填充輸入的張量或變 量。結果張量中的值采樣自均值為0,標準差為gain * sqrt(2/(fan_in + fan_out))的正態分布。 也被稱為Glorot initialisation. 參數: tensor – n維的torch.Tensor gain - 可選的縮放因子 """b=torch.Tensor(3,4) nn.init.xavier_normal_(b, gain=1) print(b)

kaiming均勻分布

torch.nn.init.kaiming_uniform_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’) 此為均勻分布,U~(-bound, bound), bound = sqrt(6/(1+a^2)*fan_in) 其中,a為激活函數的負半軸的斜率,relu是0 mode- 可選為fan_in 或 fan_out, fan_in使正向傳播時,方差一致; fan_out使反向傳播時,方差一致 nonlinearity- 可選 relu 和 leaky_relu ,默認值為 。 leaky_relu nn.init.kaiming_uniform_(w, mode=‘fan_in’, nonlinearity=‘relu’)w=torch.Tensor(3,5) nn.init.kaiming_uniform_(w,a=0,mode='fan_in') print(w)

kaiming正態分布

torch.nn.init.kaiming_normal_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’) 此為0均值的正態分布,N~ (0,std),其中std = sqrt(2/(1+a^2)*fan_in) 其中,a為激活函數的負半軸的斜率,relu是0 mode- 可選為fan_in 或 fan_out, fan_in使正向傳播時,方差一致;fan_out使反向傳播時,方差一致 nonlinearity- 可選 relu 和 leaky_relu ,默認值為 。 leaky_relu nn.init.kaiming_normal_(w, mode=‘fan_out’, nonlinearity=‘relu’)

2.其他

均勻分布初始化


?torch.nn.init.uniform_(tensor, a=0, b=1)
使值服從均勻分布U(a,b)

tensor - n維的torch.Tensor
a - 均勻分布的下界
b - 均勻分布的上界

?

正態分布初始化


torch.nn.init.normal_(tensor, mean=0, std=1)
使值服從正態分布N(mean, std),默認值為0,1

tensor – n維的torch.Tensor
mean – 正態分布的均值
std – 正態分布的標準差

?

常數初始化


torch.nn.init.constant_(tensor, val)
使值為常數val nn.init.constant_(w, 0.3)

""" torch.nn.init.constant(tensor, val) 用val的值填充輸入的張量或變量 參數: tensor – n維的torch.Tensor或autograd.Variable val – 用來填充張量的值 """ w=torch.Tensor(3,5) nn.init.constant_(w,1.2) print(w) tensor([[1.2000, 1.2000, 1.2000, 1.2000, 1.2000],[1.2000, 1.2000, 1.2000, 1.2000, 1.2000],[1.2000, 1.2000, 1.2000, 1.2000, 1.2000]])

單位矩陣初始化

torch.nn.init.eye_(tensor)
將二維tensor初始化為單位矩陣(the identity matrix)

""" torch.nn.init.eye(tensor) 用單位矩陣來填充2維輸入張量或變量。在線性層盡可能多的保存輸入特性。 參數: tensor – 2維的torch.Tensor或autograd.Variable """ w=torch.Tensor(3,5) nn.init.eye_(w) print(w) tensor([[1., 0., 0., 0., 0.],[0., 1., 0., 0., 0.],[0., 0., 1., 0., 0.]])

正交初始化


torch.nn.init.orthogonal_(tensor, gain=1)
使得tensor是正交的,論文:Exact solutions to the nonlinear dynamics of learning in deep linear neural networks” - Saxe, A. et al. (2013)
?

""" torch.nn.init.orthogonal_(tensor, gain=1) 25 torch.nn.init - PyTorch中文文檔 https://pytorch-cn.readthedocs.io/zh/latest/package_references/nn_init/ 5/5 用(半)正交矩陣填充輸入的張量或變量。輸入張量必須至少是2維的,對于更高維度的張 量,超出的維度會被展平,視作行等于第一個維度,列等于稀疏矩陣乘積的2維表示。其中非 零元素生成自均值為0,標準差為std的正態分布。參數: tensor – n維的torch.Tensor或 autograd.Variable,其中n>=2 gain -可選 """ w = torch.Tensor(3, 5) nn.init.orthogonal_(w) print(w)

稀疏初始化


torch.nn.init.sparse_(tensor, sparsity, std=0.01)
從正態分布N~(0. std)中進行稀疏化,使每一個column有一部分為0
sparsity- 每一個column稀疏的比例,即為0的比例_

sparsity - 每列中需要被設置成零的元素比例
std - 用于生成非零值的正態分布的標準差
nn.init.sparse_(w, sparsity=0.1)

w = torch.Tensor(3, 5) nn.init.sparse_(w, sparsity=0.1) print(w)tensor([[-0.0042, 0.0000, 0.0000, -0.0016, 0.0000],[ 0.0000, 0.0050, 0.0082, 0.0000, 0.0003],[ 0.0018, -0.0016, -0.0003, -0.0068, 0.0103]])

dirac

""" torch.nn.init.dirac(tensor) 用Dirac 函數來填充{3, 4, 5}維輸入張量或變量。在卷積層盡可能多的保存輸入通道特性 參數: tensor – {3, 4, 5}維的torch.Tensor或autograd.Variable """ w=torch.Tensor(3,16,5,5) nn.init.dirac_(w) print(w)w.sum() tensor(3.)

計算增益calculate_gain

torch.nn.init.calculate_gain(nonlinearity, param=None)

torch.nn.init.calculate_gain(nonlinearity,param=None) 對于給定的非線性函數,返回推薦的增益值. 參數: nonlinearity - 非線性函數( nn.functional 名稱) param - 非線性函數的可選參數from torch import nn import torch gain = nn.init.calculate_gain('leaky_relu') print(gain)1.4141428569978354 nonlinearitygain
Linear / Identity1
Conv{1,2,3}D1
Sigmoid1
Tanh5/3
ReLUsqrt(2)

總結

以上是生活随笔為你收集整理的pytorch中的参数初始化方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。