深度学习(6):参数初始化
·
一、任意常数初始化
将所有参数初始化为某个非零的常数(如 0.1,-1 等)。虽然不同于全0和全1,但这种方法依然不能避免对称性破坏的问题。
import torch
import torch.nn as nn
def test002():
# 2. 固定值参数初始化
linear = nn.Linear(in_features=6, out_features=4)
# 初始化权重参数
nn.init.constant_(linear.weight, 0.63)
# 打印权重参数
print(linear.weight)
pass
if __name__ == "__main__":
test002()
"""
Parameter containing:
tensor([[0.6300, 0.6300, 0.6300, 0.6300, 0.6300, 0.6300],
[0.6300, 0.6300, 0.6300, 0.6300, 0.6300, 0.6300],
[0.6300, 0.6300, 0.6300, 0.6300, 0.6300, 0.6300],
[0.6300, 0.6300, 0.6300, 0.6300, 0.6300, 0.6300]], requires_grad=True)
"""
二、随机初始化
方法:将权重初始化为随机的小值,通常从正态分布或均匀分布中采样。
应用场景:这是最基本的初始化方法,通过随机初始化避免对称性破坏。
代码演示:随机分布之均匀初始化
import torch
import torch.nn as nn
def test001():
# 1. 均匀分布随机初始化
linear = nn.Linear(in_features=6, out_features=4)
# 初始化权重参数
nn.init.uniform_(linear.weight)
# 打印权重参数
print(linear.weight)
if __name__ == "__main__":
test001()
"""
Parameter containing:
tensor([[0.4080, 0.7444, 0.7616, 0.0565, 0.2589, 0.0562],
[0.1485, 0.9544, 0.3323, 0.9802, 0.1847, 0.6254],
[0.6256, 0.2047, 0.5049, 0.3547, 0.9279, 0.8045],
[0.1994, 0.7670, 0.8306, 0.1364, 0.4395, 0.0412]], requires_grad=True)
"""
三、Xavier 初始化
也叫做Glorot初始化。
方法:根据输入和输出神经元的数量来选择权重的初始值。权重从以下分布中采样

其中 n(in)是当前层的输入神经元数量,n(out)是输出神经元数量。
优点:平衡了输入和输出的方差,适合Sigmoid 和 Tanh激活函数。
应用场景:常用于浅层网络或使用Sigmoid 、Tanh 激活函数的网络。
import torch
from torch import nn
# xavier初始化
# 核心思想:
# 1.前向传播的方差一致性
# 2.反向传播的梯度方差一致性
# 作用:
# 避免神经网络训练前期出现梯度消失或梯度爆炸
def test01():
model = nn.Linear(6,4)
#w参数:均匀分布初始化
nn.init.xavier_uniform(model.weight)
#b参数:随机初始化-均匀分布
nn.inite.uniform(model.bias)
print(model.weight)
"""
tensor([[-0.6347, 0.4248, -0.3963, 0.6780, 0.7441, -0.0334],
[ 0.2761, -0.6402, -0.2494, 0.2563, -0.2318, -0.1867],
[-0.2232, -0.1069, -0.4601, -0.5499, -0.2174, -0.7201],
[-0.6542, 0.2042, -0.5671, 0.2029, -0.2438, 0.0544]],
requires_grad=True)
"""
def test02():
model = nn.Linear(6, 4)
# w参数:正态分布初始化
nn.init.xavier_normal_(model.weight)
# b参数:随机初始化-正态分布
nn.init.normal_(model.bias)
print(model.weight)
print(model.bias)
"""
Parameter containing:
tensor([-1.1664, 1.3327, -0.9933, -1.9076], requires_grad=True)
"""
if __name__ == '__main__':
# test01()
test02()
四、He初始化
也叫kaiming 初始化。
方法:专门为 ReLU 激活函数设计。权重从以下分布中采样:

其中n(in)是当前层的输入神经元数量。
优点:适用于ReLU和 Leaky ReLU激活函数。
应用场景:深度网络,尤其是使用 ReLU 激活函数时。
import torch
from torch import nn
# He初始化(kaiming)
# 核心思想:
# 1.前向传播的方差一致性
# 2.反向传播的梯度方差一致性
# 作用:
# 避免神经网络训练前期出现梯度消失或梯度爆炸
# 两种模式:
# 1.fan_in:优先保证前向传播的方差一致性,默认
# 2.fan_out:优先保证反向传播的梯度方差一致性
def test03():
model = nn.Linear(6, 4)
# w参数:kaiming正态分布初始化
nn.init.kaiming_normal_(model.weight)
# b参数:随机正态分布初始化
nn.init.normal_(model.bias)
print(model.weight)
def test04():
model = nn.Linear(6, 4)
# w参数:kaiming均匀分布初始化
nn.init.kaiming_uniform_(model.weight)
# b参数:随机均匀分布初始化
nn.init.uniform_(model.bias)
print(model.weight)
# 当创建Linear线性层时,pytorch默认使用kaiming_uniform_对w参数进行初始化,使用uniform_对b参数进行初始化
if __name__ == '__main__':
# test03()
test04()
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)