torch.nn.init
警告
此模块中的所有函数都用于初始化神经网络参数,因此它们都在torch.no_grad()
模式下运行,并且不会被自动求梯度系统跟踪。
- torch.nn.init.calculate_gain(nonlinearity, param=None)[源代码]
-
返回指定非线性函数的推荐增益值。
具体值如下:
非线性
获得
线性 / 恒等
$1$
Conv{1,2,3}D
$1$
sigmoid
$1$
Tanh
$\frac{5}{3}$
ReLU
√2
泄漏ReLU
$\sqrt{\frac{2}{1 + \text{{negative_slope}}^2}}$公式本身已经是数学表达式,无需进一步修改以保持其准确性和专业性。
SELU
$\frac{3}{4}$
警告
为了实现自归一化神经网络,你应该使用
nonlinearity='linear'
而不是nonlinearity='selu'
。这样可以使初始权重的方差为1/N
,这是在前向传递中获得稳定不动点所必需的。相比之下,默认情况下SELU
为了在矩形层中实现更稳定的梯度流动而牺牲了归一化效果。- 参数
-
-
非线性函数 —— nn.functional 中的 non-linear function
-
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)[源代码]
-
用从均匀分布中抽取的值填充输入张量。
$\mathcal{U}(a, b)$
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.uniform_(w)
- torch.nn.init.normal_(tensor, mean=0.0, std=1.0, generator=None)[源代码]
-
用从正态分布中抽取的值填充输入 tensor。
$\mathcal{N}(\text{均值}, \text{标准差}^2)$
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.normal_(w)
- torch.nn.init.constant_(tensor, val)[源代码]
-
将输入张量填充为值$\text{val}$。
示例
>>> w = torch.empty(3, 5) >>> nn.init.constant_(w, 0.3)
- torch.nn.init.ones_(tensor)[源代码]
-
将输入张量用标量值1填充。
示例
>>> w = torch.empty(3, 5) >>> nn.init.ones_(w)
- torch.nn.init.zeros_(tensor)[源代码]
-
将输入张量用标量值 0 填充。
示例
>>> w = torch.empty(3, 5) >>> nn.init.zeros_(w)
- torch.nn.init.eye_(tensor)[源代码]
-
用单位矩阵填充二维输入Tensor。
在Linear层中保持输入的原始身份,尽可能多的保留输入。
- 参数
-
tensor — 一个二维的 torch.Tensor
示例
>>> w = torch.empty(3, 5) >>> nn.init.eye_(w)
- torch.nn.init.dirac_(tensor, groups=1)[源代码]
-
用狄拉克 delta 函数填充 {3, 4, 5} 维的输入 Tensor。
在卷积层中保持输入的identity,尽可能多地保留输入通道。如果组数大于1,则每个通道组都独立保持其identity。
- 参数
-
-
tensor – 一个三维(3)、四维(4)和五维(5)的 torch.Tensor
-
groups (int, 可选) – 卷积层的组数,默认为 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)[源代码]
-
使用 Xavier 均匀分布来填充输入 Tensor 的值。
该方法在Understanding the difficulty of training deep feedforward neural networks - Glorot, X. & Bengio, Y. (2010) 中有所描述。生成的张量将从$\mathcal{U}(-a, a)$中抽取值。
$a = \text{gain} \times \sqrt{\frac{6}{\text{fan\_in} + \text{fan\_out}}}$又称作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)[源代码]
-
使用 Xavier 正态分布来填充输入 Tensor 的值。
该方法在Understanding the difficulty of training deep feedforward neural networks - Glorot, X. & Bengio, Y. (2010) 中有描述。生成的张量将从$\mathcal{N}(0, \text{std}^2)$中抽取值。
$\text{std} = \text{gain} \times \sqrt{\frac{2}{\text{fan\_in} + \text{fan\_out}}}$又称作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)[源代码]
-
使用Kaiming均匀分布来填充Tensor的值。
该方法在深入探究整流器:超越人类水平的ImageNet分类性能 - He, K. et al. (2015) 中有描述。生成的张量将从$\mathcal{U}(-\text{bound}, \text{bound})$中采样值。
$\text{bound} = \text{gain} \times \sqrt{\frac{3}{\text{fan\_mode}}}$也称为He初始化方法。
- 参数
-
-
tensor (Tensor) – 一个 n 维的 torch.Tensor 对象
-
a (float) – 此层之后使用的泄漏ReLU整流器的负斜率(仅在使用
'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)[源代码]
-
使用Kaiming正态分布来填充Tensor的值。
该方法在深入探究整流器:超越人类水平的ImageNet分类性能 - He, K. 等 (2015) 中有描述。生成的张量将从$\mathcal{N}(0, \text{std}^2)$中抽取值。
$\text{std} = \frac{\text{gain}}{\sqrt{\text{fan\_mode}}}$也称为He初始化方法。
- 参数
-
-
tensor (Tensor) – 一个 n 维的 torch.Tensor 对象
-
a (float) – 此层之后使用的泄漏ReLU整流器的负斜率(仅在使用
'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)[源代码]
-
用截断正态分布抽取的值来填充输入张量。
这些值实际上是从正态分布 $\mathcal{N}(\text{mean}, \text{std}^2)$ 中抽取的,对于超出范围$[a, b]$的值会重新绘制,直到它们落在范围内。生成随机值的方法在满足$a \leq \text{mean} \leq b$条件时效果最佳。
- 参数
- 返回类型
示例
>>> w = torch.empty(3, 5) >>> nn.init.trunc_normal_(w)
- torch.nn.init.orthogonal_(tensor, gain=1, generator=None)[源代码]
-
使用一个(半)正交矩阵来填充输入的 Tensor。
参见 Exact solutions to the nonlinear dynamics of learning in deep linear neural networks - Saxe, A. 等 (2013)。输入张量至少需要有2个维度,对于超过2个维度的张量,后面的维度会被展平。
- 参数
示例
>>> w = torch.empty(3, 5) >>> nn.init.orthogonal_(w)
- torch.nn.init.sparse_(tensor, sparsity, std=0.01, generator=None)[源代码]
-
将二维输入 Tensor 填充为稀疏矩阵。
非零元素将从正态分布 $\mathcal{N}(0, 0.01)$ 中抽取,如 Martens, J. (2010) 的文献《通过无黑塞优化的深度学习》中所述。
- 参数
示例
>>> w = torch.empty(3, 5) >>> nn.init.sparse_(w, sparsity=0.1)