【19】pytorch中的权值初始化方法

简介: 【19】pytorch中的权值初始化方法

1. 常用的初始化方法


1.1 均匀分布初始化(uniform_)

使值服从均匀分布 U(a,b)

torch.nn.init.uniform_(tensor, a=0.0, b=1.0)


  • tensor——一个n维的torch.Tensor
  • a – 均匀分布的下界
  • b – 均匀分布的上限

1.2 正态分布初始化(normal_)

使值服从正态分布 N(mean, std),默认值为 0,1

torch.nn.init.normal_(tensor, mean=0.0, std=1.0)


  • tensor——一个n维的torch.Tensor
  • mean – 正态分布的均值
  • std – 正态分布的标准偏差

1.3 常数初始化(constant_)

使值为常数,用val来填充

torch.nn.init.constant_(tensor, val)


  • tensor——一个n维的torch.Tensor
  • val – 用来填充张量的值

1.4 一值初始化(ones_)

用1来填充tensor

torch.nn.init.ones_(tensor)


1.5 零值初始化(zeros_)

用0来填充tensor

torch.nn.init.zeros_(tensor)


1.6 单位矩阵初始化(eye_)

将二维 tensor 初始化为单位矩阵

torch.nn.init.eye_(tensor)


1.7 狄拉克初始化(dirac_)

用Dirac δ函数来填充{3, 4, 5}维输入张量或变量。在卷积层尽可能多的保存输入通道特性。在groups >1的情况下,每组通道保持身份

torch.nn.init.dirac_(tensor, groups=1)


  • tensor – {3, 4, 5} 维torch.Tensor
  • groups (optional) – conv 层中的组数(默认值:1)

1.8 正交初始化(orthogonal_)

使得 tensor 是正交的

torch.nn.init.orthogonal_(tensor, gain=1)


1.9 稀疏初始化(sparse_)

从正态分布 N~(0. std)中进行稀疏化,使每一个 column 有一部分为 0

torch.nn.init.sparse_(tensor, sparsity, std=0.01)


  • tensor——一个n维的torch.Tensor
  • sparsity - 每列中要设置为零的元素的比例
  • std – 用于生成非零值的正态分布的标准偏差

1.10 Xavier初始化

Xavier 初始化方法,论文在《Understanding the difficulty of training deep feedforward neural networks》。公式推导是从“方差一致性”出发,初始化的分布有均匀分布和正态分布两种。


1.10.1 Xavier均匀分布(xavier_uniform_)

torch.nn.init.xavier_uniform_(tensor, gain=1.0)


xavier 初始化方法中服从均匀分布 U(−a,a) ,分布的参数 a = gain * sqrt(6/fan_in+fan_out),

这里有一个 gain,增益的大小是依据激活函数类型来设定

image.png


eg:

nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))


1.10.2 Xavier正态分布(xavier_normal_)

torch.nn.init.xavier_normal_(tensor, gain=1.0)


xavier 初始化方法中服从正态分布,mean=0,std = gain * sqrt(2/fan_in + fan_out)

image.png


1.11 kaiming初始化

kaiming 初始化方法,论文在《 Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification 》,公式推导同样从“方差一致性”出法,kaiming是针对 xavier 初始化方法在 relu 这一类激活函数表现不佳而提出的改进


1.11.1 kaiming均匀分布(kaiming_uniform_)

torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')


  • tensor——一个n维的torch.Tensor
  • a – 为激活函数的负半轴的斜率(仅与“leaky_relu”一起使用),relu 是 0
  • mode——“fan_in”(默认)或“fan_out”。 选择“fan_in”会保留前向传递中权重方差的大小。 选择“fan_out”会保留向后传递的幅度。

image.png


1.11.2 kaiming正态分布(kaiming_normal_)

torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')


  • tensor——一个n维的torch.Tensor
  • a – 为激活函数的负半轴的斜率(仅与“leaky_relu”一起使用),relu 是 0
  • mode——可选为 fan_in 或 fan_out, fan_in 使正向传播时,方差一致;fan_out 使反向传播时,方差一致
  • nonlinearity – 非线性函数(nn.functional 名称),建议仅与 ‘relu’ 或 ‘leaky_relu’(默认)一起使用。

image.png

eg:

nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')


1.12 计算增益

torch.nn.init.calculate_gain(nonlinearity, param=None)


  • nonlinearity–非线性函数(nn.functional name)
  • param–非线性函数的可选参数

返回给定非线性函数的推荐增益值。这些值如下:

image.png


2. 权值初始化流程


总共两步,


  • 第一步,先设定什么层用什么初始化方法,初始化方法在 torch.nn.init 中给出;
  • 第二步,实例化一个模型之后,执行该函数,即可完成初始化。

2.1 常用初始化例子1

以之前使用在ResNet中的初始化方法为例,ResNet的详细代码与说明见博文:https://blog.csdn.net/weixin_44751294/article/details/116763878

# 初始化网络结构
  def initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                # 采用了何凯明的初始化方法
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
            elif isinstance(m, nn.BatchNorm2d):
                # 常数初始化: 使值为常数
                nn.init.constant_(m.weight, 1)
                nn.init.constant_(m.bias, 0)


基本过程为:先从 self.modules()中遍历每一层,然后判断各层属于什么类型,例如,是否是 nn.Conv2d、nn.BatchNorm2d、nn.Linear 等,然后根据不同类型的层,设定不同的权值初始化方法,例如,Xavier,kaiming,normal_,uniform_等。


2.2 常用初始化例子2

# 定义权值初始化
  def initialize_weights(self):
      # 其中self.modules()展示网络的层结构
      for m in self.modules():
          # 对nn.Conv2d层进行处理
          if isinstance(m, nn.Conv2d):
              # 采用 torch.nn.init.xavier_normal 方法对该层的 weight 进行初始化
              torch.nn.init.xavier_normal_(m.weight.data)
              # 并判断是否存在偏置(bias),若存在,将 bias 初始化为全 0
              if m.bias is not None:
                  m.bias.data.zero_()
          # 对BatchNorm2d层进行处理
          elif isinstance(m, nn.BatchNorm2d):
              # 对于BatchNorm2d,其是不需要bias的,所以对应的bias设置为0;其他设置为1,以下是两种设置方法,功能是一样的
              # 方法1:
              m.weight.data.fill_(1)
              m.bias.data.zero_()
              # 方法2:使用常数初始化
#                 nn.init.constant_(m.weight, 1)
#                 nn.init.constant_(m.bias, 0)
          # 对Linear层进行处理
          elif isinstance(m, nn.Linear):
              # 正态分布初始化,使值服从正态分布 N(mean, std)
              torch.nn.init.normal_(m.weight.data, 0, 0.01)
              m.bias.data.zero_()
目录
相关文章
|
4天前
|
机器学习/深度学习 存储 PyTorch
Pytorch中in-place操作相关错误解析及detach()方法说明
Pytorch中in-place操作相关错误解析及detach()方法说明
117 0
|
4天前
|
机器学习/深度学习 PyTorch 算法框架/工具
基于PyTorch实战权重衰减——L2范数正则化方法(附代码)
基于PyTorch实战权重衰减——L2范数正则化方法(附代码)
62 0
|
9月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch学习笔记(6):模型的权值初始化与损失函数
Pytorch学习笔记(6):模型的权值初始化与损失函数
122 0
Pytorch学习笔记(6):模型的权值初始化与损失函数
|
10月前
|
机器学习/深度学习 PyTorch Serverless
Pytorch基本使用—参数初始化
使用Pytorch进行参数初始化教程,重点是Xavier
163 0
|
10月前
|
PyTorch 算法框架/工具
PyTorch: 权值初始化
PyTorch: 权值初始化
55 0
PyTorch: 权值初始化
|
10月前
|
并行计算 PyTorch 算法框架/工具
离线下载安装PyTorch的不报错方法
离线下载安装PyTorch的不报错方法
|
11月前
|
PyTorch 算法框架/工具
【PyTorch】初始化网络各层权重
【PyTorch】初始化网络各层权重
50 0
|
11月前
|
PyTorch 算法框架/工具
【PyTorch】两种不同分类层的设计方法
【PyTorch】两种不同分类层的设计方法
51 0
|
存储 PyTorch 算法框架/工具
聊一聊pytorch中的张量基本方法
聊一聊pytorch中的张量基本方法
|
机器学习/深度学习 人工智能 PyTorch
【Pytorch神经网络理论篇】 15 过拟合问题的优化技巧(二):Dropout()方法
异常数据的特点:与主流样本中的规律不同,在一个样本中出现的概率要比主流数据出现的概率低很多。在每次训练中,忽略模型中一些节点,将小概率的异常数据获得学习的机会变得更低。这样,异常数据对模型的影响就会更小。
144 0