tensorflow中常用的几种权重矩阵初始化的方式

本文介绍了三种常见的权重矩阵初始化方法:截断的正态分布、Xavier 初始化器以及 CS231n 推荐的初始化方法,并给出了具体的实现代码示例。

这里总结几种权重矩阵的初始化方式:

1:截断的正态分布:

def init_matrix(shape):
    return tf.truncated_normal(shape, mean=0, stddev=0.1)

2.xavier_initializer()法:这个初始化器是用来保持每一层的梯度大小都差不多相同

W = tf.get_variable("W", shape=[784, 100],
                initializer=tf.contrib.layers.xavier_initializer())

3.cs231n推荐:

w=np.random.randn(in,out)/np.sqrt(2.0/in)#in,out为输入输出的神经元个数

使用:
W1_init = np.random.randn(784, 100).astype(np.float32) * np.sqrt(2.0/(784))
b1_init = np.zeros([100]).astype(np.float32)
W2_init = np.random.randn(100, 100).astype(np.float32) * np.sqrt(2.0/(100))
b2_init = np.zeros([100]).astype(np.float32)
W3_init = np.random.randn(100, 10).astype(np.float32) * np.sqrt(2.0/(100))
b3_init = np.zeros([10]).astype(np.float32)
W_inits = [W1_init, b1_init, W2_init, b2_init, W3_init, b3_init]
### 全连接层中权重矩阵的获取方式 在深度学习中,全连接层(Fully Connected Layer)的权重矩阵初始化是模型训练过程中的关键步骤。权重矩阵初始化方式直接影响到网络的收敛速度和最终性能。以下是关于权重矩阵计算方法、初始化以及获取方式的详细说明。 #### 权重矩阵初始化策略 权重矩阵初始化策略需要确保网络信号既不会被过分放大也不会被过分减弱,从而保持输入和输出的方差一致[^2]。此外,为了加快训练速度并避免梯度消失或梯度爆炸问题,权重矩阵的均值通常设置为0[^2]。 常见的权重初始化方法包括以下几种: 1. **随机初始化** 随机初始化是最基本的方法,其中权重从一个特定分布中抽取。例如,可以从正态分布 \( \mathcal{N}(0, \sigma^2) \) 中抽取权重值[^4]。然而,这种方法可能无法适应复杂的网络结构。 2. **Xavier/Glorot 初始化** Xavier 初始化旨在通过调整权重的标准差来维持每层输入和输出的方差一致。对于线性激活函数,标准差可以表示为: \[ \sigma = \sqrt{\frac{2}{n_{\text{in}} + n_{\text{out}}}} \] 其中 \( n_{\text{in}} \) 和 \( n_{\text{out}} \) 分别表示输入和输出神经元的数量[^4]。 3. **He/Kaiming 初始化** He 初始化适用于使用 ReLU 激活函数的网络。它将权重的标准差设定为: \[ \sigma = \sqrt{\frac{2}{n_{\text{in}}}} \] 这种方法能够更好地处理非线性激活函数带来的梯度稀疏问题。 4. **正交初始化** 正交初始化通过使权重矩阵正交化,有助于减少冗余性和过拟合,同时保持梯度传播的稳定性[^3]。具体实现如下: ```python import numpy as np def orthogonal_initialization(shape, gain=1.0): a = np.random.normal(0.0, 1.0, shape) u, _, v = np.linalg.svd(a, full_matrices=False) q = u if u.shape == shape else v return gain * q ``` #### 权重矩阵的获取方式 权重矩阵的获取主要依赖于初始化方法的选择。以下是一些常见的获取方式: 1. **基于框架的内置方法** 现代深度学习框架如 TensorFlow 和 PyTorch 提供了内置的权重初始化方法。例如,在 PyTorch 中可以使用 `torch.nn.init` 模块: ```python import torch import torch.nn as nn layer = nn.Linear(100, 50) nn.init.xavier_uniform_(layer.weight) nn.init.zeros_(layer.bias) ``` 2. **自定义初始化** 如果需要更灵活的初始化方式,可以通过编写自定义函数实现。例如,结合正交初始化和缩放因子: ```python def custom_init(layer, gain=1.0): nn.init.orthogonal_(layer.weight, gain=gain) nn.init.zeros_(layer.bias) ``` #### 注意事项 如果权重矩阵的所有元素初始化为相同的常数,会导致所有神经元的计算结果相同,从而失去网络的学习能力[^5]。因此,必须确保权重矩阵具有足够的随机性以打破对称性。 ### 示例代码 以下是一个完整的示例,展示如何在 PyTorch 中初始化全连接层的权重矩阵: ```python import torch import torch.nn as nn # 定义全连接层 fc_layer = nn.Linear(in_features=100, out_features=50) # 使用 He 初始化 nn.init.kaiming_normal_(fc_layer.weight, mode='fan_in', nonlinearity='relu') nn.init.zeros_(fc_layer.bias) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值