torch.nn.init中常用的几种方法

从均匀分布U(a, b)中生成值,填充输入的张量或变量

# 服从 U(a, b)
torch.nn.init.uniform(tensor, a=0, b=1)
w = torch.Tensor(3, 5)
print nn.init.uniform(w)

从给定均值和标准差的正态分布N(mean, std)中生成值,填充输入的张量或变量

# 服从 N(mean,std)
torch.nn.init.normal(tensor, mean=0, std=1)
w = torch.Tensor(3, 5)
print torch.nn.init.normal(w)

用单位矩阵来填充2维输入张量或变量。在线性层尽可能多的保存输入特性

torch.nn.init.eye(tensor)
w = torch.Tensor(3, 5)
# 生成单位矩阵
print torch.nn.init.eye(w)

使用值val填充输入Tensor或Variable 。

# 将值始化值为val
torch.nn.init.constant(tensor, val)
w = torch.Tensor(3, 5)
# 生成一个三行五列值全为2的tensor
print torch.nn.init.constant(w,2)

xavier

torch.nn.init.xavier_uniform_(tensor, gain=1)
这里有一个gain,增益的大小是依据激活函数类型来设定
xavier初始化方法中服从均匀分布U(−a,a)
分布的参数
在这里插入图片描述
torch.nn.init.xavier_normal_(tensor, gain=1)
xavier初始化方法中服从正态分布N(mean=0, std)
在这里插入图片描述

kaiming均匀分布

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

此为均匀分布,U~(-bound, bound), bound = sqrt(6/(1+a^2)*fan_in)

其中,a为激活函数的负半轴的斜率,relu是0

mode- 可选为fan_in 或 fan_out, fan_in使正向传播时,方差一致; fan_out使反向传播时,方差一致

nonlinearity- 可选 relu 和 leaky_relu ,默认值为 leaky_relu

nn.init.kaiming_uniform_(w, mode=‘fan_in’, nonlinearity=‘relu’)

kaiming正态分布

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

此为0均值的正态分布,N~ (0,std),其中std = sqrt(2/(1+a^2)*fan_in)

其中,a为激活函数的负半轴的斜率,relu是0

mode- 可选为fan_in 或 fan_out, fan_in使正向传播时,方差一致;fan_out使反向传播时,方差一致

nonlinearity- 可选 relu 和 leaky_relu ,默认值为 leaky_relu

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

注:fan_in = kernel_size[0] * kernel_size[1] * in_channels

fan_out = kernel_size[0] * kernel_size[1] * out_channels

### 初始化 `torch.nn.Module` 的方法 为了确保神经网络能够有效地训练并收敛到最优解,权重初始化是一个非常重要的环节。以下是几种常见的初始化方式及其应用: #### 使用常数初始化 可以利用 `torch.nn.init.constant_()` 函数来设置特定层的参数为固定值。这适用于某些特殊情况下的调试或实验设计。 ```python import torch.nn as nn import torch.nn.init as init class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.linear = nn.Linear(10, 5) # 将线性层的权重设为指定数值 init.constant_(self.linear.weight, val=0.5)[^1] model = MyModel() print(model.linear.weight) ``` #### Xavier 均匀分布初始化 Xavier 初始化是一种广泛使用的策略,它基于输入和输出节点的数量调整初始权重范围,有助于保持信号在整个网络传播过程中的稳定性。 ```python def initialize_weights(self): for m in self.modules(): if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear): init.xavier_uniform_(m.weight.data, gain=nn.init.calculate_gain('relu'))[^3] # 应用于自定义模块中 my_model.apply(initialize_weights) ``` #### Kaiming 正态分布初始化 对于 ReLU 类激活函数而言,Kaiming He 提出了更适合此类非线性的初始化方案,即采用正态分布而非均匀分布来进行权值设定。 ```python from functools import partial def weights_init_kaiming(layer): classname = layer.__class__.__name__ if classname.find('Conv') != -1: init.kaiming_normal_(layer.weight.data, a=0, mode='fan_in') custom_module = CustomModule() # 用户自定义类实例化对象 custom_module.apply(weights_init_kaiming)[^4] ``` 当遇到与 `__init__()` 方法有关的问题时,通常是因为子类重写了父类的方法却没有调用基类构造器。为了避免这种情况发生,在继承 `nn.Module` 并实现自己的初始化逻辑时,务必记得显式地调用 `super().__init__()` 来完成必要的准备工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值