💻 源码
"""
案例:
    演示 参数初始化 方法
是什么:
    创建神经网络时,初始化网络层的参数
注意:
    实际工程中,pytorch神经网络会自动进行参数初始化,一般不需要手动参数初始化
参数初始化的作用:
    1. 防止 梯度消失 或 梯度爆炸
    2. 提高收敛速度
    3. 打破对称性:如果所有神经元的参数都一样,则输入数据经过前向传播得到结果相同,再反向传播时,得到的梯度相同。梯度下降法(W新 = W旧 - 学习率*梯度)更新后参数还是相同,无法训练网络
参数初始化的方法:
    1. 均匀分布初始化
    2. 正态分布初始化
    3. 全0初始化
    4. 全1初始化
    5. 固定值初始化
    6. kaiming 初始化,也叫做 HE 初始化
        正态分布的he初始化
        均匀分布的he初始化
    7. xavier 初始化,也叫做 Glorot初始化
        正态化的Xavier初始化
        均匀分布的Xavier初始化
需要掌握:
    无
总结:
    一般采用pytorch默认初始化方法,不需要手动初始化
    极少数场景,手动参数初始化:
        权重w:
            relu网络: kaiming
            非relu网络: Xavier
        偏置b:
            全0:1.简单;2.计算快

"""
# 导包
import torch.nn as nn

# 1.定义函数,演示 均匀分布初始化
def demo01():
    print("均匀分布初始化")
    # 1.定义一个线性层,输入维度3,输出维度5
    linear = nn.Linear(3,5)
    # 2.对权重w进行初始化
    nn.init.uniform_(linear.weight)
    # 3.对偏置b进行初始化
    nn.init.uniform_(linear.bias)
    # 4.打印权重和偏置
    print(f"w:{linear.weight}, shape: {linear.weight.shape}")
    print(f"b:{linear.bias}, shape: {linear.bias.shape}")
    ...

# 2.定义函数,演示 正态分布初始化
def demo02():
    print("正态分布初始化")
    # 1.定义一个线性层,输入维度3,输出维度5
    linear = nn.Linear(3,5)
    # 2.对权重w进行初始化
    nn.init.normal_(linear.weight)
    # 3.对偏置b进行初始化
    nn.init.normal_(linear.bias)
    # 4.打印权重和偏置
    print(f"w:{linear.weight}, shape: {linear.weight.shape}")
    print(f"b:{linear.bias}, shape: {linear.bias.shape}")
    ...

# 3.定义函数,演示 全0分布初始化
def demo03():
    print("全0分布初始化")
    # 1.定义一个线性层,输入维度3,输出维度5
    linear = nn.Linear(3,5)
    # 2.对权重w进行初始化
    # nn.init.normal_(linear.weight)
    # 3.对偏置b进行初始化
    nn.init.zeros_(linear.bias) # inplace=True
    # 4.打印权重和偏置
    # print(f"w:{linear.weight}, shape: {linear.weight.shape}")
    print(f"b:{linear.bias}, shape: {linear.bias.shape}")
    ...

# 4.定义函数,演示 kaiming初始化
def demo04():
    print("kaiming初始化")
    # 1.定义一个线性层,输入维度3,输出维度5
    linear = nn.Linear(3,5)
    # 2.对权重w进行初始化,kaiming正态初始化
    nn.init.kaiming_normal_(linear.weight)
    # 3.打印权重和偏置
    print(f"正态:\nw:{linear.weight}, shape: {linear.weight.shape}")
    # # print(f"b:{linear.bias}, shape: {linear.bias.shape}")
    # 4.对权重w进行初始化,kaiming均匀初始化
    nn.init.kaiming_uniform_(linear.weight)
    print(f"均匀:\nw:{linear.weight}, shape: {linear.weight.shape}")
    ...

# 5.定义函数,演示 xavier初始化
def demo05():
    print("xavier初始化")
    # 1.定义一个线性层,输入维度3,输出维度5
    linear = nn.Linear(3,5)
    # 2.对权重w进行初始化,xavier正态初始化
    nn.init.xavier_normal_(linear.weight)
    # 3.打印权重和偏置
    print(f"正态:\nw:{linear.weight}, shape: {linear.weight.shape}")
    # print(f"b:{linear.bias}, shape: {linear.bias.shape}")
    # 4.对权重w进行初始化,xavier均匀初始化
    nn.init.xavier_uniform_(linear.weight)
    print(f"均匀\nw:{linear.weight}, shape: {linear.weight.shape}")
    ...

# 测试
if __name__ == '__main__':
    # demo01()
    # demo02()
    # demo03()
    demo04()
    demo05()