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)$

参数
  • tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

  • a (float) – 均匀分布的下限

  • b (float) – 表示均匀分布的上限

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

返回类型

Tensor

示例

>>> 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)$

参数
  • tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

  • mean (float) – 正态分布的平均值

  • std (float) - 正态分布的标准偏差

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

返回类型

Tensor

示例

>>> w = torch.empty(3, 5)
>>> nn.init.normal_(w)
torch.nn.init.constant_(tensor, val)[源代码]

将输入张量填充为值$\text{val}$

参数
  • tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

  • val (float) - 填充张量的值

返回类型

Tensor

示例

>>> w = torch.empty(3, 5)
>>> nn.init.constant_(w, 0.3)
torch.nn.init.ones_(tensor)[源代码]

将输入张量用标量值1填充。

参数

tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

返回类型

Tensor

示例

>>> w = torch.empty(3, 5)
>>> nn.init.ones_(w)
torch.nn.init.zeros_(tensor)[源代码]

将输入张量用标量值 0 填充。

参数

tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

返回类型

Tensor

示例

>>> 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初始化。

参数
  • tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

  • gain (浮点数) - 一个可选的缩放因子

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

返回类型

Tensor

示例

>>> w = torch.empty(3, 5)
>>> nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))

注意

请注意,fan_infan_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初始化。

参数
  • tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

  • gain (浮点数) - 一个可选的缩放因子

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

返回类型

Tensor

示例

>>> w = torch.empty(3, 5)
>>> nn.init.xavier_normal_(w)

注意

请注意,fan_infan_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_infan_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_infan_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$条件时效果最佳。

参数
  • tensor (Tensor) – 一个 n 维的 torch.Tensor 对象

  • mean (float) – 正态分布的平均值

  • std (float) - 正态分布的标准偏差

  • a (float) – 最小的截止值

  • b (float) – 最大截止值

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

返回类型

Tensor

示例

>>> 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个维度的张量,后面的维度会被展平。

参数
  • tensor – 一个 n 维的 torch.Tensor(其中 n 大于或等于 2)

  • gain — 可选的放大系数

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

示例

>>> 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) 的文献《通过无黑塞优化的深度学习》中所述。

参数
  • tensor — 一个 n 维的 torch.Tensor

  • 稀疏性 – 每列中设为零的元素所占的比例

  • std - 正态分布的标准差,用于生成非零值。

  • generator (Optional[Generator]) – 用于采样的 torch Generator,默认为 None

示例

>>> w = torch.empty(3, 5)
>>> nn.init.sparse_(w, sparsity=0.1)
本页目录