文章目录
- 1、常见初始化方法
- 2、代码
- 2.1、导包:
- 2.2、均匀分布随机初始化
- 2.3、固定初始化
- 2.4、全0初始化
- 2.5、全1初始化
- 2.6、正态分布随机初始化
- 2.7、kaiming 初始化
- 2.8、xavier 初始化
- 2.9、完整代码
- 3、小节
🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹
🛸神经网络参数初始化的相关数学公式:https://xzl-tech.blog.csdn.net/article/details/140745341
1、常见初始化方法
我们在构建网络之后,网络中的参数是需要初始化的。
我们需要初始化的参数主要有权重和偏置:
偏重一般初始化为 0 即可,
而对权重的初始化则会更加重要
下面是几种常见初始化方法!
- 均匀分布初始化,权重参数初始化从区间均匀随机取值。即在 [ E = ( − 1 d , 1 d ) ] [ \mathbb{E} = \left( -\frac{1}{\sqrt{d}}, \frac{1}{\sqrt{d}} \right) ] [E=(−d1,d1)]均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量。
- 正态分布初始化,随机初始化从 **均值为0,标准差是1 **的高斯分布中取样,使用一些很小的值对参数 w w w进行初始化.
- 全0初始化,将神经网络中的所有权重参数初始化为 0
- 全1初始化,将神经网络中的所有权重参数初始化为 1
- 固定值初始化,将神经网络中的所有权重参数初始化为某个固定值
- kaiming 初始化,也叫做 HE 初始化。HE 初始化分为正态分布的 HE 初始化、均匀分布的 HE 初始化
- xavier 初始化,也叫做Glorot初始化,该方法的基本思想是各层的激活值和梯度的方差在传播过程中保持一致。它有两种,一种是正态分布的 xavier 初始化、一种是均匀分布的 xavier 初始化
2、代码
2.1、导包:
2.2、均匀分布随机初始化
2.3、固定初始化
2.4、全0初始化
2.5、全1初始化
2.6、正态分布随机初始化
2.7、kaiming 初始化
2.8、xavier 初始化
2.9、完整代码
# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/28 3:33
import torch.nn as nn # 导入PyTorch的神经网络模块# 1、均匀分布随机初始化
def test01():linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.uniform_(linear.weight) # 使用均匀分布初始化权重print(linear.weight.data) # 打印初始化后的权重# 2、固定初始化
def test02():linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.constant_(linear.weight, 5) # 使用常数值5初始化权重print(linear.weight.data) # 打印初始化后的权重# 3、全0初始化
def test03():linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.zeros_(linear.weight) # 使用全0值初始化权重print(linear.weight.data) # 打印初始化后的权重# 4、全1初始化
def test04():linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.ones_(linear.weight) # 使用全1值初始化权重print(linear.weight.data) # 打印初始化后的权重# 5、正态分布随机初始化
def test05():linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.normal_(linear.weight, mean=0, std=1) # 使用均值为0,标准差为1的正态分布初始化权重print(linear.weight.data) # 打印初始化后的权重# 6、kaiming 初始化
def test06():# kaiming 正态分布初始化linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.kaiming_normal_(linear.weight) # 使用kaiming正态分布初始化权重print(linear.weight.data) # 打印初始化后的权重# kaiming 均匀分布初始化linear = nn.Linear(5, 3) # 再定义一个线性层,输入大小为5,输出大小为3nn.init.kaiming_uniform_(linear.weight) # 使用kaiming均匀分布初始化权重print(linear.weight.data) # 打印初始化后的权重# 7、xavier 初始化
def test07():# xavier 正态分布初始化linear = nn.Linear(5, 3) # 定义一个线性层,输入大小为5,输出大小为3nn.init.xavier_normal_(linear.weight) # 使用xavier正态分布初始化权重print(linear.weight.data) # 打印初始化后的权重# xavier 均匀分布初始化linear = nn.Linear(5, 3) # 再定义一个线性层,输入大小为5,输出大小为3nn.init.xavier_uniform_(linear.weight) # 使用xavier均匀分布初始化权重print(linear.weight.data) # 打印初始化后的权重if __name__ == '__main__': # 主程序入口test01() # 均匀分布随机初始化test02() # 固定初始化test03() # 全0初始化test04() # 全1初始化test05() # 正态分布随机初始化test06() # kaiming 初始化test07() # xavier 初始化
3、小节
网络构建完成之后,需要对网络参数进行初始化。
常见的初始化方法有随机初始化、全0初始化、全1初始化、Kaiming 初始化、Xavier 初始化等,
一般在使用 PyTorch 构建网络模型时,每个网络层的参数都有默认的初始化方法。