1. 常见的参数初始化方式
-
均匀分布参数初始化
权重参数初始化从区间均匀随机取值。即在(-1/√d,1/√d)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量。
import torch import torch.nn.functional as F import torch.nn as nn # 1. 均匀分布随机初始化 def test01(): linear = nn.Linear(5,3) # 从0-1军训分布产生参数 nn.init.uniform_(linear.weight) print(linear.weight.data) test01()输出结果:
tensor([[0.0519, 0.6466, 0.4425, 0.0084, 0.5593], [0.9492, 0.0310, 0.6264, 0.7057, 0.5127], [0.6505, 0.3993, 0.4759, 0.7502, 0.7433]]) -
正态分布初始化
随机初始化从均值为0,标准差是1的高斯分布中取样,使用一些很小的值对参数W进行初始化。
def test02(): linear = nn.Linear(5,3) nn.init.normal_(linear.weight,mean=0,std=1) print(linear.weight.data)输出结果:
tensor([[-0.7075, 0.0591, -0.0338, -0.4440, 0.5881], [-1.1390, 0.3642, -1.0053, 0.1796, 0.2626], [-0.0512, -1.2517, 0.0404, 1.3875, 1.0531]]) -
全0初始化
将神经网络中的所有权重参数初始化为 0。
def test03(): linear = nn.Linear(5,3) nn.init.zeros_(linear.weight) print(linear.weight.data) test03()输出结果:
tensor([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]) -
全1初始化
将神经网络中的所有权重参数初始化为 1。
def test04(): linear = nn.Linear(5,3) nn.init.ones_(linear.weight) print(linear.weight.data) test04()输出结果:
tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]) -
固定值初始化
将神经网络中的所有权重参数初始化为某个固定值。
def test05(): linear = nn.Linear(5,3) nn.init.constant_(linear.weight,5) print(linear.weight.data)输出结果:
tensor([[5., 5., 5., 5., 5.], [5., 5., 5., 5., 5.], [5., 5., 5., 5., 5.]]) -
kaiming 初始化,也叫做 HE 初始化
HE 初始化分为正态分布的 HE 初始化、均匀分布的 HE 初始化。
-
正态分布的 HE 初始化:stddev = sqrt(2 / fan_in)
-
均匀分布的 HE 初始化:它从 [-limit,limit] 中的均匀分布中抽取样本, limit是 sqrt(6 / fan_in)
-
fan_in 是输入神经元个数。
def test06(): # kaiming 正太分布初始化 linear = nn.Linear(5,3) nn.init.kaiming_normal_(linear.weight) print("kaiming 正太分布初始化") print(linear.weight.data) # kaiming 均匀分布初始化 linear = nn.Linear(5, 3) nn.init.kaiming_uniform_(linear.weight) print("kaiming 均匀分布初始化") print(linear.weight.data) test06()输出结果:
kaiming 正太分布初始化 tensor([[-0.6198, -0.0808, 0.2645, -0.3550, 0.7477], [ 0.5089, -1.0295, -0.5749, 0.0841, 1.1368], [-0.9525, -0.7566, -1.2219, -1.1113, 0.5066]]) kaiming 均匀分布初始化 tensor([[ 0.8102, 0.2296, 0.7930, 0.5076, 0.2385], [ 0.2151, 0.3236, 1.0300, -0.4173, 0.1993], [ 0.3759, -0.2592, -0.9096, -0.3680, -0.5448]]) -
-
xavier 初始化,也叫做 Glorot初始化
该方法也有两种,一种是正态分布的 xavier 初始化、一种是均匀分布的 xavier 初始化。
-
正态分布的 xavier 初始化:stddev = sqrt(2 / (fan_in + fan_out))。
-
均匀分布的 xavier 初始化:[-limit,limit] 中的均匀分布中抽取样本, limit 是 sqrt(6 / (fan_in + fan_out))。
-
fan_in 是输入神经元的个数, fan_out 是输出的神经元个数。
def test07(): # xavier 正太分布初始化 linear = nn.Linear(5, 3) nn.init.xavier_normal_(linear.weight) print("xavier 正太分布初始化") print(linear.weight.data) # xavier 均匀分布初始化 linear = nn.Linear(5, 3) nn.init.xavier_uniform_(linear.weight) print("xavier 均匀分布初始化") print(linear.weight.data) test07()输出结果:
xavier 正太分布初始化 tensor([[-0.3723, 0.8458, -0.4177, -0.2791, 0.5923], [ 0.6423, -1.1029, -0.0885, 0.8489, -0.2789], [ 0.2199, 0.2240, 0.1618, 0.2031, 0.6326]]) xavier 均匀分布初始化 tensor([[-0.4944, -0.6697, 0.6152, 0.6275, -0.3991], [ 0.2024, -0.5227, -0.1500, -0.4836, -0.2145], [ 0.7836, 0.4441, 0.1632, -0.0380, -0.8434]]) -
2. 初始化方法选择
一般我们在使用 PyTorch 构建网络模型时,每个网络层的参数都有默认的初始化方法,优先选择 kaming 的初始化,xavier 初始化方式。

1954

被折叠的 条评论
为什么被折叠?



