• 文档 >
  • 模块代码 >
  • torch >
  • torch.nn.modules.normalization
快捷键

torch.nn.modules.normalization 的源代码

# mypy: 允许未类型化定义
导入 数字
来自 打字 导入 可选, 联合

导入 火炬
来自 火炬 导入 尺寸, 张量
来自 torch.nn 导入 功能性 作为 F, 初始化
来自 torch.nn 参数 导入 参数

来自 ._functions 导入 CrossMapLRN2d 作为 _交叉映射学习 2D
来自 .模块 导入 模块


__all__ = [局部响应归一化, 交叉映射 LRN2d, 层归一化, "GroupNorm", "RMSNorm"]


[文档] 局部响应归一化(模块): r"对输入信号应用局部响应归一化。" 输入信号由多个输入平面组成,其中通道占据第二维。 对通道进行归一化处理。 .. math:: b_{c} = a_{c}(k + \frac{\alpha}{n}) \sum_{c'=\max(0, c-n/2)}^{\min(N-1,c+n/2)}a_{c'}^2\right)^{-\beta} Args: 邻近通道数量:用于归一化的邻近通道数量 alpha:乘法因子。默认值:0.0001 beta:指数。默认值:0.75 k:加法因子。默认值:1 形状: - 输入: :math:`(N, C, *)` - 输出: :math:`(N, C, *)` (与输入形状相同) 示例: >>> lrn = nn.LocalResponseNorm(2) >>> signal_2d = torch.randn(32, 5, 24, 24) >>> signal_4d = torch.randn(16, 5, 7, 7, 7, 7) >>> output_2d = lrn(signal_2d) >>> output_4d = lrn(signal_4d) "源代码" 常量 = [大小, "alpha", beta, "k"] 尺寸: 整型 阿尔法: 浮点数 测试版: 浮点数 k: 浮点数 def 初始化( self, 尺寸: int, 阿尔法: 浮点数 = 0.0001, 测试版: 浮点数 = 0.75, k: 浮点数 = 1.0 ) -> : 超级().初始化() self.大小 = 大小 self.alpha = alpha self.测试版 = 测试版 self.k = k def 前向(self, 输入: 张量) -> 张量: 返回 F.本地响应归一化(输入, self.尺寸, self.阿尔法, self.测试版, self.k) def 额外表示(self): 返回 "{大小}, alpha={alpha}, beta={beta}, k={k}".格式(**self.字典)
CrossMapLRN2d(模块): 尺寸: 整型 阿尔法: 浮点数 测试版: 浮点数 k: 浮点数 def 初始化( self, 尺寸: int, 阿尔法: 浮点数 = 0.0001, 测试版: 浮点数 = 0.75, k: 浮点数 = 1 ) -> : 超级().初始化() self.大小 = 大小 self.alpha = alpha self.测试版 = 测试版 self.k = k def 前向(self, 输入: 张量) -> 张量: 返回 _cross_map_lrn2d.应用(输入, self.尺寸, self.阿尔法, self.测试版, self.k) def 额外表示(self) -> 字符串: 返回 "{大小}, alpha={alpha}, beta={beta}, k={k}".格式(**self.字典) _shape_t = 联盟[int, 列表[int] 尺寸]
[文档] 层归一化(模块): r"应用于输入小批次的层归一化。" 本层实现了论文中描述的操作 的《层归一化 `__ .. math:: y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta y = \frac{x - x 的期望}{\sqrt{x 的方差 + \epsilon}} * \gamma + \beta 均值和标准差是在最后 `D` 维度上计算的,其中 `D` 是 `normalized_shape` 的维度。例如,如果 `normalized_shape` 是`(3, 5)`(一个二维形状),均值和标准差是在 输入的最后一个维度(即 `input.mean((-2, -1))`)。 γ 和 β 是可学习的仿射变换参数 :attr:`normalized_shape` 如果 :attr:`elementwise_affine` 为 ``True``。 方差通过有偏估计量计算得出,相当于 `torch.var(input, unbiased=False)`。 .. 注意:: 与批量归一化和实例归一化不同,它们为每个整个通道/平面应用标量缩放和偏置 与 `:attr:`affine` 选项应用标量缩放和偏置不同,层归一化使用 `:attr:`elementwise_affine` 对每个元素应用缩放和偏置 attr:`affine` 选项,层归一化通过 `:attr:`elementwise_affine` 对每个元素应用缩放和偏置 偏置 这一层使用从训练和输入数据中计算出的统计数据 评估模式。 Args: normalized_shape(int 或 list 或 torch.Size):期望输入的输入形状 大小为 .. math:: [* × normalized_shape[0] × normalized_shape[1] × ... × normalized_shape[-1]] 如果使用单个整数,则将其视为单元素列表,并且此模块将在最后一个维度上归一化,该维度预期具有特定的大小。 elementwise_affine:一个布尔值,当设置为 True 时,此模块具有可学习的每个元素的仿射参数,初始化为 1(用于权重)。 eps: 为数值稳定性添加到分母的值。默认:1e-5 elementwise_affine:一个布尔值,当设置为 True 时,此模块具有可学习的每个元素的仿射参数,初始化为 1(用于权重)。 elementwise_affine:一个布尔值,当设置为 True 时,此模块具有可学习的每个元素的仿射参数,初始化为 1(用于权重)。 和零(用于偏差)。默认:``True``。 偏差:如果设置为 ``False``,则层将不会学习加性偏差(仅在 :attr:`elementwise_affine` 为 ``True`` 时相关)。默认:``True``。 attr:`elementwise_affine` 设置为 ``True`` 时。默认:``True``。 属性: weight: 该模块的可学习权重,形状为 math:`\text{normalized\_shape}` 当 :attr:`elementwise_affine` 设置为 ``True`` 时。 值被初始化为 1。 bias: 该模块的可学习偏置,形状为 math:`\text{normalized\_shape}` 当 :attr:`elementwise_affine` 设置为 ``True`` 时。 值被初始化为 0。 形状: - 输入: :math:`(N, *)` - 输出: :math:`(N, *)` (与输入相同形状) 示例: >>> # NLP 示例 >>> batch, sentence_length, embedding_dim = 20, 5, 10 >>> embedding = torch.randn(batch, sentence_length, embedding_dim) >>> layer_norm = nn.LayerNorm(embedding_dim) >>> # Activate module >>> layer_norm(embedding) ... >>> # 图像示例 >>> N, C, H, W = 20, 5, 10, 10 >>> input = torch.randn(N, C, H, W) >>> # 在最后三个维度上归一化(即通道和空间维度) >>> 如下图所示 >>> layer_norm = nn.LayerNorm([C, H, W]) >>> output = layer_norm(input) .. 图像:: ../_static/img/nn/layer_norm.jpg 缩放比例:50% "源代码" 常量 = [标准化形状, eps, 元素级仿射变换] 归一化形状: 元组[int, ...] eps: 浮点数 元素级仿射变换: 布尔类型 def 初始化( self, 归一化形状: _形状_t, eps: 浮点数 = 0.00001, 元素间仿射: 布尔类型 = True, 偏差: 布尔类型 = True, 设备=, 数据类型=, ) -> : 工厂参数 = {"设备": 设备, "dtype": 数据类型} 超级().初始化() 如果 isinstance(归一化形状, 数字.积分): # mypy 错误:赋值中类型不兼容 归一化形状 = (归一化形状,) # 类型:忽略[赋值] self.标准化形状 = 元组(归一化形状) # type: ignore[arg-type] self.eps = eps self.元素间仿射变换 = 元素间仿射变换 如果 self.元素间仿射变换: self.权重 = 参数( 火炬.空的(self.归一化形状, **工厂参数) ) 如果 偏差: self.bias = 参数( 火炬.空的(self.归一化形状, **工厂参数) ) 否则: self.注册参数(偏置, ) 否则: self.注册参数(权重, ) self.注册参数(偏置, ) self.重置参数() def 重置参数(self) -> : 如果 self.元素级仿射: 初始化.全 1 矩阵(self.重量) 如果 self.bias not : 初始化.全 0 矩阵(self.偏差) def 前向(self, 输入: 张量) -> 张量: 返回 F.层归一化( 输入, self.归一化形状, self.重量, self.偏差, self.eps ) def 额外表示(self) -> 字符串: 返回 ( "{标准化形状}, eps={eps}," "逐元素仿射={元素级仿射}".格式(**self.字典) )
[文档] 组归一化(模块): r应用组归一化于输入的小批量。 此层实现了如下描述的操作 论文《分组归一化`__ .. math:: y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta y = \frac{x - x 的期望}{\sqrt{x 的方差 + \epsilon}} * \gamma + \beta 输入通道被分为 :attr:`num_groups` 组,每组包含 ``num_channels / num_groups`` 个通道。:attr:`num_channels` 必须能被 attr:`num_groups` 整除。计算均值和标准差 分别对每个组进行。:math:`γ` 和 :math:`β` 是可学习的 每个通道的仿射变换参数向量大小为 :attr:`num_channels` 当 :attr:`affine` 为 ``True`` 时。 方差通过有偏估计量计算得出,相当于 `torch.var(input, unbiased=False)`。 此层使用从输入数据中计算出的统计数据,在训练和 评估模式。 Args: num_groups (int): 将通道分离成组的数量 num_channels (int): 预期输入中的通道数 eps: 为数值稳定性添加到分母的值。默认:1e-5 affine: 当设置为 ``True`` 时,此模块的布尔值 具有可学习的通道相关仿射参数,初始化为 1(权重)和 0(偏置)。默认:``True``。 和 0(偏置)。默认:``True``。 形状: - 输入::math:`(N, C, *)` 其中 :math:`C=\text{num\_channels}` - 输出::math:`(N, C, *)` (与输入形状相同) 示例: >>> 输入 = torch.randn(20, 6, 10, 10) >>> 将 6 个通道分为 3 组 >>> m = nn.GroupNorm(3, 6) >>> 将 6 个通道分为 6 组(相当于 InstanceNorm) >>> m = nn.GroupNorm(6, 6) >>> 将所有 6 个通道放入一个组(相当于 LayerNorm) >>> m = nn.GroupNorm(1, 6) >>> # 激活该模块 >>> output = m(input) "源代码" 常量 = [num_groups, "通道数", eps, "仿射"] 群组数量: 整型 通道数: 整型 eps: 浮点数 线性: 布尔类型 def 初始化( self, 群组数量: int, 通道数: int, eps: 浮点数 = 0.00001, 线性: 布尔类型 = True, 设备=, 数据类型=, ) -> : 工厂参数 = {"设备": 设备, "dtype": 数据类型} 超级().初始化() 如果 通道数 % 分组数 != 0: 提升 ValueError("通道数必须能被分组数整除") self.分组数 = 群组数量 self.通道数量 = 通道数量 self.eps = eps self.线性变换 = 类似 如果 self.线性: self.权重 = 参数(火炬.空的(通道数, **工厂参数)) self.bias = 参数(火炬.空的(通道数, **工厂参数)) 否则: self.注册参数(权重, ) self.注册参数(偏置, ) self.重置参数() def 重置参数(self) -> : 如果 self.线性: 初始化.ones_(self.重量) 初始化.zeros_(self.偏差) def 前向(self, 输入: 张量) -> 张量: 返回 F.群组归一化(输入, self.群组数量, self.重量, self.偏差, self.eps) def 额外表示(self) -> 字符串: 返回 "{组数}, {通道数}, 阶段={阶段}线性变换={变换}".格式( **self.字典 )
[文档] RMSNorm(模块): r应用在输入迷你批次的根均方层归一化。 此层实现了论文《根均方层归一化》中描述的操作。 论文链接:`根均方层归一化 `__ .. math:: y_i = \frac{x_i}{\mathrm{RMS}(x)} * \gamma_i, \quad \text{其中} \quad \text{RMS}(x) = \sqrt{\epsilon + \frac{1}{n} \sum_{i=1}^{n} x_i^2} RMS 是在最后“D”个维度上取的,其中“D” 是:attr:`normalized_shape`的维度。例如,如果:attr:`normalized_shape` 是一个二维形状(3, 5),均方根(RMS)是在输入的最后两个维度上计算的。 的基础上进行的。 Args: normalized_shape(int 或 list 或 torch.Size):从预期的输入中获取的输入形状。 大小为 .. math:: [* × normalized_shape[0] × normalized_shape[1]] \times \ldots \times \text{normalized\_shape}[-1]] 如果使用单个整数,则将其视为单元素列表,并且此模块将 在最后一个维度上进行归一化,该维度预期具有该特定大小。 eps:为数值稳定性添加到分母的值。默认::func:`torch.finfo(x.dtype).eps` elementwise_affine:一个布尔值,当设置为“True”时,此模块 具有可学习的每个元素仿射参数,初始化为 1(用于权重)。默认:``True``。 形状: 输入::math:`(N, *)` 翻译:输入::math:`(N, *)` 输出::math:`(N, *)`(与输入相同形状) 示例: >>> rms_norm = nn.RMSNorm([2, 3]) >>> input = torch.randn(2, 2, 3) >>> rms_norm(input) "源代码" 常量 = ["normalized_shape", eps, 元素级仿射] 归一化形状: 元组[int, ...] eps: 可选[float] 元素级仿射: 布尔类型 def 初始化( self, 归一化形状: _shape_t, eps: 可选[float] = , 元素级仿射: 布尔类型 = True, 设备=, 数据类型=, ) -> : 工厂参数 = {"设备": 设备, "dtype": 数据类型} 超级().初始化() 如果 isinstance(归一化形状, 数字.积分): # mypy 错误:赋值中类型不兼容 归一化形状 = (归一化形状,) # 类型:忽略[赋值] self.归一化形状 = 元组(归一化形状) # type: ignore[arg-type] self.eps = eps self.元素级仿射 = 元素级仿射 如果 self.元素级仿射: self.权重 = 参数( 火炬.空的(self.归一化形状, **工厂参数) ) 否则: self.注册参数(权重, ) self.重置参数()
[文档] def 重置参数(self) -> None: "``" 根据在 __init__ 中使用的初始化参数重置参数。 "``" 如果 self.elementwise_affine: init.ones_(self.weight)
[文档] def forward(self, x: torch.Tensor) -> torch.Tensor: """ 执行前向传递。 """ 返回 F.rms_norm(x, self.normalized_shape, self.weight, self.eps)
[文档] def extra_repr(self) -> str: """ 模块的额外信息。 ```python # 输入文本 input_text = '"""' # 翻译函数(此处为示例,实际翻译功能需调用真实的翻译 API) def translate_to_simplified_chinese(text): # 假设的翻译结果 return text # 输出翻译结果 translated_text = translate_to_simplified_chinese(input_text) print(translated_text) ``` 返回( {normalized_shape}, eps={eps}, "elementwise_affine={elementwise_affine}".format(**self.__dict__) )
# TODO: 对比归一化 2D # TODO: 分割归一化 2D # TODO: 减法二维范数

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源