Wel to Juruo's Blog

Emmm

转载于:https://www.cnblogs.com/sroht/p/9870711.html

### PyTorch 权重初始化 在构建神经网络时,合适的权重初始化对于训练过程至关重要。不恰当的初始权重可能导致梯度消失或爆炸等问题,从而阻碍模型收敛。 #### 使用 `torch.nn.init` 进行权重初始化 PyTorch 提供了多种内置的方法来初始化张量中的数值,这些方法可以通过 `torch.nn.init` 模块访问[^1]。例如: ```python import torch.nn as nn import torch.nn.init as init def weights_init(m): if isinstance(m, nn.Conv2d): init.xavier_uniform_(m.weight.data) if m.bias is not None: init.constant_(m.bias.data, 0.0) elif isinstance(m, nn.BatchNorm2d): init.constant_(m.weight.data, 1.0) init.constant_(m.bias.data, 0.0) # 应用于整个模型 model = MyModel() model.apply(weights_init) ``` 这段代码展示了如何定义一个自定义函数 `weights_init()` 并将其应用于整个模型实例。这里使用了 Xavier 均匀分布初始化卷积层权重,并设置了批标准化层的参数。 #### 正交初始化 另一种常见的做法是在循环神经网络(RNNs)中采用正交初始化以保持激活值尺度稳定。这有助于缓解长期依赖问题带来的挑战: ```python for m in model.modules(): if isinstance(m, (nn.Conv2d, nn.Linear)): nn.init.orthogonal_(m.weight) ``` 此段代码遍历模块并仅当遇到线性变换或二维卷积操作符时应用正交化处理其权重组件[^2]。 #### 稀疏初始化 稀疏初始化是一种特殊形式,其中大多数连接被设为零而少数随机选取的位置赋予非零值。这种方法可以减少计算复杂性和内存占用的同时维持一定水平的表现力: ```python sparse_connections = 10 for param in parameters_to_initialize: shape = param.size() sparsity_mask = torch.zeros(shape).bernoulli_(p=sparse_connections / np.prod(shape)) sparse_weights = torch.randn_like(param) * sparsity_mask with torch.no_grad(): param.copy_(sparse_weights) ``` 上述实现方式创建了一个二元掩码矩阵,它决定了哪些位置应该保留非零元素;接着通过标准正态分布采样得到实际要赋给那些选定位置的具体数值[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值