torch.nn.init¶
警告
此模块中的所有函数旨在用于初始化神经网络参数,因此它们都在 torch.no_grad()
模式下运行,并且不会被 autograd 考虑在内。
- torch.nn.init.calculate_gain(nonlinearity, param=None)[source][source]¶
返回给定非线性函数的推荐增益值。
这些值如下:
非线性
增益
线性 / 恒等
Conv{1,2,3}D
Sigmoid
Tanh
ReLU
Leaky Relu
SELU
警告
为了实现 自归一化神经网络 ,您应该使用
nonlinearity='linear'
而不是nonlinearity='selu'
。这使初始权重的方差为1 / N
,这对于在正向传播中诱导稳定的不动点是必要的。相反,SELU
的默认增益牺牲了归一化效果,以在矩形层中获得更稳定的梯度流。- 参数
nonlinearity – 非线性函数(nn.functional 名称)
param – 非线性函数的可选参数
示例
>>> gain = nn.init.calculate_gain('leaky_relu', 0.2) # leaky_relu with negative_slope=0.2
- torch.nn.init.uniform_(tensor, a=0.0, b=1.0, generator=None)[source][source]¶
用从均匀分布中抽取的值填充输入张量。
.
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.uniform_(w)
- torch.nn.init.normal_(tensor, mean=0.0, std=1.0, generator=None)[source][source]¶
用从正态分布中抽取的值填充输入张量。
.
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.normal_(w)
- torch.nn.init.constant_(tensor, val)[source][source]¶
用值 填充输入张量。
示例
>>> w = torch.empty(3, 5) >>> nn.init.constant_(w, 0.3)
- torch.nn.init.ones_(tensor)[source][source]¶
用标量值 1 填充输入张量。
示例
>>> w = torch.empty(3, 5) >>> nn.init.ones_(w)
- torch.nn.init.zeros_(tensor)[source][source]¶
用标量值 0 填充输入张量。
示例
>>> w = torch.empty(3, 5) >>> nn.init.zeros_(w)
- torch.nn.init.eye_(tensor)[source][source]¶
用单位矩阵填充二维输入 Tensor。
在 Linear 层中保留输入的恒等性,并尽可能多地保留输入。
- 参数
tensor – 二维 torch.Tensor
示例
>>> w = torch.empty(3, 5) >>> nn.init.eye_(w)
- torch.nn.init.dirac_(tensor, groups=1)[source][source]¶
用狄拉克 delta 函数填充 {3, 4, 5} 维输入 Tensor。
在 Convolutional 层中保留输入的恒等性,并尽可能多地保留输入通道。如果 groups>1,则每组通道保留恒等性
- 参数
tensor – {3, 4, 5} 维 torch.Tensor
groups (int, optional) – 卷积层中的组数(默认值:1)
示例
>>> w = torch.empty(3, 16, 5, 5) >>> nn.init.dirac_(w) >>> w = torch.empty(3, 24, 5, 5) >>> nn.init.dirac_(w, 3)
- torch.nn.init.xavier_uniform_(tensor, gain=1.0, generator=None)[source][source]¶
使用 Xavier 均匀分布的值填充输入 Tensor。
该方法在 理解训练深度前馈神经网络的难度 - Glorot, X. & Bengio, Y. (2010) 中进行了描述。生成的张量的值将从 中采样,其中
也称为 Glorot 初始化。
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))
注意
请注意,
fan_in
和fan_out
的计算假定权重矩阵以转置方式使用(即,Linear
层中的x @ w.T
,其中w.shape = [fan_out, fan_in]
)。这对于正确的初始化非常重要。如果您计划使用x @ w
,其中w.shape = [fan_in, fan_out]
,则传入转置的权重矩阵,即nn.init.xavier_uniform_(w.T, ...)
。
- torch.nn.init.xavier_normal_(tensor, gain=1.0, generator=None)[source][source]¶
使用 Xavier 正态分布的值填充输入 Tensor。
该方法在 理解训练深度前馈神经网络的难度 - Glorot, X. & Bengio, Y. (2010) 中进行了描述。生成的张量的值将从 中采样,其中
也称为 Glorot 初始化。
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.xavier_normal_(w)
注意
请注意,
fan_in
和fan_out
的计算假定权重矩阵以转置方式使用(即,Linear
层中的x @ w.T
,其中w.shape = [fan_out, fan_in]
)。这对于正确的初始化非常重要。如果您计划使用x @ w
,其中w.shape = [fan_in, fan_out]
,则传入转置的权重矩阵,即nn.init.xavier_normal_(w.T, ...)
。
- torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu', generator=None)[source][source]¶
使用 Kaiming 均匀分布的值填充输入 Tensor。
该方法在 深入研究整流器:在 ImageNet 分类中超越人类水平的性能 - He, K. et al. (2015) 中进行了描述。生成的张量的值将从 中采样,其中
也称为 He 初始化。
- 参数
tensor (Tensor) – n 维 torch.Tensor
a (float) – 在此层之后使用的整流器的负斜率(仅与
'leaky_relu'
一起使用)mode (str) – 可以是
'fan_in'
(默认) 或'fan_out'
。 选择'fan_in'
保留前向传播中权重的方差幅度。 选择'fan_out'
保留后向传播中的幅度。nonlinearity (str) – 非线性函数 (nn.functional 名称),建议仅与
'relu'
或'leaky_relu'
(默认) 一起使用。generator (Optional[Generator]) – 用于采样的 torch Generator(默认值:None)
示例
>>> w = torch.empty(3, 5) >>> nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')
注意
请注意,
fan_in
和fan_out
的计算假设权重矩阵以转置方式使用,(即,Linear
层中的x @ w.T
,其中w.shape = [fan_out, fan_in]
)。 这对于正确的初始化非常重要。 如果您计划使用x @ w
,其中w.shape = [fan_in, fan_out]
,请传入转置的权重矩阵,即nn.init.kaiming_uniform_(w.T, ...)
。
- torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu', generator=None)[source][source]¶
使用 Kaiming 正态分布的值填充输入 Tensor。
该方法在 Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification - He, K. et al. (2015) 中描述。 生成的张量将具有从 采样的值。
也称为 He 初始化。
- 参数
tensor (Tensor) – n 维 torch.Tensor
a (float) – 在此层之后使用的整流器的负斜率(仅与
'leaky_relu'
一起使用)mode (str) – 可以是
'fan_in'
(默认) 或'fan_out'
。 选择'fan_in'
保留前向传播中权重的方差幅度。 选择'fan_out'
保留后向传播中的幅度。nonlinearity (str) – 非线性函数 (nn.functional 名称),建议仅与
'relu'
或'leaky_relu'
(默认) 一起使用。generator (Optional[Generator]) – 用于采样的 torch Generator(默认值:None)
示例
>>> w = torch.empty(3, 5) >>> nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')
注意
请注意,
fan_in
和fan_out
的计算假设权重矩阵以转置方式使用,(即,Linear
层中的x @ w.T
,其中w.shape = [fan_out, fan_in]
)。 这对于正确的初始化非常重要。 如果您计划使用x @ w
,其中w.shape = [fan_in, fan_out]
,请传入转置的权重矩阵,即nn.init.kaiming_normal_(w.T, ...)
。
- torch.nn.init.trunc_normal_(tensor, mean=0.0, std=1.0, a=-2.0, b=2.0, generator=None)[source][source]¶
使用截断正态分布中的值填充输入 Tensor。
这些值实际上是从正态分布 中提取的,超出 范围的值将被重新抽取,直到它们在边界内。 当 时,用于生成随机值的方法效果最佳。
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.trunc_normal_(w)
- torch.nn.init.orthogonal_(tensor, gain=1, generator=None)[source][source]¶
用(半)正交矩阵填充输入 Tensor。
在 Exact solutions to the nonlinear dynamics of learning in deep linear neural networks - Saxe, A. et al. (2013) 中描述。 输入张量必须至少有 2 个维度,对于超过 2 个维度的张量,尾部维度将被展平。
- 参数
示例
>>> w = torch.empty(3, 5) >>> nn.init.orthogonal_(w)