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