Pytorch学习之旅(9)——线性层权值初始化

一、为什么要讨论权值的初始化问题?

       神经网络一般包含多级全线性层,随着层数的增加,为了保持网络的稳定,对梯度提出了要求:不能出现梯度消失或者爆炸。
       先来看一个三级全连接层网络:
三层全连接层
       此处乱入一个数学知识:
数学公式
       当某一层的输入和权值都满足 mean=0、std=1的标准正态分布时,有:        输出的方差 D=N(输入神经元的个数)
求解梯度
      而方差反映了参数的离散程度,如果后一层方差为前一层方差的N倍,在多层神经网络进行反向求导的时候,就会出现梯度爆炸的情形。

二、如何解决初始化问题

如图三所示,令输入的方差和输出的方差相等,即
{ D ( o u t ) = ∑ i = 0 n − 1 D ( i n ) ∗ D ( w ) D ( o u t ) = D ( i n ) \left\{ \begin{array}{l} D(out) = \sum_{i=0}^{n-1}D(in)*D(w) \\ D(out)=D(in) \end{array} \right. {D(out)=i=0n1D(in)D(w)D(out)=D(in)
即有:
D ( w ) = 1 n D(w)=\frac{1}{n} D(w)=n1
权值的方差为:输入神经元个数的倒数。
使用pytorch的正态分布函数初始化数据:

# m.weight.data:网络层m的权重值
# self.neural_num:输入神经元的个数
nn.init.normal_(m.weight.data, mean=0, std=np.sqrt(1/self.neural_num))

三、如果添加激活函数。。。

pytorch提供的十种初始化方法:

       1、Xavier 均匀分布
       2、Xavier正态分布
       3、Kaiming均匀分布
       4、Kaiming正态分布
       5、均匀分布
       6、正态分布
       7、常数分布
       8、正交矩阵初始化
       9、单位矩阵初始化
     10、稀疏矩阵初始化

它们各自对应着不同激活函数,详情请点击:初始化方案

参考资源链接:[PyTorch模型训练实战指南:数据、模型与优化详解](https://wenku.youkuaiyun.com/doc/6412b71abe7fbd1778d4918f?utm_source=wenku_answer2doc_content) 在进行深度学习项目时,数据预处理和增强是提高模型泛化能力的重要步骤。此外,合适的初始化方法对于模型训练的稳定性和效率也有显著影响。为了帮助你掌握这些技能,推荐查看《PyTorch模型训练实战指南:数据、模型与优化详解》。 首先,数据预处理包括对输入数据进行归一化、标准化等操作,以确保数据符合模型的输入要求。在PyTorch中,你可以使用torchvision.transforms模块中的转换操作来对数据进行预处理,如***pose、transforms.Resize、transforms.ToTensor等。例如,以下代码展示了如何组合使用这些转换操作: ```python import torchvision.transforms as transforms # 定义转换操作序列 data_transforms = ***pose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) # 应用转换操作 transformed_image = data_transforms(image) ``` 对于数据增强,PyTorch提供了丰富的转换方法,包括随机裁剪、水平翻转、旋转、缩放等,这些操作可以在数据集的__getitem__方法中实现,如RandomHorizontalFlip和RandomRotation。数据增强不仅能够提高模型的泛化能力,还能够缓解过拟合的问题。 初始化对于模型的训练效果也至关重要。PyTorch中提供了多种初始化方法,如xavier_uniform_()、xavier_normal_()、kaiming_uniform_()和kaiming_normal_()等。每种初始化方法适用于不同的网络结构和激活函数。例如,对于使用ReLU激活函数的网络,通常推荐使用kaiming_normal_()初始化方法。 ```python import torch.nn.init as init # 假设linear_layer是线性层重 init.kaiming_normal_(linear_layer.weight, mode='fan_in', nonlinearity='relu') ``` 以上步骤将为你构建一个高效的数据预处理和增强流程,以及合理的初始化方法,从而为你的深度学习项目打下坚实的基础。如果你希望进一步深入学习关于数据划分、模型构建、损失函数选择、优化器配置以及模型监控和调优的内容,建议阅读《PyTorch模型训练实战指南:数据、模型与优化详解》。该教程详细讲解了从数据处理到模型部署的全流程,将助你成为更专业的PyTorch开发者。 参考资源链接:[PyTorch模型训练实战指南:数据、模型与优化详解](https://wenku.youkuaiyun.com/doc/6412b71abe7fbd1778d4918f?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值