参数初始化之 xavier作用及pytorch代码实现

本文详细介绍了神经网络中常用的权重初始化策略,包括零初始化、随机初始化以及Xavier初始化的原理、作用和公式,以PyTorch为例展示了如何在代码中实现。着重讨论了这些初始化方式对梯度传播的影响,如防止梯度消失和爆炸。
摘要由CSDN通过智能技术生成

1 零初始化

将所有的权重和偏置初始化为零。

2 随机初始化

parameters[f"W{l}"] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01 parameters[f"b{l}"] = np.zeros((layer_dims[l], 1))

3 xavier初始化

1 思路

根据每层输入和输出的神经元数量来调整权重的初始值,以确保信号在前向传播和反向传播过程中能够在不同层之间均匀传播

2 作用

意味着对于每个神经元,其输入和输出的方差应该相等,从而避免在网络的不同层之间引入过大或过小的方差,有助于缓解梯度消失或梯度爆炸问题

3 公式

eg:前一层是输入层,有100个神经元,后一层是隐藏层1本身,有80个神经元。根据公式,我们可以计算权重初始范围a:a = sqrt(6 / (100 + 80)) ≈ 0.136。现在,我们可以从均匀分布[-0.136, 0.136]中随机初始化隐藏层1的权重矩阵。

4 pytorch实现`torch.nn.init.xavier_uniform_`函数来初始化权重

import torch
import torch.nn as nn

# 定义一个5层的神经网络
class MyNetwork(nn.Module):
    def __init__(self):
        super(MyNetwork, self).__init__()
        self.fc1 = nn.Linear(100, 80)   # 隐藏层1
        self.fc2 = nn.Linear(80, 60)    # 隐藏层2
        self.fc3 = nn.Linear(60, 40)    # 隐藏层3
        self.fc4 = nn.Linear(40, 10)    # 输出层

        # 使用Xavier初始化来初始化权重
        nn.init.xavier_uniform_(self.fc1.weight)
        nn.init.xavier_uniform_(self.fc2.weight)
        nn.init.xavier_uniform_(self.fc3.weight)
        nn.init.xavier_uniform_(self.fc4.weight)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = torch.relu(self.fc3(x))
        x = self.fc4(x)
        return x

# 创建网络实例
net = MyNetwork()

# 打印网络结构和权重
print(net)
print(net.fc1.weight)
print(net.fc2.weight)
print(net.fc3.weight)
print(net.fc4.weight)

5 运行结果:

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值