• 文档 >
  • 模块代码 >
  • torch >
  • torch.nn.utils.weight_norm
快捷键

torch.nn.utils.weight_norm 的源代码

# mypy: 允许未类型化定义
r来自 https://arxiv.org/abs/1602.07868 的权重归一化。
来自 打字 导入 任意, 类型变量
来自 typing_extensions 导入 已弃用

来自 火炬 导入 _权重归一化, 除维度外的归一化
来自 torch.nn.modules 导入 模块
来自 torch.nn 参数 导入 参数, 未初始化的参数


__all__ = [“WeightNorm”, 权重范数, 移除权重归一化]


 WeightNorm:
    名称: 字符串
    暗淡: 整型

    def 初始化(self, 名称: 字符串, 暗淡: int) -> :
        如果 维度  :
            维度 = -1
        self.名称 = 名称
        self.维度 = 维度

    # TODO 使返回类型更具体
    def 计算权重(self, 模块: 模块) -> 任意:
        g = getattr(模块, self.名称 + "_g")
        v = getattr(模块, self.名称 + "_v")
        返回 _权重归一化(v, g, self.暗淡)

    @staticmethod
    @deprecated(
        "torch.nn.utils.weight_norm 已弃用 "
        "改用 torch.nn.utils.parametrizations.weight_norm。",
        分类=未来警告,
    )
    def 应用(模块, 名称: 字符串, 暗淡: int) -> “WeightNorm”:
         钩子  模块._前向预处理钩子.():
            如果 isinstance(hook, WeightNorm)  hook.名称 == 名称:
                提升 运行时错误(
                    f"不能在同一个参数上注册两个权重归一化钩子"{名称}"
                )

        如果 维度  :
            维度 = -1

        fn = WeightNorm(名称, 暗淡)

        权重 = getattr(模块, 名称)
        如果 isinstance(重量, 未初始化参数):
            提升 ValueError(
                "传递给 `权重归一化` 的模块不能有未初始化的参数。"
                "确保在应用权重归一化之前运行模拟前向"
            )
        # 从参数列表中移除 w
        删除 模块.参数[名称]

        # 添加 g 和 v 作为新参数,并将 w 表示为 g/||v|| * v
        模块.注册参数(
            名称 + "_g", 参数(除维度外的范数(重量, 2, 暗淡).数据)
        )
        模块.注册参数(名称 + "_v", 参数(重量.数据))
        setattr(模块, 名称, 函数.计算权重(模块))

        在每次 forward() 之前重新计算权重
        模块.注册前向钩子(函数)

        返回 fn

    def 删除(self, 模块: 模块) -> :
        权重 = self.计算权重(模块)
        delattr(模块, self.名称)
        删除 模块.参数[self.名称 + "_g"]
        删除 模块.参数[self.名称 + "_v"]
        setattr(模块, self.名称, 参数(重量.数据))

    def __调用__(self, 模块: 模块, 输入: 任意) -> :
        setattr(模块, self.名称, self.计算权重(模块))


T 模块 = 类型变量("T 模块", 绑定=模块)


[文档]def 重量归一化(模块: 模块 T, 名称: 字符串 = 权重, 暗淡: 整型 = 0) -> 模块 T: r将权重归一化应用于给定模块中的参数。 .. math:: \mathbf{w} = g \dfrac{\mathbf{v}}{\|\mathbf{v}\|} 权重归一化是一种重新参数化方法,将权重张量的幅度与其方向解耦。这取代了指定的参数。 权重张量的幅度与其方向解耦。这取代了指定的参数。 通过:attr:`name`(例如 ``'weight'``)使用两个参数:一个指定大小 (例如 ``'weight_g'``)以及一个指定方向的(例如 ``'weight_v'``)。 权重归一化通过一个钩子实现,该钩子在每次调用 :meth:`~Module.forward` 之前重新计算张量的幅度和方向。 此函数已弃用。请使用 :func:`torch.nn.utils.parametrizations.weight_norm`。 调用。 要计算整个权重张量的范数,请使用。 要计算整个权重张量的范数,请使用。 `dim=None` 查看 https://arxiv.org/abs/1602.07868 .. 警告:: 该函数已弃用。请使用 :func:`torch.nn.utils.parametrizations.weight_norm`。 使用现代参数化 API。新的 ``weight_norm`` 与由旧 ``weight_norm`` 生成的 ``state_dict`` 兼容。 与由旧 ``weight_norm`` 生成的 ``state_dict`` 兼容。 迁移指南: * 大小(``weight_g``)和方向(``weight_v``)现在表示为 作为 ``parametrizations.weight.original0`` 和 ``parametrizations.weight.original1`` 分别。如果这让你感到困扰,请发表评论。 https://github.com/pytorch/pytorch/issues/102999 * 要移除权重归一化重参数化,请使用 func:`torch.nn.utils.parametrize.remove_parametrizations`。 模块前向时不再重新计算权重;相反,它将在每次访问时重新计算。要恢复旧行为,请在调用相关模块之前使用:func:`torch.nn.utils.parametrize.cached`。 要恢复旧行为,请在调用相关模块之前使用:func:`torch.nn.utils.parametrize.cached`。 在调用相关模块之前使用:func:`torch.nn.utils.parametrize.cached`。 在调用相关模块之前使用:func:`torch.nn.utils.parametrize.cached`。 参数: 模块(Module):包含模块 名称(str,可选):权重参数的名称 dim(int,可选):计算范数的维度 返回: 带权重范数钩子的原始模块 示例:: >>> m = weight_norm(nn.Linear(20, 40), name='weight') >>> m Linear(in_features=20, out_features=40, bias=True) >>> m.weight_g.size() torch.Size([40, 1]) >>> m.weight_v.size() torch.Size([40, 20]) "源代码" WeightNorm.应用(模块, 名称, 暗淡) 返回 模块
[文档]def remove_weight_norm(module: T_module, name: str = "weight") -> T_module: r"""从模块中移除权重归一化重参数化。 Args: module (模块): 包含模块 name (str, 可选): 权重参数名称 示例: >>> m = weight_norm(nn.Linear(20, 40)) >>> remove_weight_norm(m) """ """ for k, hook in module._forward_pre_hooks.items(): 如果 hook 是 WeightNorm 类型且 hook.name 等于 name: hook.remove(module) 删除 module._forward_pre_hooks[k] 返回 module 抛出 ValueError 异常(f"在 {module} 中未找到 '{name}' 的 weight_norm")

© 版权所有 PyTorch 贡献者。

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

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源