torch.nn.init#
创建日期:2019 年 6 月 11 日 | 最后更新日期:2022 年 7 月 7 日
警告
此模块中的所有函数都旨在用于初始化神经网络参数,因此它们都在 torch.no_grad()
模式下运行,并且不会被自动求导所考虑。
- torch.nn.init.calculate_gain(nonlinearity, param=None)[来源]#
返回给定非线性函数的推荐增益值。
值如下:
非线性
增益
线性 / 恒等
Conv{1,2,3}D
Sigmoid
Tanh
ReLU
Leaky Relu
SELU
警告
为了实现自归一化神经网络,您应该使用
nonlinearity='linear'
而不是nonlinearity='selu'
。这使初始权重具有1 / N
的方差,这对于在前向传播中产生稳定的不动点是必要的。相比之下,SELU
的默认增益牺牲了归一化效果,以换取矩形层中更稳定的梯度流。- 参数
- 返回类型
示例
>>> 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]#
用均匀分布中抽取的值填充输入张量。
.
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.uniform_(w)
- torch.nn.init.normal_(tensor, mean=0.0, std=1.0, generator=None)[source]#
用正态分布中抽取的值填充输入张量。
.
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.normal_(w)
- torch.nn.init.constant_(tensor, val)[source]#
用值填充输入张量。
示例
>>> w = torch.empty(3, 5) >>> nn.init.constant_(w, 0.3)
- torch.nn.init.zeros_(tensor)[source]#
用标量值0填充输入张量。
示例
>>> w = torch.empty(3, 5) >>> nn.init.zeros_(w)
- torch.nn.init.eye_(tensor)[source]#
用单位矩阵填充二维输入Tensor。
在Linear层中,尽可能多地保留输入以保持其恒等性。
示例
>>> w = torch.empty(3, 5) >>> nn.init.eye_(w)
- torch.nn.init.dirac_(tensor, groups=1)[source]#
用狄拉克δ函数填充 {3, 4, 5} 维输入Tensor。
在卷积层中,尽可能多地保留输入通道以保持其恒等性。如果 groups > 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]#
使用 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]#
使用 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]#
使用 Kaiming 均匀分布填充输入Tensor。
该方法在 He, K. 等人 (2015) 的《深入研究整流器:超越 ImageNet 分类的人类水平性能》中描述。生成的张量将从 中采样,其中
也称为 He 初始化。
- 参数
tensor (Tensor) – 一个 n 维 torch.Tensor
a (float) – 此层后使用的整流器的负斜率(仅与
'leaky_relu'
一起使用)mode (Literal['fan_in', 'fan_out']) –
'fan_in'
(默认)或'fan_out'
。选择'fan_in'
在前向传播中保留权重的方差大小。选择'fan_out'
在反向传播中保留大小。nonlinearity (Literal['linear', 'conv1d', 'conv2d', 'conv3d', 'conv_transpose1d', 'conv_transpose2d', 'conv_transpose3d', 'sigmoid', 'tanh', 'relu', 'leaky_relu', 'selu']) – 非线性函数(nn.functional 名称),建议仅与
'relu'
或'leaky_relu'
(默认)一起使用。
- 返回类型
示例
>>> 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]#
使用 Kaiming 正态分布填充输入Tensor。
该方法在 He, K. 等人 (2015) 的《深入研究整流器:超越 ImageNet 分类的人类水平性能》中描述。生成的张量将从 中采样,其中
也称为 He 初始化。
- 参数
tensor (Tensor) – 一个 n 维 torch.Tensor
a (float) – 此层后使用的整流器的负斜率(仅与
'leaky_relu'
一起使用)mode (Literal['fan_in', 'fan_out']) –
'fan_in'
(默认)或'fan_out'
。选择'fan_in'
在前向传播中保留权重的方差大小。选择'fan_out'
在反向传播中保留大小。nonlinearity (Literal['linear', 'conv1d', 'conv2d', 'conv3d', 'conv_transpose1d', 'conv_transpose2d', 'conv_transpose3d', 'sigmoid', 'tanh', 'relu', 'leaky_relu', 'selu']) – 非线性函数(nn.functional 名称),建议仅与
'relu'
或'leaky_relu'
(默认)一起使用。
- 返回类型
示例
>>> 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]#
用截断正态分布中抽取的值填充输入张量。
这些值有效地从正态分布 中抽取,超出 的值将被重新抽取,直到它们在范围内。用于生成随机值的方法在 时效果最佳。
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.trunc_normal_(w)
- torch.nn.init.orthogonal_(tensor, gain=1, generator=None)[source]#
用(半)正交矩阵填充输入Tensor。
该方法在 Saxe, A. 等人 (2013) 的《深度线性神经网络中学习非线性动力学的精确解》中描述。输入张量必须至少有 2 个维度,对于超过 2 个维度的张量,尾部维度会被展平。
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.orthogonal_(w)