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

torch.nn.functional 的源代码

功能接口。

导入 导入库
导入 数学
导入 警告
from 打字 导入 可调用, 可选, 类型检查, 联合

导入 火炬
from 火炬 导入 _VF, sym_int  _sym_int, 张量
from torch._C 导入 _添加文档字符串, 推断大小
from torch._jit_internal 导入 (
    超载_,
    布尔分发,
    广播列表 1,
    广播列表 2,
    广播列表 3,
)
from torch._torch_docs 导入 可复现性说明, 稀疏支撑说明, tf32 说明
from torch.nn 导入 _减少  _减少, 梯度  # noqa: F401
from torch.nn 模块.utils 导入 带默认值的列表, _pair, _single, _triple
from torch.overrides 导入 (
    handle_torch_function,
    有 torch 功能,
    has_torch_function_unary,
    has_torch_function_variadic,
)


如果 类型检查:
    from torch.types 导入 _dtype  数据类型
else:
    # JIT 编译器不理解 Union,也不理解这里的 torch.dtype
    数据类型 = 整型

尝试:
    导入 numpy  np
除了 模块未找到错误:
    np = 


conv1d = _添加文档字符串(
    torch.卷积 1D,
    r""
conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) -> 索引

对由多个输入平面组成的输入信号应用 1D 卷积。
请参阅 :class:`~torch.nn.Conv1d` 获取详细信息及输出形状。

{tf32_note}

详细信息和输出形状请参阅 :class:`~torch.nn.Conv1d`。

注意:
{cudnn_可复现性说明}

注意:
此运算符支持复杂数据类型,即 ``complex32, complex64, complex128``。
""".格式(
        **可复现性说明, **tf32 说明
    )
    + r""

参数:
输入:输入张量,形状为 :math:`(\text`{minibatch}, \text{in\_channels} , iW}`
权重:形状为 :math:`(\text{out\_channels} , \frac{\text{in\_channels}}{\text`{分组}} , kW)`
偏置:可选偏置,形状为 :math:`(out\_channels)`。默认:``None``
步长:卷积核的步长。可以是单个数字或
一个元素的元组 `(sW,)`。默认值:1
填充:输入两侧的隐式填充。可以是字符串 {'valid', 'same'}
单个数字或一个元素的元组 `(padW,)`。默认值:0
``padding='valid'`` 与无填充相同。``padding='same'`` 进行填充
输入以保持输出与输入相同的形状。然而,此模式
不支持除 1 以外的任何步长值。

.. 警告::
对于`padding='same'`,如果`weight`长度为偶数且
任何维度上的`dilation`为奇数,则执行完整的 :func:`pad` 操作
可能需要内部使用。降低性能。
扩展:卷积核元素之间的间隔。可以是单个数字或
一个单元素元组 `(dW,)`。默认:1
分组:将输入分割成组,:math:`\text{in\_channels}` 应该是组数的倍数。
默认:1

示例::

    >>> inputs = torch.randn(33, 16, 30)
    >>> filters = torch.randn(20, 16, 5)
    >>> F.conv1d(inputs, filters)
""",
)

conv2d = _添加文档字符串(
    torch.卷积 2D,
    r""
conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) -> Tensor

在输入图像上应用 2D 卷积,输入图像由多个输入组成
请参阅 :class:`~torch.nn.Conv1d` 获取详细信息及输出形状。

{tf32_note}

详细信息和输出形状请参阅 :class:`~torch.nn.Conv2d`

注意:
{cudnn_可复现性说明}

注意:
此运算符支持复杂数据类型,即 ``complex32, complex64, complex128``。
""".格式(
        **可复现性说明, **tf32 说明
    )
    + r""

参数:
输入:输入张量,形状为 :math:`(\text`{minibatch}(\text{in\_channels} , iH , iW))
权重:形状为 :math:`(\text{out\_channels} , \frac{\text{in\_channels}}{\text`{分组}} , kH , kW)`
偏置:可选的偏置张量,形状为 :math:`(out\_channels)`。默认:`None`
步长:卷积核的步长。可以是单个数字或一个元组(sT, sH, sW)。默认:1
元组 `(sH, sW)`。默认:1
填充:输入两侧的隐式填充。可以是字符串 {'valid', 'same'}
单个数字或一个元组 `(padH, padW)`。默认:0
``padding='valid'`` 与无填充相同。``padding='same'`` 进行填充
输入以保持输出与输入相同的形状。然而,此模式
不支持除 1 以外的任何步长值。

.. 警告::
对于`padding='same'`,如果`weight`长度为偶数且
任何维度上的`dilation`为奇数,则执行完整的 :func:`pad` 操作
可能需要内部使用。降低性能。

扩展:卷积核元素之间的间隔。可以是单个数字或
一个元组 `(dH, dW)`。默认:1
组:将输入分割成组,包括 :math:`\text{in\_channels}` 和 :math:`\text{out\_channels}`
应该可以被组数整除。默认:1

示例::

>>> # 使用方形核和相等步长
    >>> filters = torch.randn(8, 4, 3, 3)
>>> 输入 = torch.randn(1, 4, 5, 5)
    >>> F.conv2d(inputs, filters, padding=1)
""",
)  # noqa: E501

conv3d = _添加文档字符串(
    torch.卷积 3D,
    r""
conv3d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) -> Tensor

在由多个输入图像组成的输入上应用 3D 卷积
请参阅 :class:`~torch.nn.Conv1d` 获取详细信息及输出形状。

{tf32_note}

请参阅 :class:`~torch.nn.Conv3d` 以获取详细信息及输出形状。

注意:
{cudnn_可复现性说明}

注意:
此运算符支持复杂数据类型,即 ``complex32, complex64, complex128``。
""".格式(
        **可复现性说明, **tf32 说明
    )
    + r""

参数:
输入:输入张量,形状为 :math:`(\text`{minibatch} , \text{in\_channels} , iT , iH , iW)`
权重:形状为 :math:`(\text{out\_channels} , \frac{\text{in\_channels}}{\text`{分组}} , kT , kH , kW)`
bias: 可选的形状为 :math:`(\text{out\_channels})` 的偏置张量。默认:None
步长:卷积核的步长。可以是单个数字或一个元组(sT, sH, sW)。默认:1
元组 `(sT, sH, sW)`。默认:1
填充:输入两侧的隐式填充。可以是字符串 {'valid', 'same'}
单个数字或一个元组 `(padT, padH, padW)`。默认:0
``padding='valid'`` 与无填充相同。``padding='same'`` 进行填充
输入以保持输出与输入相同的形状。然而,此模式
不支持除 1 以外的任何步长值。

.. 警告::
对于`padding='same'`,如果`weight`长度为偶数且
任何维度上的`dilation`为奇数,则执行完整的 :func:`pad` 操作
可能需要内部使用。降低性能。

扩展:卷积核元素之间的间隔。可以是单个数字或
一个元组 `(dT, dH, dW)`。默认:1
分组:将输入分割成组,:math:`\text{in\_channels}` 应该是组数的倍数。
默认:1

示例::

    >>> filters = torch.randn(33, 16, 3, 3, 3)
    >>> inputs = torch.randn(20, 16, 50, 10, 20)
    >>> F.conv3d(inputs, filters)
""",
)  # noqa: E501

conv_transpose1d = _添加文档字符串(
    torch.卷积转置 1D,
    r""
conv_transpose1d(input, weight, bias=None, stride=1, padding=0, output_padding=0, groups=1, dilation=1) -> Tensor

在输入信号上应用 1D 转置卷积算子
由几个输入平面组成,有时也称为“反卷积”。

{tf32_note}

请参阅 :class:`~torch.nn.ConvTranspose1d` 以获取详细信息及输出形状。

注意:
{cudnn_可复现性说明}
""".格式(
        **可复现性说明, **tf32 说明
    )
    + r""

参数:
输入:输入张量,形状为 :math:`(\text`{minibatch}, \text{in\_channels} , iW}`
weight: 形状为 :math:`(\text{in\_channels} , \frac{\text{out\_channels}}{\text{分组}} , kW)`
bias: 可选偏置,形状为 :math:`(\text{out\_channels})`. 默认: None
步长:卷积核的步长。可以是单个数字或一个元组(sT, sH, sW)。默认:1
元组 `(sW,)`。默认:1
扩展:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
填充:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
(padW,)。默认:0
输出填充:在每个维度的一侧添加的额外大小
输出形状。可以是单个数字或元组(out_padW)。默认:0
分组:将输入拆分为组,:math:`\text{in\_channels}` 应该是组数的倍数。
组数。默认:1
扩展:卷积核元素之间的间隔。可以是单个数字或
一个元组(dW,)。默认值:1

示例::

>>> 输入 = torch.randn(20, 16, 50)
>>> 权重 = torch.randn(16, 33, 5)
    >>> F.conv_transpose1d(inputs, weights)
""",
)

conv_transpose2d = _添加文档字符串(
    torch.转置卷积 2D,
    r""
conv_transpose2d(input, weight, bias=None, stride=1, padding=0, output_padding=0, groups=1, dilation=1) -> Tensor

在输入图像上应用二维转置卷积算子
由几个输入平面组成,有时也称为“反卷积”。

{tf32_note}

详细信息和输出形状请参阅 :class:`~torch.nn.ConvTranspose2d`。

注意:
{cudnn_可复现性说明}
""".格式(
        **可复现性说明, **tf32 说明
    )
    + r""

参数:
输入:输入张量,形状为 :math:`(\text`{minibatch}(\text{in\_channels} , iH , iW))
weight: 形状为 :math:`(\text{in\_channels} , \frac{\text{out\_channels}}{\text{分组}} , kH , kW)`
bias: 可选偏置,形状为 :math:`(\text{out\_channels})`. 默认: None
步长:卷积核的步长。可以是单个数字或一个元组(sT, sH, sW)。默认:1
元组 `(sH, sW)`。默认:1
扩展:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
填充:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
`(padH, padW)`。默认值:0
输出填充:在每个维度的一侧添加的额外大小
输出形状。可以是单个数字或一个元组(out_padH, out_padW)。
默认:0
分组:将输入拆分为组,:math:`\text{in\_channels}` 应该是组数的倍数。
组数。默认:1
扩展:卷积核元素之间的间隔。可以是单个数字或
一个元组(dH,dW)。默认:1

示例::

>>> # 使用方形核和相等步长
>>> 输入 = torch.randn(1, 4, 5, 5)
    >>> weights = torch.randn(4, 8, 3, 3)
    >>> F.conv_transpose2d(inputs, weights, padding=1)
""",
)  # noqa: E501

conv_transpose3d = _添加文档字符串(
    torch.3D 转置卷积,
    r""
conv_transpose3d(input, weight, bias=None, stride=1, padding=0, output_padding=0, groups=1, dilation=1) -> Tensor

在输入图像上应用 3D 转置卷积算子
由多个输入平面组成,有时也称为“反卷积”

{tf32_note}

详细信息和输出形状请参阅 :class:`~torch.nn.ConvTranspose3d`。

注意:
{cudnn_可复现性说明}
""".格式(
        **可复现性说明, **tf32 说明
    )
    + r""

参数:
输入:输入张量,形状为 :math:`(\text`{minibatch} , \text{in\_channels} , iT , iH , iW)`
weight: 形状为 :math:`(\text{in\_channels} , \frac{\text{out\_channels}}{\text{分组}} , kT , kH , kW)`
bias: 可选偏置,形状为 :math:`(\text{out\_channels})`. 默认: None
步长:卷积核的步长。可以是单个数字或一个元组(sT, sH, sW)。默认:1
填充:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
扩展:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
填充:``dilation * (kernel_size - 1) - padding``。在输入的每个维度两侧将添加零填充。可以是单个数字或一个元组
``(padT, padH, padW)``。默认值:0
输出填充:在每个维度的一侧添加的额外大小
输出形状。可以是单个数字或一个元组
``(out_padT, out_padH, out_padW)``。默认值:0
分组:将输入拆分为组,:math:`\text{in\_channels}` 应该是组数的倍数。
组数。默认:1
扩展:卷积核元素之间的间隔。可以是单个数字或
一个元组 `(dT, dH, dW)`。默认:1

示例::

    >>> inputs = torch.randn(20, 16, 50, 10, 20)
    >>> weights = torch.randn(16, 33, 3, 3, 3)
    >>> F.conv_transpose3d(inputs, weights)
""",
)  # noqa: E501

conv_tbc = _添加文档字符串(
    torch.卷积转置块,
    r""
对输入序列应用一维序列卷积。
输入和输出维度为(时间,批,通道)- 因此为 TBC。

参数:
输入:形状为 :math:`(\text{序列长度} \times 批 \times \text{输入通道})` 的输入张量
重量:形状为(:math:`\text{kernel width} \times \text{in\_channels} \times \text{out\_channels}`)的滤波器
偏置:形状为(:math:`\text{out\_channels}`)的偏置
填充:需要填充的时间步数。默认:0
""",
)


# 池化
avg_pool1d = _添加文档字符串(
    torch.avg_pool1d,
    r""
avg_pool1d(input, kernel_size, 步长=None, 填充=0, 向上取整模式=False, 计数包含填充=True) -> Tensor

应用一维平均池化到由多个输入信号组成的输入信号上
输入平面。

查看 :class:`~torch.nn.AvgPool1d` 获取详细信息及输出形状。

参数:
输入张量形状为:(:math:`(minibatch, in\_channels, iW)`)
kernel_size:窗口大小。可以是单个数字或一个元组。
元组 `(kW,)`
步长:窗口的步长。可以是单个数字或一个元组
`(sW,)`. 默认: :attr:`核大小`
填充:输入两侧的隐式零填充。可以是
单个数字或一个元组 `(padW,)`。默认:0
ceil_mode: 当为 True 时,将使用`ceil`而不是`floor`进行计算
输出形状。默认:``False``
to compute the output shape. Default: ``False``
平均计算。默认:``True``

示例::

>>> # 正方形窗口池化大小=3,步长=2
    >>> input = torch.tensor([[[1, 2, 3, 4, 5, 6, 7]]], dtype=torch.float32)
    >>> F.avg_pool1d(input, kernel_size=3, stride=2)
    tensor([[[ 2.,  4.,  6.]]])

""",
)


avg_pool2d = _添加文档字符串(
    torch._C._nn.avg_pool2d,
    r""
avg_pool2d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None) -> 张量

在`:math:`kH \times kW`区域通过步长应用 2D 平均池化操作
`sH × sW` 步。输出特征的数量等于
输入平面。

详细信息和输出形状请参阅 :class:`~torch.nn.AvgPool2d`。

参数:
输入:输入张量 :math:`(\text{minibatch} , \text{in\_channels} , iH , iW)`。
核大小:池化区域的大小。可以是单个数字或一个序列。
元组 `(kH, kW)`
步长:池化操作的步长。可以是单个数字或一个
元组 `(sH, sW)`。默认值::attr:`kernel_size`
填充:输入两侧的隐式零填充。可以是
单个数字或一个元组 `(padH, padW)`。默认:0
ceil_mode:当为 True 时,将使用 `ceil` 而不是 `floor` 在计算输出形状的公式中。默认:``False``
count_include_pad:当为 True 时,将包括零填充。默认:``False``
to compute the output shape. Default: ``False``
平均计算。默认:``True``
divisor_override:如果指定,则用作除数,否则
将使用池化区域的大小。默认:None
""",
)

avg_pool3d = _添加文档字符串(
    torch._C._nn.avg_pool3d,
    r""
avg_pool3d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None) -> Tensor

在 :math:`kT \times kH \times kW` 区域内应用 3D 平均池化操作,步进
尺寸:`sT × sH × sW` 步。输出特征的数量等于
`⌊input planes / sT⌋`。

详细信息和输出形状请参阅::class:`~torch.nn.AvgPool3d`。

参数:
输入:输入张量 :math:`(minibatch, in\_channels, iT × iH, iW)`。
核大小:池化区域的大小。可以是单个数字或一个序列。
元组 `(kT, kH, kW)`。
步长:池化操作的步长。可以是单个数字或一个
元组 `(sT, sH, sW)`。默认值::attr:`kernel_size`。
填充:输入两侧的隐式零填充。可以是
单个数字或一个元组(padT, padH, padW),默认:0
ceil_mode:当为 True 时,将使用 `ceil` 而不是 `floor` 在计算输出形状的公式中。默认:``False``
的公式
to compute the output shape. Default: ``False``
平均值计算
divisor_override:如果指定,则用作除数,否则
将使用池化区域的大小。默认:None
""",
)


定义 分数最大池化 2d 带索引(
    输入: 张量,
    核心大小: 广播列表 2[整数]
    output_size: 可选[广播列表 2[整数]] = ,
    输出比例: 可选[广播列表 2[float]] = ,
    返回索引: 布尔 = 错误,
    _随机样本: 可选[张量] = ,
) 输入文本:
->

翻译:
-> 元组[张量, 张量]:  # 无需注意:D400
    r""
    fractional_max_pool2d(input, kernel_size, output_size=None, output_ratio=None, return_indices=False, _random_samples=None)

对由多个输入平面组成的输入信号应用二维分数最大池化。

分数最大池化在 Ben Graham 的论文《Fractional MaxPooling》中详细描述

最大池化操作在`:math:`kH \times kW`区域通过随机方式应用
步长由目标输出大小确定。
输出特征的数量等于输入平面的数量。

参数:
kernel_size:取最大值操作的窗口大小。
可以是一个单个数字 :math:`k`(表示 :math:`k \times k` 的正方形核)
或者是一个元组 `(kH, kW)`
output_size:图像的目标输出大小,形式为 :math:`oH \times oW`
可以是一个元组 `(oH, oW)` 或者一个单个数字 :math:`oH`,用于表示正方形图像 :math:`oH \times oH`
输出比例:如果想要将输出大小设置为输入大小的比例,则可以提供此选项。
这必须是一个在范围(0,1)内的数字或元组。
return_indices:如果为 True,则将返回索引和输出。
可用于传递给:func:`~torch.nn.functional.max_unpool2d`。

示例:
        >>> input = torch.randn(20, 16, 50, 32)
>>> # 使用大小为 3 的正方形窗口池化,目标输出大小为 13x12
        >>> F.fractional_max_pool2d(input, 3, output_size=(13, 12))
>>> # 正方形窗口池和目标输出大小为输入图像大小的一半
        >>> F.fractional_max_pool2d(input, 3, output_ratio=(0.5, 0.5))

    .. _Fractional MaxPooling:
        http://arxiv.org/abs/1412.6071
"文档"
    如果 has_torch_function_variadic(输入, _随机样本):
        返回 handle_torch_function(
            分数最大池化 2d 带索引,
            (输入, _随机样本),
            输入,
            核心大小,
            output_size=output_size,
            输出比例=输出比例,
            返回索引=返回索引,
            _随机样本=_随机样本,
        )
    如果 输出大小    输出比率  :
        raise ValueError(
            "fractional_max_pool2d 函数需要指定输出大小或输出比例"
        )
    如果 输出大小  :
        断言 输出比率   
        如果 长度(输出比例) > 2:
            raise ValueError(
                "fractional_max_pool2d 函数要求 output_ratio 必须是单个整数或整数元组。"
            )
        _输出比率_ = _pair(输出比例)
        输出大小 = [
            整数(输入.尺寸(-2) * 输出比率[0)]
            整数(输入.尺寸(-1) * 输出比率[1)]
        ]

    如果 随机样本  :
        批次大小 = 1 如果 输入.() == 3 否则 输入.尺寸(0)
        随机样本 = torch.随机(
            批次大小, 输入.尺寸(-3), 2, 数据类型=输入.数据类型, 设备=输入.设备
        )
    返回 torch._C._nn.分数最大池化 2d(
        输入, 核心大小, output_size, 随机样本
    )


定义 分数最大池化 2D(
    输入: 张量,
    核心大小: 广播列表 2[整数]
    output_size: 可选[广播列表 2[整数]] = ,
    输出比例: 可选[广播列表 2[float]] = ,
    返回索引: 布尔 = 错误,
    _随机样本: 可选[张量] = ,
) 输入文本:
->

翻译:
-> 张量:
    如果 has_torch_function_variadic(输入, _随机样本):
        返回 handle_torch_function(
            分数最大池化 2d,
            (输入, _随机样本),
            输入,
            核心大小,
            output_size=output_size,
            输出比例=输出比例,
            返回索引=返回索引,
            _随机样本=_随机样本,
        )
    返回 分数最大池化 2d 带索引(
        输入, 核心大小, output_size, 输出比例, 返回索引, 随机样本
    )0]


分数最大池化 2D = 布尔分发(
    参数名称="返回索引",
    索引参数=4,
    默认=错误,
    if_true=分数最大池化 2d 带索引,
    如果为假=分数最大池化 2D,
    模块名称=__name__,
    函数名="分数最大池化 2D",
)


定义 分数最大池化 3d 带索引(
    输入: 张量,
    核心大小: 广播列表 3[整数]
    output_size: 可选[广播列表 3[整数]] = ,
    输出比例: 可选[广播列表 3[float]] = ,
    返回索引: 布尔 = 错误,
    _随机样本: 可选[张量] = ,
) 输入文本:
->

翻译:
-> 元组[张量, 张量]:  # 无需注意:D400
    r""
    fractional_max_pool3d(input, kernel_size, output_size=None, output_ratio=None, return_indices=False, _random_samples=None)

对由多个输入平面组成的输入信号应用 3D 分数最大池化。

分数最大池化在 Ben Graham 的论文《Fractional MaxPooling》中详细描述

最大池化操作通过随机方式应用于 :math:`kT \times kH \times kW` 区域
步长由目标输出大小确定。
输出特征的数量等于输入平面的数量。

参数:
kernel_size:取最大值操作的窗口大小。
可以是一个单个数字:数学公式`k`(表示一个:数学公式`k \times k \times k`的立方核)
或者是一个元组(kT,kH,kW)
输出大小:目标输出尺寸,形式为 :math:`oT \times oH \times oW`。
可以是一个元组 `(oT, oH, oW)`,或者是一个单独的数字 :math:`oH` 用于立方体输出。
\(oH \times oH \times oH\)
输出比例:如果想要将输出大小设置为输入大小的比例,则可以提供此选项。
这必须是一个在范围(0,1)内的数字或元组。
return_indices:如果为 True,则将返回索引和输出。
可用于传递给 :func:`~torch.nn.functional.max_unpool3d`。

形状:
- 输入::math:`(N, C, T_{in}, H_{in}, W_{in})` 或 :math:`(C, T_{in}, H_{in}, W_{in})`。
输出::math:`(N, C, T_{out}, H_{out}, W_{out})` 或 :math:`(C, T_{out}, H_{out}, W_{out})`,其中
math:`(T_{out}, H_{out}, W_{out})=\text{output\_size}` 或
math:`(T_{out}, H_{out}, W_{out})=\text{output\_ratio} \times (T_{in}, H_{in}, W_{in})`

示例:
        >>> input = torch.randn(20, 16, 50, 32, 16)
>>> # 立方体窗口大小为 3 的池化,目标输出大小为 13x12x11
        >>> F.fractional_max_pool3d(input, 3, output_size=(13, 12, 11))
>>> # 立方体窗口池化,目标输出大小为输入大小的一半
        >>> F.fractional_max_pool3d(input, 3, output_ratio=(0.5, 0.5, 0.5))

    .. _Fractional MaxPooling:
        http://arxiv.org/abs/1412.6071
"文档"
    如果 has_torch_function_variadic(输入, _随机样本):
        返回 handle_torch_function(
            分数最大池化 3d 带索引,
            (输入, _随机样本),
            输入,
            核心大小,
            output_size=output_size,
            输出比例=输出比例,
            返回索引=返回索引,
            _随机样本=_随机样本,
        )
    如果 输出大小    输出比率  :
        raise ValueError(
            "fractional_max_pool3d 函数需要指定输出大小或输出比例"
        )
    如果 输出大小  :
        断言 输出比率   
        _输出比率_ = _三倍_(输出比例)
        输出大小 = [
            整数(输入.尺寸(-3) * 输出比率[0)]
            整数(输入.尺寸(-2) * 输出比率[1)]
            整数(输入.尺寸(-1) * 输出比率[2)]
        ]

    如果 随机样本  :
        批次大小 = 1 如果 输入.() == 4 否则 输入.尺寸(0)
        随机样本 = torch.随机(
            批次大小, 输入.尺寸(-4), 3, 数据类型=输入.数据类型, 设备=输入.设备
        )
    返回 torch._C._nn.分数最大池化 3d(
        输入, 核心大小, output_size, 随机样本
    )


定义 分数最大池化 3D(
    输入: 张量,
    核心大小: 广播列表 3[整数]
    output_size: 可选[广播列表 3[整数]] = ,
    输出比例: 可选[广播列表 3[float]] = ,
    返回索引: 布尔 = 错误,
    _随机样本: 可选[张量] = ,
) 输入文本:
->

翻译:
-> 张量:
    如果 has_torch_function_variadic(输入, _随机样本):
        返回 handle_torch_function(
            分数最大池化 3d,
            (输入, _随机样本),
            输入,
            核心大小,
            output_size=output_size,
            输出比例=输出比例,
            返回索引=返回索引,
            _随机样本=_随机样本,
        )
    返回 分数最大池化 3d 带索引(
        输入, 核心大小, output_size, 输出比例, 返回索引, 随机样本
    )0]


分数最大池化 3D = 布尔分发(
    参数名称="返回索引",
    索引参数=4,
    默认=错误,
    if_true=分数最大池化 3d 带索引,
    如果为假=分数最大池化 3D,
    模块名称=__name__,
    函数名="分数最大池化 3D",
)


定义 max_pool1d_with_indices(
    输入: 张量,
    核心大小: 广播列表 1[整数]
    步长: 可选[广播列表 1[整数]] = ,
    填充: 广播列表 1[整数] = 0,
    扩展率: 广播列表 1[整数] = 1,
    向上取整模式: 布尔 = 错误,
    返回索引: 布尔 = 错误,
) 输入文本:
->

翻译:
-> 元组[张量, 张量]:  # 无需注意:D400
    r""
max_pool1d(input, 核大小, 步长=None, 填充=0, 扩展率=1, 向上取整模式=False, 返回索引=False)

应用在由多个输入组成的输入信号上的 1D 最大池化
飞机。

.. 注意::
`:attr:`ceil_mode` 和 :attr:`return_indices` 的顺序不同`
在 `:class:`~torch.nn.MaxPool1d` 中可见,未来版本中将会更改。

查看 :class:`~torch.nn.MaxPool1d` 以获取详细信息。

参数:
输入:形状为:math:`(\text{minibatch} , \text{in\_channels} , iW)` 的输入张量,minibatch 维可选。
kernel_size:窗口大小。可以是单个数字或一个元组。
元组 `(kW,)`
步长:窗口的步长。可以是单个数字或一个元组
`(sW,)`. 默认: :attr:`核大小`
填充:在两侧添加隐式负无穷填充,必须大于等于 0 且小于等于核大小的一半。
扩展率:滑动窗口内元素之间的步长,必须大于 0。
ceil_mode: 如果为 ``True``,将使用 `ceil` 而不是 `floor` 来计算输出形状。
确保输入张量中的每个元素都被滑动窗口覆盖。
如果为 ``True``,将返回 argmax 沿着最大值。
对后续的 :class:`torch.nn.functional.max_unpool1d` 有用。
"文档"
    如果 has_torch_function_unary(输入):
        返回 handle_torch_function(
            max_pool1d_with_indices,
            (输入,),
            输入,
            核心大小,
            步长=步长,
            填充=填充,
            扩展率=扩展率,
            向上取整模式=向上取整模式,
            返回索引=返回索引,
        )
    如果 步长  :
        步长 = torch.算子.标注(列表[整数] []
    返回 torch.max_pool1d_with_indices(
        输入, 核心大小, 步长, 填充, 扩展率, 向上取整模式
    )


定义 _池化 1d(
    输入: 张量,
    核心大小: 广播列表 1[整数]
    步长: 可选[广播列表 1[整数]] = ,
    填充: 广播列表 1[整数] = 0,
    扩展率: 广播列表 1[整数] = 1,
    向上取整模式: 布尔 = 错误,
    返回索引: 布尔 = 错误,
) 输入文本:
->

翻译:
-> 张量:
    如果 has_torch_function_unary(输入):
        返回 handle_torch_function(
            最大池化 1D,
            (输入,),
            输入,
            核心大小,
            步长=步长,
            填充=填充,
            扩展率=扩展率,
            向上取整模式=向上取整模式,
            返回索引=返回索引,
        )
    如果 步长  :
        步长 = torch.算子.标注(列表[整数] []
    返回 torch.最大池化 1D(输入, 核心大小, 步长, 填充, 扩展率, 向上取整模式)


max_pool1d = 布尔分发(
    参数名称="返回索引",
    索引参数=6,
    默认=错误,
    if_true=max_pool1d_with_indices,
    如果为假=_池化 1d,
    模块名称=__name__,
    函数名=池化 1d,
)


定义 max_pool2d_with_indices(
    输入: 张量,
    核心大小: 广播列表 2[整数]
    步长: 可选[广播列表 2[整数]] = ,
    填充: 广播列表 2[整数] = 0,
    扩展率: 广播列表 2[整数] = 1,
    向上取整模式: 布尔 = 错误,
    返回索引: 布尔 = 错误,
) 输入文本:
->

翻译:
-> 元组[张量, 张量]:  # 无需注意:D400
    r""
max_pool2d(input, 核大小, 步长=None, 填充=0, 扩展率=1, 向上取整模式=False, 返回索引=False)

应用在由多个输入组成的输入信号上的 2D 最大池化
飞机。

.. 注意::
`:attr:`ceil_mode` 和 :attr:`return_indices` 的顺序不同`
在 `:class:`~torch.nn.MaxPool2d` 中可见,未来版本中将会更改。

查看 :class:`~torch.nn.MaxPool2d` 以获取详细信息。

参数:
输入张量:数学公式(批大小,输入通道,iH,iW),批大小维度可选。
核大小:池化区域的大小。可以是单个数字或一个序列。
元组 `(kH, kW)`
步长:池化操作的步长。可以是单个数字或一个
元组 `(sH, sW)`。默认值::attr:`kernel_size`
填充:在两侧添加隐式负无穷填充,必须大于等于 0 且小于等于核大小的一半。
扩展率:滑动窗口内元素之间的步长,必须大于 0。
ceil_mode: 如果为 ``True``,将使用 `ceil` 而不是 `floor` 来计算输出形状。
确保输入张量中的每个元素都被滑动窗口覆盖。
如果为 ``True``,将返回 argmax 沿着最大值。
对 :class:`torch.nn.functional.max_unpool2d` 后很有用
"文档"
    如果 has_torch_function_unary(输入):
        返回 handle_torch_function(
            max_pool2d_with_indices,
            (输入,),
            输入,
            核心大小,
            步长=步长,
            填充=填充,
            扩展率=扩展率,
            向上取整模式=向上取整模式,
            返回索引=返回索引,
        )
    如果 步长  :
        步长 = torch.算子.标注(列表[整数] []
    返回 torch._C._nn.max_pool2d_with_indices(
        输入, 核心大小, 步长, 填充, 扩展率, 向上取整模式
    )


定义 _max_pool2d(
    输入: 张量,
    核心大小: 广播列表 2[整数]
    步长: 可选[广播列表 2[整数]] = ,
    填充: 广播列表 2[整数] = 0,
    扩展率: 广播列表 2[整数] = 1,
    向上取整模式: 布尔 = 错误,
    返回索引: 布尔 = 错误,
) 输入文本:
->

翻译:
-> 张量:
    如果 has_torch_function_unary(输入):
        返回 handle_torch_function(
            max_pool2d,
            (输入,),
            输入,
            核心大小,
            步长=步长,
            填充=填充,
            扩展率=扩展率,
            向上取整模式=向上取整模式,
            返回索引=返回索引,
        )
    如果 步长  :
        步长 = torch.算子.标注(列表[整数] []
    返回 torch.max_pool2d(输入, 核心大小, 步长, 填充, 扩展率, 向上取整模式)


max_pool2d = 布尔分发(
    参数名称="返回索引",
    索引参数=6,
    默认=错误,
    if_true=max_pool2d_with_indices,
    如果为假=_max_pool2d,
    模块名称=__name__,
    函数名=最大池化 2d,
)


定义 max_pool3d_with_indices(
    输入: 张量,
    核心大小: 广播列表 3[整数]
    步长: 可选[广播列表 3[整数]] = ,
    填充: 广播列表 3[整数] = 0,
    扩展率: 广播列表 3[整数] = 1,
    向上取整模式: 布尔 = 错误,
    返回索引: 布尔 = 错误,
) 输入文本:
->

翻译:
-> 元组[张量, 张量]:  # 无需注意:D400
    r""
max_pool3d(input, 核大小, 步长=None, 填充=0, 扩展率=1, 向上取整模式=False, 返回索引=False)

应用在由多个输入组成的输入信号上的 3D 最大池化
飞机。

.. 注意::
`:attr:`ceil_mode` 和 :attr:`return_indices` 的顺序不同`
在 `:class:`~torch.nn.MaxPool3d` 中可见,未来版本中将会更改。

查看 :class:`~torch.nn.MaxPool3d` 以获取详细信息。

参数:
输入张量:数学公式(批大小,输入通道,iD,iH,iW),批大小维度可选。
核大小:池化区域的大小。可以是单个数字或一个序列。
元组 `(kT, kH, kW)`。
步长:池化操作的步长。可以是单个数字或一个
元组 `(sT, sH, sW)`。默认值::attr:`kernel_size`。
填充:在两侧添加隐式负无穷填充,必须大于等于 0 且小于等于核大小的一半。
扩展率:滑动窗口内元素之间的步长,必须大于 0。
ceil_mode: 如果为 ``True``,将使用 `ceil` 而不是 `floor` 来计算输出形状。
确保输入张量中的每个元素都被滑动窗口覆盖。
如果为 ``True``,将返回 argmax 沿着最大值。
对后续的 :class:`torch.nn.functional.max_unpool3d` 有用。
"文档"
    如果 has_torch_function_unary(输入):
        返回 handle_torch_function(
            max_pool3d_with_indices,
            (输入,),
            输入,
            核心大小,
            步长=步长,
            填充=填充,
            扩展率=扩展率,
            向上取整模式=向上取整模式,
            返回索引=返回索引,
        )
    如果 步长  :
        步长 = torch.算子.标注(列表[整数] []
    返回 torch._C._nn.max_pool3d_with_indices(
        输入, 核心大小, 步长, 填充, 扩展率, 向上取整模式
    )


定义 _max_pool3d(
    输入: 张量,
    核心大小: 广播列表 3[整数]
    步长: 可选[广播列表 3[整数]] = ,
    填充: 广播列表 3[整数] = 0,
    扩展率: 广播列表 3[整数] = 1,
    向上取整模式: 布尔 = 错误,
    返回索引: 布尔 = 错误,
) 输入文本:
->

翻译:
-> 张量:
    如果 has_torch_function_unary(输入):
        返回 handle_torch_function(
            最大池化 3D,
            (输入,),
            输入,
            核心大小,
            步长=步长,
            填充=填充,
            扩展率=扩展率,
            向上取整模式=向上取整模式,
            返回索引=返回索引,
        )
    如果 步长  :
        步长 = torch.算子.标注(列表[整数] []
    返回 torch.最大池化 3D(输入, 核心大小, 步长, 填充, 扩展率, 向上取整模式)


max_pool3d = 布尔分发(
    参数名称="返回索引",
    索引参数=6,
    默认=错误,
    if_true=max_pool3d_with_indices,
    如果为假=_max_pool3d,
    模块名称=__name__,
    函数名="max_pool3d",
)


定义 _unpool_output_size(
    输入: 张量,
    核心大小: 列表[整数]
    步长: 列表[整数]
    填充: 列表[整数]
    output_size: 可选[列表[整数]],
) 输入文本:
->

翻译:
-> 列表[整数]:
    输入大小 = 输入.尺寸()
    默认大小 = torch.算子.标注(列表[整数] []
    for d  范围(长度(核心大小)):
        默认大小.append(
            (输入大小[-长度(核心大小) + d] - 1) * 步长[d]
            + 核心大小[d]
            - 2 * 填充[d]
        )
    如果 输出大小  :
        返回 = 默认大小
    else:
        如果 长度(output_size) == 长度(核心大小) + 2:
            输出大小 = output_size[2]
        如果 长度(output_size) != 长度(核心大小):
            raise ValueError(
                输出大小应为包含 " 的序列
                f"{长度(核心大小)}或者{长度(核心大小) + 2}元素,但它长度为 '{长度(output_size)} 
            )
        for d  范围(长度(核心大小)):
            最小尺寸 = 默认大小[d] - 步长[d]
            max_size = 默认大小[d] + 步长[d]
            如果  (最小尺寸 < output_size[d] < 最大大小):
                raise ValueError(
                    f'无效的输出尺寸'{output_size}'(维度'{d}必须介于{最小大小}{最大大小})'
                )

        返回 = 输出大小
    返回 返回


[文档]def max_unpool1d( 输入: Tensor, 索引: Tensor, 核大小: BroadcastingList1[int], stride: 可选的[BroadcastingList1[int]] = None, padding: BroadcastingList1[int] = 0, output_size: Optional[BroadcastingList1[int]] = None, ) -> Tensor: 计算一个 :class:`MaxPool1d` 的部分逆运算。 详细信息请参阅 :class:`~torch.nn.MaxUnpool1d`。 """ 如果存在 torch 函数一元运算符(input): return handle_torch_function( max_unpool1d, (input,), input, 索引, 核心大小, 步长=stride, 填充=padding, output_size=output_size, ) kernel_size = _single(kernel_size) 如果 stride 不为 None: `_stride = _single(stride)` `else:` `_stride = kernel_size` `padding = _single(padding)` output_size = _unpool_output_size(input, kernel_size, _stride, padding, output_size) if isinstance(output_size, list): output_size = output_size + [1] else: output_size = output_size + (1,) return torch._C._nn.max_unpool2d( input.unsqueeze(-1), indices.unsqueeze(-1), output_size ).squeeze(-1)
[文档]def max_unpool2d( 输入: Tensor, 索引: Tensor, 核大小: BroadcastingList2[int], stride: 可选的[BroadcastingList2[int]] = None, padding: BroadcastingList2[int] = 0, output_size: Optional[BroadcastingList2[int]] = None, ) -> Tensor: 计算一个 `MaxPool2d` 类的部分逆运算。 详细信息请参阅 :class:`~torch.nn.MaxUnpool2d`。 """ 如果存在 torch 函数一元运算符 `input`: return handle_torch_function( max_unpool2d, (input,), input, 索引, 核心大小, 步长=stride, 填充=padding, output_size=output_size, ) kernel_size = _pair(kernel_size) if stride is not None: `_stride = _pair(stride)` `else:` `_stride = kernel_size` `padding = _pair(padding)` output_size = _unpool_output_size(input, kernel_size, _stride, padding, output_size) return torch._C._nn.max_unpool2d(input, indices, output_size)
[文档]def max_unpool3d( 输入: Tensor, 索引: Tensor, 核大小: BroadcastingList3[int], stride: 可选的[BroadcastingList3[int]] = None, padding: BroadcastingList3[int] = 0, output_size: Optional[BroadcastingList3[int]] = None, ) -> Tensor: 计算一个 `MaxPool3d` 的部分逆运算。 详细信息请参阅 :class:`~torch.nn.MaxUnpool3d`。 """ 如果存在 torch 函数一元运算符 `input`: return handle_torch_function( max_unpool3d, (input,), input, 索引, 核心大小, 步长=stride, 填充=padding, output_size=output_size, ) kernel_size = _triple(kernel_size) if stride is not None: `_stride = _triple(stride)` `else:` `_stride = kernel_size` `padding = _triple(padding)` output_size = _unpool_output_size(input, kernel_size, _stride, padding, output_size) return torch._C._nn.max_unpool3d(input, indices, output_size, _stride, padding)
[文档]def lp_pool3d( 输入: Tensor, 规范类型: Union[int, float], 核大小: BroadcastingList3[int], stride: 可选的[BroadcastingList3[int]] = None, ceil_mode: 布尔型 = False, ) -> Tensor: r""" 对由多个输入平面组成的输入信号应用 3D 功率平均池化。 如果所有输入的`p`次幂之和为零, 则梯度也设置为 0。 详细信息请参阅::class:`~torch.nn.LPPool3d`。 """ 如果存在 torch_function_unary(input): 返回 handle_torch_function( lp_pool3d, 输入, 输入, 规范类型, 核心大小, stride=stride, ceil_mode=ceil_mode, ) kd, kw, kh = _triple(kernel_size) 如果步长不为空: out = avg_pool3d(input.pow(norm_type), kernel_size, stride, 0, ceil_mode) else: out = avg_pool3d( input.pow(norm_type), kernel_size, padding=0, ceil_mode=ceil_mode ) return ( (torch.sign(out) * relu(torch.abs(out))).mul(kd * kw * kh).pow(1.0 / norm_type) )
[文档]def lp_pool2d( 输入: Tensor, 规范类型: int 或 float 的联合类型, 核大小: BroadcastingList2[int], stride: 可选[广播列表 2[int]] = None, ceil_mode: 布尔型 = False, ) -> Tensor: r""" 对由多个输入平面组成的输入信号应用 2D 功率平均池化。 如果所有输入的`p`次幂之和为零, 则梯度也设置为 0。 详细信息请参阅::class:`~torch.nn.LPPool2d`。 """ 如果存在 torch_function_unary(input): 返回 handle_torch_function( lp_pool2d, 输入, 输入, 规范类型, 核心大小, stride=stride, ceil_mode=ceil_mode, ) kw, kh = _pair(kernel_size) 如果步长不为空: out = avg_pool2d(input.pow(norm_type), kernel_size, stride, 0, ceil_mode) else: out = avg_pool2d( input.pow(norm_type), kernel_size, padding=0, ceil_mode=ceil_mode ) return (torch.sign(out) * relu(torch.abs(out))).mul(kw * kh).pow(1.0 / norm_type)
[文档]def lp_pool1d( 输入: Tensor, 规范类型: int 或 float, 核大小: int, stride: 可选的[BroadcastingList1[int]] = None, ceil_mode: bool = False, ) -> Tensor: r"""对由多个输入平面组成的输入信号应用 1D 幂平均池化。 所有输入求和的 `p` 次幂为零时 梯度也将设置为零。 详细信息请参阅 :class:`~torch.nn.LPPool1d`。 """ if has_torch_function_unary(input): return handle_torch_function( lp_pool1d, (input,) 输入, 规范类型, 核大小, 步长=stride, ceil_mode=ceil_mode, ) 如果 stride 不为 None: out = avg_pool1d(input.pow(norm_type), kernel_size, stride, 0, ceil_mode) else: out = avg_pool1d( input.pow(norm_type), kernel_size, padding=0, ceil_mode=ceil_mode ) return ( (torch.sign(out) * relu(torch.abs(out))).mul(kernel_size).pow(1.0 / norm_type) )
定义 adaptive_max_pool1d_with_indices( 输入
: 张量, output_size: 广播列表 1[整数] 返回索引: 布尔 = 错误, ) 输入文本: -> 翻译: -> 元组[张量, 张量]: # 无需注意:D400 r"" adaptive_max_pool1d(input, output_size, return_indices=False) 在由多个输入平面组成的输入信号上应用 1D 自适应最大池化。 几个输入平面。 请参阅 :class:`~torch.nn.AdaptiveMaxPool1d` 了解详细信息及输出形状。 参数: 输出大小:目标输出大小(单个整数) 返回索引:是否返回池化索引。默认:``False`` "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( adaptive_max_pool1d_with_indices, (输入,), 输入, output_size, 返回索引=返回索引, ) 返回 torch.adaptive_max_pool1d(输入, output_size) 定义 _自适应最大池化 1d( 输入: 张量, output_size: 广播列表 1[整数] 返回索引: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: 如果 has_torch_function_unary(输入): 返回 handle_torch_function( adaptive_max_pool1d, (输入,), 输入, output_size, 返回索引=返回索引, ) 返回 adaptive_max_pool1d_with_indices(输入, output_size)0] adaptive_max_pool1d 自适应池化 1d = 布尔分发( 参数名称="返回索引", 索引参数=2, 默认=错误, if_true=adaptive_max_pool1d_with_indices, 如果为假=_自适应最大池化 1d, 模块名称=__name__, 函数名="adaptive_max_pool1d", ) 定义 adaptive_max_pool2d_with_indices( 输入: 张量, output_size: 广播列表 2[整数] 返回索引: 布尔 = 错误, ) 输入文本: -> 翻译: -> 元组[张量, 张量]: # 无需注意:D400 radaptive_max_pool2d(input, output_size, return_indices=False) 自适应池化 2d(input, 输出大小, 返回索引=False) 应用在由输入信号组成的二维自适应最大池化 几个输入平面。 查看 :class:`~torch.nn.AdaptiveMaxPool2d` 获取详细信息及输出形状。 参数: 输出大小:目标输出大小(单个整数或) 双精度整数元组) 返回索引:是否返回池化索引。默认:``False`` "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( adaptive_max_pool2d_with_indices, (输入,), 输入, output_size, 返回索引=返回索引, ) 输出大小 = 带默认值的列表(output_size, 输入.尺寸()) 返回 torch._C._nn.adaptive_max_pool2d(输入, output_size) 定义 _adaptive_max_pool2d( 输入: 张量, output_size: 广播列表 2[整数] 返回索引: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: 如果 has_torch_function_unary(输入): 返回 handle_torch_function( adaptive_max_pool2d, (输入,), 输入, output_size, 返回索引=返回索引, ) 返回 adaptive_max_pool2d_with_indices(输入, output_size)0] adaptive_max_pool2d = 布尔分发( 参数名称="返回索引", 索引参数=2, 默认=错误, if_true=adaptive_max_pool2d_with_indices, 如果为假=_adaptive_max_pool2d, 模块名称=__name__, 函数名="adaptive_max_pool2d", ) 定义 adaptive_max_pool3d_with_indices( 输入: 张量, output_size: 广播列表 3[整数] 返回索引: 布尔 = 错误, ) 输入文本: -> 翻译: -> 元组[张量, 张量]: # 无需注意:D400 r"" adaptive_max_pool3d(input, output_size, return_indices=False) 应用在由输入信号组成的 3D 自适应最大池化 几个输入平面。 查看 :class:`~torch.nn.AdaptiveMaxPool3d` 获取详细信息及输出形状。 参数: 输出大小:目标输出大小(单个整数或) 三元整数元组) 返回索引:是否返回池化索引。默认:``False`` "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( adaptive_max_pool3d_with_indices, (输入,), 输入, output_size, 返回索引=返回索引, ) 输出大小 = 带默认值的列表(output_size, 输入.尺寸()) 返回 torch._C._nn.adaptive_max_pool3d(输入, output_size) 定义 _adaptive_max_pool3d( 输入: 张量, output_size: 广播列表 3[整数] 返回索引: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: 如果 has_torch_function_unary(输入): 返回 handle_torch_function( adaptive_max_pool3d, (输入,), 输入, output_size, 返回索引=返回索引, ) 返回 adaptive_max_pool3d_with_indices(输入, output_size)0] adaptive_max_pool3d = 布尔分发( 参数名称="返回索引", 索引参数=2, 默认=错误, if_true=adaptive_max_pool3d_with_indices, 如果为假=_adaptive_max_pool3d, 模块名称=__name__, 函数名="adaptive_max_pool3d", ) adaptive_avg_pool1d = _添加文档字符串( torch.adaptive_avg_pool1d, r"" adaptive_avg_pool1d(input, output_size) -> Tensor 对由多个输入平面组成的输入信号应用 1D 自适应平均池化。 请参阅 :class:`~torch.nn.AdaptiveAvgPool1d` 获取详细信息及输出形状。 详细信息和输出形状请参阅 :class:`~torch.nn.AdaptiveAvgPool1d`。 参数: 输出大小:目标输出大小(单个整数) """, )
[文档]def adaptive_avg_pool2d(input: Tensor, output_size: BroadcastingList2[int]) -> Tensor: r"""在由多个输入平面组成的输入信号上应用 2D 自适应平均池化。 详细信息和输出形状请参阅 :class:`~torch.nn.AdaptiveAvgPool2d`。 Args: 输出大小:目标输出大小(单个整数或 双整数元组) """ if has_torch_function_unary(input): return handle_torch_function(adaptive_avg_pool2d, (input,), input, output_size) _output_size = _list_with_default(output_size, input.size()) return torch._C._nn.adaptive_avg_pool2d(input, _output_size)
[docs]def adaptive_avg_pool3d(input: Tensor, output_size: BroadcastingList3[int]) -> Tensor: 应用在由多个输入平面组成的输入信号上的 3D 自适应平均池化。 详细信息和输出形状请参阅 :class:`~torch.nn.AdaptiveAvgPool3d`。 参数: 输出大小:目标输出大小(单个整数或 三整数元组) """ 如果有 torch_function_unary(input): return handle_torch_function(adaptive_avg_pool3d, (input,), input, output_size) _output_size = _list_with_default(output_size, input.size()) return torch._C._nn.adaptive_avg_pool3d(input, _output_size)
# 激活函数
[文档]def dropout( 输入: Tensor, p: float = 0.5, training: bool = True, inplace: 布尔值 = False, ) -> 张量: 在训练过程中,以概率 :attr:`p` 随机将输入张量的一些元素置为零。 使用伯努利分布的样本。 查看 :class:`~torch.nn.Dropout` 以获取详细信息。 参数: p: 将元素置零的概率。默认值:0.5 training: 如果为 ``True`` 则应用 dropout。默认值:``True`` inplace: 如果设置为 ``True``,将在此处执行此操作。默认:``False`` """ if has_torch_function_unary(input): return handle_torch_function( dropout, (输入,), 输入, p=p, 训练=training, 内置=inplace ) 如果 p < 0.0 或者 p > 1.0: 抛出 ValueError 异常(f"dropout 概率必须在 0 和 1 之间,但得到了 {p}") return ( _VF.dropout_(input, p, training) if inplace else _VF.dropout(input, p, training) )
[文档]def alpha_dropout( 输入: Tensor, p: float = 0.5, training: bool = False, inplace: 布尔值 = False, ) -> 张量: 应用 alpha dropout 到输入。 详细信息请参阅 :class:`~torch.nn.AlphaDropout`。 """ 如果存在 torch_function_unary(input): 返回 handle_torch_function( alpha_dropout, (input,), input, p=p, training=training, inplace=inplace ) 如果 p < 0.0 或者 p > 1.0: 抛出 ValueError 异常(f"dropout 概率必须在 0 和 1 之间,但得到了 {p}") return ( _VF.alpha_dropout_(输入, p, 是否训练) 如果就地 否则 _VF.alpha_dropout(输入, p, 是否训练) )
[文档]def dropout1d( 输入:张量, p: float = 0.5, training: bool = True, inplace: 布尔值 = False, ) -> 张量: 随机将整个通道置零(通道是一维特征图)。 例如,第 :math:`j` 个样本的第 :math:`i` 个通道的 批量输入是一个 1D 张量:math:`\text{input}[i, j]`,它是输入张量。 每个通道将在每次前向调用时独立地使用概率:attr:`p`,从伯努利分布中抽取样本置零。 请参阅:class:`~torch.nn.Dropout1d` 以获取详细信息。 请参阅:class:`~torch.nn.Dropout1d` 以获取详细信息。 Args: p: 频道归零的概率。默认值:0.5 training: 如果设置为 ``True``,则应用 dropout。默认值:``True`` inplace: 如果设置为 ``True``,将在此处执行此操作。默认值:``False`` """ 如果存在 torch 函数单例(input): 返回 handle_torch_function( dropout1d, (input,), input, p=p, training=training, inplace=inplace ) 如果 p < 0.0 或者 p > 1.0: 抛出 ValueError 异常(f"dropout 概率必须在 0 和 1 之间,但得到了 {p} ") inp_dim = input.dim() 如果 inp_dim 不在 (2, 3) 的范围内: raise RuntimeError( f"dropout1d: 预期 2D 或 3D 输入,但收到一个 {inp_dim}D 输入。 " "请注意,dropout1d 存在是为了在具有 1 " 空间维度、通道维度以及可选的批次维度 (即 2D 或 3D 输入)。 ) is_batched = inp_dim == 3 如果不是批量处理: input = input.unsqueeze_(0) if inplace else input.unsqueeze(0) result = ( _VF.feature_dropout_(input, p, training) 如果就地 否则 _VF.feature_dropout(input, p, training) ) 如果不是批处理 result = result.squeeze_(0) if inplace else result.squeeze(0) return result
[文档]定义 dropout2d( 输入: 张量, p: 浮点数 = 0.5, 训练: 布尔 = , 内置: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: r随机将整个通道置零(通道是指二维特征图)。 例如,第 :math:`j` 个通道的第 :math:`i` 个样本在批处理输入中是一个 3D 张量 :math:`\text{input}[i, j]`。 每个通道将在每次前向调用时独立置零。 每个通道将在每次前向调用中独立地以概率 :attr:`p` 使用伯努利分布的样本置零。 使用伯努利分布的样本以概率 :attr:`p` 独立地置零每个通道。 详细信息请参阅:class:`~torch.nn.Dropout2d` 参数: p:将通道置零的概率。默认:0.5 training:如果为 ``True`` 则应用 dropout。默认:``True`` inplace:如果设置为 ``True``,则将在此处进行原地操作。默认:``False`` "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( dropout2d, (输入,), 输入, p=p, 训练=训练, 内置=内置 ) 如果 p < 0.0 或者 p > 1.0: raise ValueError(f"dropout 概率必须在 0 和 1 之间,但得到了"{p}") 输入维度 = 输入.() 如果 输入维度 (3, 4): 警告信息 = ( fdropout2d: 收到{输入维度}-D 输入到 dropout2d,已弃用 并且将在未来的版本中导致错误。为了保留行为 "请使用 dropout 来静默此警告。请注意,dropout2d" "存在是为了在具有 2 个空间维度的输入上提供通道丢弃," "一个通道维度和一个可选的批次维度(即 3D 或 4D 输入)。" ) 警告.警告(warn_msg) 目前不支持无批处理维度输入。现在这些输入不被支持;传递 # 一个 3D 输入将执行 dropout1d 行为。这曾经是历史行为,现在这种行为仍然保持。 # 目前保持这种行为。 # 请参阅 https://github.com/pytorch/pytorch/issues/77081 如果 输入维度 == 3: 警告.警告( "dropout2d: 接收到 3D 输入并假设需要 1D dropout 行为 - 输入被解释为形状(N, C, L),其中 C " "是通道维度。此行为将在未来的版本中更改,以解释为形状(N, C, L),其中 C " "是通道维度。此行为将在未来的版本中更改,以解释为形状(N, C, L),其中 C " "输入没有批处理维度,即形状为(C,H,W)。为了保持 1D " "通道级 dropout 行为,请切换到使用 dropout1d。" ) 结果 = ( _VF.feature_dropout_(输入, p, 训练) 如果 内置 否则 _VF.feature_dropout(输入, p, 训练) ) 返回 结果
[文档]定义 dropout3d( 输入: 张量, p: 浮点数 = 0.5, 训练: 布尔 = , 内置: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: r"""随机将整个通道置零(通道是一个 3D 特征图)。""" 例如,第 :math:`j` 个通道的第 :math:`i` 个样本在批处理输入中是一个 3D 张量 :math:`\text{input}[i, j]`。 批处理输入是一个输入张量的 3D 张量 :math:`\text{input}[i, j]`。 每个通道将在每次前向调用中独立地以概率 :attr:`p` 使用伯努利分布的样本置零。 使用伯努利分布的样本以概率 :attr:`p` 独立地置零每个通道。 请参阅:class:`~torch.nn.Dropout3d` 以获取详细信息。 参数: p:将通道置零的概率。默认:0.5 training:如果为 ``True`` 则应用 dropout。默认:``True`` inplace:如果设置为 ``True``,则将在此处进行原地操作。默认:``False`` "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( dropout3d, (输入,), 输入, p=p, 训练=训练, 内置=内置 ) 如果 p < 0.0 或者 p > 1.0: raise ValueError(f"dropout 概率必须在 0 和 1 之间,但得到了"{p}") 输入维度 = 输入.() 如果 输入维度 (4, 5): 警告信息 = ( fdropout3d:收到一个{输入维度}-D dropout3d 的输入,已弃用 并且将在未来的版本中导致错误。为了保留行为 "请禁用此警告,建议使用 dropout。注意 dropout3d " "用于在具有 3 个空间维度的输入上提供通道级 dropout," "一个通道维度,以及可选的批次维度(即 4D 或 5D 输入)。" ) 警告.警告(warn_msg) 批处理 = 输入维度 == 5 如果 批处理: 输入 = 输入.unsqueeze_ (未翻译,因为这不是一个完整的英文单词或短语)(0) 如果 内置 否则 输入.展平(0) 结果 = ( _VF.feature_dropout_(输入, p, 训练) 如果 内置 否则 _VF.feature_dropout(输入, p, 训练) ) 如果 批处理: 结果 = 结果.挤压_(0) 如果 内置 否则 结果.挤压(0) 返回 结果
[文档]def feature_alpha_dropout( 输入: Tensor, p: float = 0.5, training: bool = False, inplace: 布尔值 = False, ) -> 张量: 随机屏蔽整个通道(通道是指特征图)。 例如,批输入中第 :math:`i` 个样本的第 :math:`j` 个通道 这是一个输入张量 :math:`\text{input}[i, j]` 的张量。与常规 Dropout 不同,激活值被设置为 SELU 激活函数的负饱和值。 每个元素将在每次前向调用时独立进行掩码,而不是将激活值设为零。 将激活值设置为 SELU 激活函数的负饱和值。 每个元素将在每次前向调用时独立进行掩码。 使用来自伯努利分布的样本计算概率:attr:`p`。 在每次前向调用时,要屏蔽的元素都会随机化,并按比例缩放和移动,以保持零均值和单位方差。 详细信息请参阅:class:`~torch.nn.FeatureAlphaDropout`。 请参阅:class:`~torch.nn.FeatureAlphaDropout`以获取详细信息。 Args: p: 零化通道的 dropout 概率。默认:0.5 training: 如果为 ``True`` 则应用 dropout。默认:``True`` inplace: 如果设置为 ``True``,则将此操作就地执行。默认:``False`` """ 如果存在 torch_function_unary(input): 返回 handle_torch_function( feature_alpha_dropout, 输入, 输入, p=等式, 训练=训练, inplace=inplace, ) 如果 p 小于 0.0 或大于 1.0: 抛出 ValueError 异常(f"dropout 概率必须在 0 和 1 之间,但得到了 {p} ") return ( _VF.feature_alpha_dropout_(input, p, training) if inplace else _VF.feature_alpha_dropout(input, p, training) )
定义
_阈值( 输入: 张量, 阈值: float, : float, 内置: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: r将阈值应用于输入张量的每个元素。 更多详情请参阅 :class:`~torch.nn.Threshold`。 "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( _阈值, (输入,), 输入, 阈值, , 内置=内置 ) 如果 内置: 结果 = _VF.阈值_(输入, 阈值, ) else: 结果 = _VF.阈值(输入, 阈值, ) 返回 结果 我们将此函数定义为_threshold,因为它接受一个参数 命名参数 threshold,它覆盖了递归引用函数所需的__ __torch_function__支持 阈值 = _threshold 阈值_ = _添加文档字符串( _VF.阈值_, r"" threshold_(input, threshold, value) -> Tensor func:`~threshold` 的就地版本。 """, )
[文档]def relu(input: Tensor, inplace: bool = False) -> Tensor: # noqa: D400,D402 r"""relu(input, inplace=False) -> Tensor""" 线性整流单元函数逐元素应用。详见 class:`~torch.nn.ReLU` 以获取更多详细信息。 """ if has_torch_function_unary(input): return handle_torch_function(relu, (input,), input, inplace=inplace) if inplace: result = torch.relu_(input) else: result = torch.relu(input) return result
relu_ = _添加文档字符串( torch.relu_, r"" relu_(输入) -> 张量 func:`~relu` 的就地版本。 """, )
[文档]def glu(input: Tensor, dim: int = -1) -> Tensor: # noqa: D400,D402 r""" glu(input, dim=-1) -> Tensor 门控线性单元。计算: 数学公式 \text{GLU}(a, b) = a \otimes \sigma(b) 其中 `input` 沿 `dim` 分成两半形成 `a` 和 `b`,:math:`\sigma` 是 sigmoid 函数,:math:`\otimes` 是矩阵之间的逐元素乘积。 查看 `基于门控卷积网络的语料库建模 `_。 Args: 输入 (Tensor):输入张量 dim (int):分割输入的维度。默认:-1 """ 如果存在 torch 函数单例(input): 返回 handle_torch_function(glu, (input,), input, dim=dim) 如果 input 的维度为 0: raise RuntimeError( "glu 不支持标量,因为减半大小必须是偶数" ) return torch._C._nn.glu(input, dim)
[文档]def hardtanh( 输入: Tensor, 最小值: float = -1.0, 最大值: float = 1.0, inplace: 布尔值 = False, ) -> Tensor: # noqa: D400,D402 r""" hardtanh(input, min_val=-1., max_val=1., inplace=False) -> Tensor 应用 HardTanh 函数逐元素。请参阅 :class:`~torch.nn.Hardtanh` 获取更多详情。 详细信息。 """ 如果 has_torch_function_unary(input): return handle_torch_function( hardtanh, (input,), input, min_val=min_val, max_val=max_val, inplace=inplace ) if min_val > max_val: 无法将 min_val 的值设置得大于 max_val 如果 inplace: result = torch._C._nn.hardtanh_(input, min_val, max_val) 否则: result = torch._C._nn.hardtanh(input, min_val, max_val) return result
hardtanh_ = _添加文档字符串( torch._C._nn.hardtanh_, r"" hardtanh_(input, min_val=-1., max_val=1.) -> Tensor func:`~hardtanh` 的就地版本。 """, )
[docs]def relu6(input: Tensor, inplace: bool = False) -> Tensor: # noqa: D400,D402 r"""relu6(input, inplace=False) -> Tensor 应用逐元素函数 :math:`\text{ReLU6}(x) = \min(\max(0,x), 6)`. 更多详情请参阅 :class:`~torch.nn.ReLU6`。 """ 如果存在 torch_function_unary(input): 返回 handle_torch_function(relu6, (input,), input, inplace=inplace) 如果 inplace: result = torch._C._nn.relu6_(input) else: result = torch._C._nn.relu6(input) return result
[文档]def elu(input: Tensor, alpha: float = 1.0, inplace: bool = False) -> Tensor: 应用逐元素的指数线性单元(ELU)函数。 更多详情请参阅 :class:`~torch.nn.ELU`。 """ if has_torch_function_unary(input): return handle_torch_function(elu, (input,), input, alpha=alpha, inplace=inplace) if inplace: result = torch._C._nn.elu_(input, alpha) else: result = torch._C._nn.elu(input, alpha) return result
elu_ = _添加文档字符串( torch._C._nn.elu_, r"" elu_(输入, alpha=1.) -> 张量 func:`~elu` 的就地版本。 """, )
[文档]def selu(输入: 张量, inplace: bool = False) -> 张量: # noqa: D400,D402 r"""selu(输入, inplace=False) -> 张量 元素级应用, math:`\text{SELU}(x) = scale * (\max(0,x) + \min(0, \alpha * (\exp(x) - 1)))`, 其中 :math:`\alpha=1.6732632423543772848170429916717` 和 math:`scale=1.0507009873554804934193349852946`。 查看更多详情,请参阅::class:`~torch.nn.SELU` """ 如果有 torch_function_unary(input): 返回 handle_torch_function(selu, (input,), input, inplace=inplace) if inplace: result = torch.selu_(input) else: result = torch.selu(input) 返回结果
selu_ = _添加文档字符串( torch.selu_, r"" selu_(输入) -> 张量 func:`~selu` 的就地版本。 """, )
[文档]def celu( 输入: Tensor, alpha: float = 1.0, inplace: bool = False, ) -> 张量: # noqa: D400,D402 r"""celu(input, alpha=1., inplace=False) -> 张量 逐元素应用, math:`\text{CELU}(x) = \max(0,x) + \min(0, \alpha * (\exp(x/\alpha) - 1))`。 查看更多详情,请参阅::class:`~torch.nn.CELU`。 """ 如果有_torch_function_unary(input): 返回 handle_torch_function( celu, (输入,), 输入, alpha=alpha, inplace=inplace ) if inplace: result = torch.celu_(输入, alpha) else: result = torch.celu(input, alpha) return result
celu_ = _添加文档字符串( torch.celu_, r"" celu_(input, alpha=1.) -> 张量 func:`~celu` 的就地版本。 """, )
[文档]def leaky_relu( 输入:Tensor, 负斜率:float = 0.01, 内置:bool = False, ) -> Tensor: # noqa: D400,D402 r""" leaky_relu(input, negative_slope=0.01, inplace=False) -> Tensor 逐元素应用, math:`\text{LeakyReLU}(x) = \max(0, x) + \text{negative\_slope} * \min(0, x)` 查看更多详情,请参阅::class:`~torch.nn.LeakyReLU`。 """ 如果有 torch_function_unary(input): 返回 handle_torch_function( leaky_relu, (输入,), 输入, 负斜率=negative_slope, 放置 inplace ) if inplace: result = torch._C._nn.leaky_relu_(输入, 负斜率) else: result = torch._C._nn.leaky_relu(input, negative_slope) return result
leaky_relu_ = _添加文档字符串( torch._C._nn.leaky_relu_, r"" leaky_relu_(输入,负斜率=0.01) -> 张量 func:`~leaky_relu` 的就地版本。 """, ) prelu = _添加文档字符串( torch.预激活函数, rprelu(input, weight) -> Tensor 对元素执行函数 math:`\text{PReLU}(x) = \max(0,x) + \text{weight} * \min(0,x)` 其中 weight 是一个 可学习的参数。 .. 注意: `weight` 预期为一个标量或一维张量。如果 `weight` 是一维的, 其大小必须与输入通道数匹配,该数由 当 `input.dim() >= 2` 时,`input.size(1)` 为 1,否则为 1。 在一维情况下,请注意当`input`的维度大于 2 时,`weight`可以展开 以一种使用常规方法不可能的方式调整 `input` 的形状 参考::ref:`广播语义`. 更多详情请参阅 :class:`~torch.nn.PReLU`。 """, )
[文档]def rrelu( 输入:张量, 下限:浮点数 = 1.0 / 8, 上限:浮点数 = 1.0 / 3, 训练:布尔值 = False, inplace: 布尔值 = False, ) -> Tensor: # noqa: D400,D402 r"""rrelu(input, lower=1./8, upper=1./3, training=False, inplace=False) -> Tensor 随机化泄漏 ReLU. 查看更多详情,请参阅::class:`~torch.nn.RReLU`。 """ 如果有 torch_function_unary(input): 返回 handle_torch_function( rrelu, (输入,), 输入, lower=lower, upper=大写, training=训练, inplace=原地, ) if inplace: result = torch.rrelu_(input, lower, upper, training) else: result = torch.rrelu(input, lower, upper, training) 返回结果
rrelu_ = _添加文档字符串( torch.rrelu_, r"" rrelu_(input, lower=1./8, upper=1./3, training=False) -> Tensor func:`~rrelu` 的就地版本。 """, ) logsigmoid = _添加文档字符串( torch._C._nn.log_sigmoid, r"" logsigmoid(input) -> 张量 逐元素应用 :math:`\text{LogSigmoid}(x_i) = \log \left(\frac{1}{1 + \exp(-x_i)}\right)` 更多详情请参阅 :class:`~torch.nn.LogSigmoid` """, ) gelu = _添加文档字符串( torch._C._nn.gelu, r"" gelu(input, approximate = 'none') -> 张量 当 approximate 参数为'none'时,它将函数逐元素应用 math:`\text{GELU}(x) = x * \Phi(x)` 的中文翻译为:GELU(x) = x * Φ(x) 其中 :math:`\Phi(x)` 是高斯分布的累积分布函数。 当近似参数为 'tanh' 时,Gelu 的估计为 .. 数学表达式 \text{GELU}(x) = 0.5 * x * (1 + \text{Tanh}(\sqrt{2 / \pi} * (x + 0.044715 * x^3))) 查看 `高斯误差线性单元 (GELUs) `_。 """, ) hardshrink = _添加文档字符串( torch.硬收缩, r"" hardshrink(input, lambd=0.5) -> 张量 应用逐元素硬收缩函数 详细信息请参阅 :class:`~torch.nn.Hardshrink`。 """, )
[文档]def tanhshrink(input): # noqa: D400,D402 tanhshrink(input) -> 张量 对元素应用,:math:`\text{Tanhshrink}(x) = x - \text{Tanh}(x)` 更多详情请参阅 :class:`~torch.nn.Tanhshrink` """ if has_torch_function_unary(input): return handle_torch_function(tanhshrink, (input,), input) return input - input.tanh()
[文档]def softsign(input): # noqa: D400,D402 softsign(input) -> 张量 对元素执行逐个应用,函数 :math:`\text{SoftSign}(x) = \frac{x}{1 + |x|}` 更多详情请参阅 :class:`~torch.nn.Softsign` """ if has_torch_function_unary(input): return handle_torch_function(softsign, (input,), input) return input / (input.abs() + 1)
softplus = _添加文档字符串( torch._C._nn.软性加, r"" softplus(input, beta=1, threshold=20) -> Tensor 逐元素应用函数::math:`\text{Softplus}(x) = \frac{1}{\beta} * \log(1 + \exp(\beta * x))`。 为了数值稳定性,实现会回退到线性函数。 当:math:`input \times \beta > threshold`时。 更多详情请参阅::class:`~torch.nn.Softplus`。 """, ) 定义
_get_softmax_dim(名称: 字符串, 维数: 整数, 栈级别: 整数) 输入文本: -> 翻译: -> 整数: 警告.警告( f隐式维度选择已被弃用。{名称} "请将调用方式修改为包含 dim=X 作为参数。", 栈级别=栈级别, ) 如果 维数 == 0 或者 维数 == 1 或者 维数 == 3: 返回 = 0 else: 返回 = 1 返回 返回
[文档]def softmin( 输入: Tensor, dim: Optional[int] = None, _stacklevel: int = 3, dtype: Optional[DType] = None, ) -> Tensor: r"""应用软归一化函数。 注意::math:`\text{Softmin}(x) = \text{Softmax}(-x)`。请参阅软归一化定义中的数学公式。 查看更多详情,请参阅::class:`~torch.nn.Softmin` 参数: 输入 (Tensor): 输入 dim (int): softmin 将要计算的维度(因此每个切片 沿着 dim 求和将等于 1)。 dtype (:class:`torch.dtype`, optional): 返回张量的期望数据类型。 如果指定,则在执行操作之前将输入张量转换为 :attr:`dtype`。这有助于防止数据类型溢出。默认:None。 如果指定,则在执行操作之前将输入张量转换为 :attr:`dtype`。这有助于防止数据类型溢出。默认:None。 """ 如果存在 torch_function_unary(input): 返回 handle_torch_function( softmin, (input,), input, dim=dim, _stacklevel=_stacklevel, dtype=dtype ) 如果 dim 为 None: dim = _get_softmax_dim("softmin", input.dim(), _stacklevel) 如果 dtype 为 None: ret = (-input).softmax(dim) else: ret = (-input).softmax(dim, dtype=dtype) return ret
[文档]def softmax( 输入: Tensor, dim: Optional[int] = None, _stacklevel: int = 3, dtype: Optional[DType] = None, ) -> Tensor: r"""应用 softmax 函数。 Softmax 定义为: \text{Softmax}(x_{i}) = \frac{\exp(x_i)}{\sum_j \exp(x_j)} 它应用于沿 dim 的所有切片,并将它们重新缩放,使得元素 落在范围 `[0, 1]` 内,并且总和为 1。 更多详情请参阅 :class:`~torch.nn.Softmax`。 Args: 输入 (Tensor): 输入 dim (int): 软 max 将被计算的维度。 dtype (:class:`torch.dtype`, optional): 返回张量的期望数据类型。 如果指定,则在操作之前将输入张量转换为 :attr:`dtype`。这有助于防止数据类型溢出。默认值:None。 执行操作。这有助于防止数据类型溢出。默认:None。 .. 注意:: 此函数不能直接与 NLLLoss 一起使用, 预期在 Softmax 和自身之间计算 Log。 使用 log_softmax 代替(它更快,并且具有更好的数值特性)。 """ 如果有 torch_function_unary(input): return handle_torch_function( softmax, (input,), input, dim=dim, _stacklevel=_stacklevel, dtype=dtype ) if dim is None: dim = _get_softmax_dim("softmax", input.dim(), _stacklevel) if dtype is None: ret = input.softmax(dim) else: ret = input.softmax(dim, dtype=dtype) return ret
[文档]定义 Gumbel 软最大化( logits: 张量, : 浮点数 = 1, : 布尔 = 错误, eps: 浮点数 = 1e-10, : 整型 = -1, ) 输入文本: -> 翻译: -> 张量: r"" Gumbel-Softmax 分布的样本(`链接 1`_ `链接 2`_)以及可选的离散化。 参数: logits: `[..., num_features]` 未归一化的对数概率 tau: 非负标量温度 hard: 如果为 ``True``,则返回的样本将被离散化为 one-hot 向量, 但将被区分,仿佛它是 autograd 中的软样本 dim(int):softmax 将计算的维度。默认值:-1。 返回: 从 Gumbel-Softmax 分布中采样的与`logits`形状相同的张量。 如果`hard=True`,则返回的样本将是一维热编码,否则不是。 在 `dim` 上求和为 1 的概率分布。 .. 注意:: 此函数出于历史原因存在,未来可能从 nn.Functional 中移除。 .. 注意:: `hard` 的主要技巧是执行 `y_hard - y_soft.detach() + y_soft`。 它实现了两个目标: - 使输出值正好为 one-hot - 由于我们添加然后减去 y_soft 值 - 使梯度等于 y_soft 梯度 - 由于我们移除所有其他梯度 示例: >>> logits = torch.randn(20, 32) >>> # Sample soft categorical using reparametrization trick: >>> F.gumbel_softmax(logits, tau=1, hard=False) >>> # Sample hard categorical using "Straight-through" trick: >>> F.gumbel_softmax(logits, tau=1, hard=True) .. _链接 1: https://arxiv.org/abs/1611.00712 .. _链接 2: https://arxiv.org/abs/1611.01144 "文档" 如果 has_torch_function_unary(logits): 返回 handle_torch_function( Gumbel 软最大化, (logits,), logits, =, =, eps=eps, =维度 ) 如果 eps != 1e-10: 警告.警告("`eps`参数已弃用,无任何效果。") 古姆贝尔斯 = ( -torch.空值类似(logits, 内存格式=torch.遗产连续格式) .指数() .日志() ) # ~Gumbel(0,1) 古姆贝尔斯 = (logits + 古姆贝尔斯) / 塔乌 # ~Gumbel(logits,tau) y_soft = 古姆贝尔斯.软式最大化() 如果 : # 直通。 索引 = 软 y.最大值(, 保持维度=)1] 难 y = torch.等于零的( logits, 内存格式=torch.旧连续格式 ).散射_(, 索引, 1.0) 返回 = 难 y - 软 y.detach() + y_soft else: 重参数化技巧。 返回 = y_soft 返回 返回
[文档]def log_softmax( 输入:张量, dim: 可选[int] = None, _stacklevel: int = 3, dtype: 可选[DType] = None, ) -> Tensor: 应用 softmax 后跟对数。 虽然数学上等同于 log(softmax(x)),但分别执行这两个操作会更慢且数值上不稳定。此函数使用一种替代公式来正确计算输出和梯度。 这些操作分别进行会更慢且数值上不稳定。此函数使用一种替代公式来正确计算输出和梯度。 此函数使用一种替代公式来正确计算输出和梯度。 查看更多详情,请参阅::class:`~torch.nn.LogSoftmax`。 参数: 输入(Tensor):输入 dim(int):log_softmax 将被计算的一个维度。 dtype (:class:`torch.dtype`, optional): 返回张量的期望数据类型。 如果指定,则在执行操作之前将输入张量转换为 :attr:`dtype`。这有助于防止数据类型溢出。默认值:None。 执行操作前,如果指定,则将输入张量转换为 :attr:`dtype`。这有助于防止数据类型溢出。默认:None。 """ if has_torch_function_unary(input): return handle_torch_function( log_softmax, (input,), input, dim=dim, _stacklevel=_stacklevel, dtype=dtype ) 如果 dim 为 None: dim = _get_softmax_dim("log_softmax", input.dim(), _stacklevel) 如果 dtype 为 None: ret = input.log_softmax(dim) else: ret = input.log_softmax(dim, dtype=dtype) return ret
softshrink = _添加文档字符串( torch._C._nn.软性收缩, r"" softshrink(input, lambd=0.5) -> 张量 应用逐元素软收缩函数 更多详情请参阅 :class:`~torch.nn.Softshrink`。 """, )
[文档]def tanh(input): # noqa: D400,D402 r"""tanh(input) -> 张量 元素级应用, \tanh(x) = \tanh(x) = \frac{\exp(x) - \exp(-x)}{\exp(x) + \exp(-x)} 更多详情请参阅 :class:`~torch.nn.Tanh`。 """ return input.tanh()
[文档]def sigmoid(input): # noqa: D400,D402 r"""sigmoid(input) -> Tensor 应用逐元素函数 :math:`\text{Sigmoid}(x) = \frac{1}{1 + \exp(-x)}` 查看更多详情,请参阅::class:`~torch.nn.Sigmoid` """ 返回 input 的 sigmoid()
[文档]def hardsigmoid(input: Tensor, inplace: bool = False) -> Tensor: 应用元素-wise 的 Hardsigmoid 函数。 .. math:: \text{Hardsigmoid}(x) = \begin{cases} 0 & \text{if~} x \le -3, \\ 1 & \text{如果} x \ge +3, \\ x / 6 + 1 / 2 & \text{否则} \end{cases} 参数: 如果设置为 ``True``,将在此处执行此操作。默认:``False`` 更多详情请参阅 :class:`~torch.nn.Hardsigmoid` """ 如果 has_torch_function_unary(input): return handle_torch_function(hardsigmoid, (input,), input, inplace=inplace) if inplace: return torch._C._nn.hardsigmoid_(input) return torch._C._nn.hardsigmoid(input)
线性
= _添加文档字符串( torch._C._nn.线性, r"" linear(input, weight, bias=None) -> Tensor 对传入数据进行线性变换::math:`y = xA^T + b` 此操作支持 2-D :attr:`weight` 使用 :ref:`稀疏布局` {sparse_beta_warning} 此操作符支持:ref:`TensorFloat32`. 形状: 输入::math:`(*, in\_features)` 其中 `*` 表示任意数量的维度,包括零维度 附加维度 权重::math:`(out\_features, in\_features)` 或 :math:`(in\_features)` - 偏差: :math:`(out\_features)` 或 :math:`()` - 输出: :math:`(*, out\_features)` 或 :math:`(*)`,根据权重的形状 """.格式( **稀疏支持注释 ), ) 双线性 = _添加文档字符串( torch.双线性, r"" bilinear(input1, input2, weight, bias=None) -> Tensor 对传入数据进行双线性变换: \( y = x_1^T A x_2 + b \) 形状: - input1: \( (N, *, H_{in1}) \) 其中 \( H_{in1}=\text{in1\_features} \) 并且 :math:`*` 表示任意数量的额外维度。 除了输入的最后维度外,所有维度都应该相同。 - input2: :math:`(N, *, H_{in2})` 其中 :math:`H_{in2}=\text{in2\_features}` - weight: :math:`(\text{out\_features}, \text{in1\_features},` `in2\_features)` - 偏置: :math:`(\text{out\_features})` - 输出: :math:`(N, *, H_{out})` 其中 :math:`H_{out}=\text{out\_features}` 并且除了最后一个维度外,其余维度都与输入相同。 """, )
[文档]def silu(input: Tensor, inplace: bool = False) -> Tensor: r"""应用逐元素的 Sigmoid 线性单元(SiLU)函数。 SiLU 函数也称为 swish 函数。 .. math:: \text{silu}(x) = x * \sigma(x),其中 \sigma(x) 是逻辑 Sigmoid 函数。 .. 注意: 查看《高斯误差线性单元(GELUs)`_ SiLU(Sigmoid 线性单元)最初被提出的地方,并查看 sigmoid 加权线性单元用于神经网络函数逼近 强化学习 和 `Swish: 自门控激活函数 该处后来进行了 SiLU 的实验。 查看更多详情,请参阅::class:`~torch.nn.SiLU` """ 如果有 torch_function_unary(input): 返回 handle_torch_function(silu, (input,), input, inplace=inplace) if inplace: return torch._C._nn.silu_(input) return torch._C._nn.silu(input)
[文档]def mish(input: Tensor, inplace: bool = False) -> Tensor: r"""应用元素级的 Mish 函数。 Mish:一种自正则化的非单调神经网络激活函数。 .. math:: Mish(x) = x * Tanh(Softplus(x)) .. 注意:: 查看 `Mish: 一种自正则化的非单调神经网络激活函数 ` 更多详情请参阅 :class:`~torch.nn.Mish` """ 如果存在 torch_function_unary(input): 返回 handle_torch_function(mish, (input,), input, inplace=inplace) 如果 inplace: return torch._C._nn.mish_(input) return torch._C._nn.mish(input)
[文档]def hardswish(input: Tensor, inplace: bool = False) -> Tensor: r"""应用元素级 hardswish 函数。""" 遵循论文中描述的实现: 《搜索 MobileNetV3》_。 .. math:: \text{Hardswish}(x) = \begin{cases} 0 & \text{如果} x \le -3, \\ x & \text{如果} x \ge +3, \\ x \cdot (x + 3) /6 & \text{否则} \end{cases} 查看更多详情,请参阅::class:`~torch.nn.Hardswish` .. _`搜索 MobileNetV3`: https://arxiv.org/abs/1905.02244 """ if has_torch_function_unary(input): return handle_torch_function(hardswish, (input,), input, inplace=inplace) if inplace: return torch._C._nn.hardswish_(input) return torch._C._nn.hardswish(input)
定义 _no_grad_embedding_renorm_( 重量
: 张量, 输入: 张量, 最大范数: float, 归一化类型: float, ) 输入文本: -> 翻译: -> 元组[张量, 张量]: torch.embedding_renorm_(重量.detach(), 输入, 最大范数, 归一化类型)
[文档]定义 嵌入( 输入: 张量, 重量: 张量, 填充索引: 可选[整数] = , 最大范数: 可选[float] = , 归一化类型: 浮点数 = 2.0, 按频率缩放梯度: 布尔 = 错误, 稀疏: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: r生成一个简单的查找表,用于在固定字典和大小中查找嵌入。 此模块常用于通过索引检索词嵌入。 模块的输入是一个索引列表和嵌入矩阵 输出对应词嵌入。 请参阅 :class:`torch.nn.Embedding` 获取更多详细信息。 .. 注意:: 注意,此函数关于 :attr:`weight` 中指定行 :attr:`padding_idx` 的分析梯度与数值梯度可能不同。 预期此函数关于 :attr:`weight` 中指定行 :attr:`padding_idx` 的分析梯度与数值梯度可能不同。 分析梯度与数值梯度可能不同。 .. 注意:: 注意 `:class:`torch.nn.Embedding` 与此函数不同, 它在构造时将 :attr:`weight` 的指定行 `:attr:`padding_idx` 初始化为零。 输入 (LongTensor):包含嵌入矩阵索引的 Tensor。 参数: 输入 (LongTensor):包含嵌入矩阵索引的 Tensor。 权重(张量):行数等于最大可能索引 + 1 的嵌入矩阵 并且列数等于嵌入大小 padding_idx(int,可选):如果指定,则:attr:`padding_idx`处的条目不参与梯度计算; 因此,在训练过程中,:attr:`padding_idx`处的嵌入向量不会被更新 即保持为固定的“填充”。 the starting index position of each bag (sequence) in :attr:`input`。 如果给定,则将范数大于 :attr:`max_norm` 的每个嵌入向量重新归一化,使其范数为 :attr:`max_norm`。 注意:这将就地修改:attr:`weight`。 norm_type (浮点数,可选): 用于计算 :attr:`max_norm` 选项的 p-norm 的 p 值。默认 ``2``。 scale_grad_by_freq (布尔值,可选): 如果提供,则将梯度按 mini-batch 中单词的频率的倒数进行缩放。默认 ``False``。 the words in the mini-batch. Default ``False``. sparse (布尔值,可选): 如果 ``True``,则相对于 :attr:`weight` 的梯度将是一个稀疏张量。参见下方的注释。 `torch.nn.Embedding` 用于更多关于稀疏梯度的细节。 形状: 输入:任意形状的 LongTensor,包含要提取的索引。 权重:形状为 `(V, embedding_dim)` 的浮点数嵌入矩阵, 其中 V = 最大索引 + 1 且 embedding_dim = 嵌入大小。 输出:`(*, embedding_dim)`,其中 `*` 是输入形状 示例: >>> # 两个样本的 4 个索引批次 >>> input = torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) >>> # 包含 10 个大小为 3 的张量的嵌入矩阵 >>> embedding_matrix = torch.rand(10, 3) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> F.embedding(input, embedding_matrix) tensor([[[ 0.8490, 0.9625, 0.6753], [ 0.9666, 0.7761, 0.6108], [0.6246, 0.9751, 0.3618] [0.4161, 0.2419, 0.7383] [[0.6246, 0.9751, 0.3618]] [0.0237, 0.7794, 0.0528] [ 0.9666, 0.7761, 0.6108], [[0.3385, 0.8612, 0.1867]]] >>> 示例中使用 padding_idx >>> 权重 = torch.rand(10, 3) >>> weights[0, :].zero_() >>> 嵌入矩阵 = 权重 >>> input = torch.tensor([[0, 2, 0, 5]]) >>> F.embedding(input, embedding_matrix, padding_idx=0) tensor([[[ 0.0000, 0.0000, 0.0000], [ 0.5609, 0.5384, 0.8720], [0.0000, 0.0000, 0.0000] [0.6262, 0.2438, 0.7471] "文档" 如果 has_torch_function_variadic(输入, 重量): 返回 handle_torch_function( 嵌入, (输入, 重量), 输入, 重量, 填充索引=填充索引, 最大范数=最大范数, 归一化类型=归一化类型, 按频率缩放梯度=按频率缩放梯度, 稀疏=稀疏, ) 如果 padding_idx : 如果 padding_idx > 0: 断言 padding_idx < 重量.尺寸( 0 ), "Padding_idx 必须在 num_embeddings 范围内" elif padding_idx < 0: 断言 padding_idx >= -重量.尺寸( 0 ), "Padding_idx 必须在 num_embeddings 范围内" padding_idx = 重量.尺寸(0) + padding_idx else: padding_idx = -1 如果 max_norm : # Note [embedding_renorm contiguous] `embedding_renorm_` 将无论如何在输入上调用 .contiguous()。 在这里调用它并利用改进的局部性 以下代码行中包含的 `embedding` 调用也适用。 输入 = 输入.连续() # 注意 [embedding_renorm 设置梯度启用] # XXX: 相当于 # 使用 torch.no_grad(): # torch.embedding_renorm_ # 移除一旦脚本支持 set_grad_enabled _no_grad_embedding_renorm_(重量, 输入, 最大范数, 归一化类型) 返回 torch.嵌入(重量, 输入, 填充索引, 按频率缩放梯度, 稀疏)
[文档]定义 嵌入包( 输入: 张量, 重量: 张量, 偏移量: 可选[张量] = , 最大范数: 可选[float] = , 归一化类型: 浮点数 = 2, 按频率缩放梯度: 布尔 = 错误, 模式: 字符串 = 平均值, 稀疏: 布尔 = 错误, 每样本权重: 可选[张量] = , include_last_offset: 布尔 = 错误, 填充索引: 可选[整数] = , ) 输入文本: -> 翻译: -> 张量: r计算嵌入体的总和、平均值或最大值。 计算过程中不实例化中间嵌入体。 更多详情请参阅 :class:`torch.nn.EmbeddingBag`。 注意: {backward_reproducibility_note} 参数: 输入(长张量):包含嵌入矩阵索引袋的张量 权重(张量):行数等于最大可能索引 + 1 的嵌入矩阵 并且列数等于嵌入大小 offsets (LongTensor,可选):仅当 :attr:`input` 为 1D 时使用。:attr:`offsets` 确定每个包(序列)在 :attr:`input` 中的起始索引位置。 max_norm (浮点数,可选):如果提供,则将范数大于 :attr:`max_norm` 的每个嵌入向量重新归一化,使其范数为 :attr:`max_norm`。 the starting index position of each bag (sequence) in :attr:`input`。 如果给定,则将范数大于 :attr:`max_norm` 的每个嵌入向量重新归一化,使其范数为 :attr:`max_norm`。 注意:这将就地修改:attr:`weight`。 norm_type (浮点数,可选): 用于计算 :attr:`max_norm` 选项的 ``p``-范数中的 ``p``。 默认 ``2``。 scale_grad_by_freq (布尔值,可选): 如果提供,这将通过梯度的频率的倒数来缩放梯度。 the words in the mini-batch. Default ``False``. 注意:当 ``mode="max"`` 时,此选项不受支持。 mode (str, 可选): ``"sum"``, ``"mean"`` 或 ``"max"``。指定减少袋的方式。 默认: ``"mean"`` sparse (bool, 可选): 如果 ``True``,则相对于 :attr:`weight` 的梯度将是一个稀疏张量。参见注意事项。 `torch.nn.Embedding` 用于更多关于稀疏梯度的细节。 注意:当 ``mode="max"`` 时,此选项不受支持。 per_sample_weights(张量,可选):一个浮点/双精度浮点权重张量,或 None 以指示所有权重都应取为 1。如果指定,:attr:`per_sample_weights` 必须与输入具有完全相同的形状,如果:attr:`offsets`不是 None,则被视为具有相同的 attr:`偏移量` include_last_offset (bool, 可选): 如果为 ``True``,偏移量的大小等于包的数量 + 1。 最后一个元素是输入的大小,或者最后一个包(序列)的结束索引位置。 padding_idx (int, 可选): 如果指定,则 :attr:`padding_idx` 位置的条目不贡献梯度;因此,:attr:`padding_idx` 的嵌入向量不会更新。 padding_idx (int, 可选): 如果指定,则 :attr:`padding_idx` 位置的条目不贡献梯度;因此,:attr:`padding_idx` 的嵌入向量不会更新。 在训练过程中,即保持为固定的“填充”。请注意,在:attr:`padding_idx`处的嵌入向量被排除在缩减之外。 - :attr:`input`(长张量)和:attr:`offsets`(长张量,可选) 形状: - 如果:attr:`input`是形状为`(B, N)`的 2D 张量,它将被视为`B`个袋子(序列) - 如果:attr:`input`是形状为`(B, N)`的 2D 张量,它将被视为`B`个袋子(序列) 每个长度为“N”,这将返回以某种方式聚合的“B”个值 根据`:attr:`模式`. 在这种情况下,`:attr:`偏移量`被忽略,必须为`None`。 如果 :attr:`input` 是形状为 `(N)` 的 1D,它将被视为形状为 `(N)` 的连接 多个袋子(序列)。:attr:`offsets` 必须是一个包含 1D 张量的 每个包在 :attr:`input` 中的起始索引位置。因此,对于 :attr:`offsets` 的形状为 `(B)`,:attr:`input` 将被视为有 ``B`` 个包。 空包(即长度为 0 的包)将返回由零填充的向量。 - :attr:`weight`(张量):该模块的可学习权重,形状为 `(num_embeddings, embedding_dim)` - :attr:`per_sample_weights`(张量,可选)。与:attr:`input`具有相同的形状。 - :attr:`output`:形状为`(B, embedding_dim)`的聚合嵌入值。 示例: >>> # 包含 10 个大小为 3 的张量的嵌入模块 >>> embedding_matrix = torch.rand(10, 3) >>> # 两个样本的 4 个索引批次 >>> input = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9]) >>> offsets = torch.tensor([0, 4]) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> F.embedding_bag(input, embedding_matrix, offsets) tensor([[ 0.3397, 0.3552, 0.5545], [[0.5893, 0.4386, 0.5882]]) >>> 示例中使用 padding_idx >>> embedding_matrix = torch.rand(10, 3) >>> input = torch.tensor([2, 2, 2, 2, 4, 3, 2, 9]) >>> offsets = torch.tensor([0, 4]) >>> F.embedding_bag(input, embedding_matrix, offsets, padding_idx=2, mode='sum') tensor([[ 0.0000, 0.0000, 0.0000], [-0.7082, 3.2145, -2.6251]]) "文档" 如果 has_torch_function_variadic(输入, 重量, 偏移量, 每样本权重): 返回 handle_torch_function( 嵌入包, (输入, 重量, 偏移量, 每样本权重), 输入, 重量, 偏移量=偏移量, 最大范数=最大范数, 归一化类型=归一化类型, 按频率缩放梯度=按频率缩放梯度, 模式=模式, 稀疏=稀疏, 每样本权重=每样本权重, include_last_offset=include_last_offset, 填充索引=填充索引, ) 检查向后兼容性。 之前是 embedding_bag(weight, input, ...)。 现在是 embedding_bag(input, weight, ...)。 如果 重量.dtype == torch.长的 输入.is_floating_point(): 警告.警告( nn.functional.embedding_bag 的参数顺序已更改。 "使用 `embedding_bag(weight, input, ...)` 已弃用," "现在应使用 `embedding_bag(input, weight, ...)`。" ) 重量, 输入 = 输入, 权重 如果 每样本权重 输入.尺寸() != 每样本权重.尺寸(): raise ValueError( f嵌入包:如果 per_sample_weights ({每样本权重.形状}) 不为空," f然后它必须与输入具有相同的形状({输入.形状})" ) 如果 重量.() == 2: raise ValueError( f权重必须是一个二维张量,但得到的是维度{重量.()}" ) 如果 torch.算子.是否正在脚本化() 输入.() == 2 输入.是嵌套的: 包含最后一个偏移量 = 真实 偏移量 = 输入.偏移量() 输入 = 输入.().重塑(-1) 如果 每样本权重 : 如果 每样本权重.是嵌套的: raise ValueError( "如果输入是嵌套的,则指定的每样本权重必须是嵌套的" ) 每样本权重 = 每样本权重.().重塑(-1) elif 输入.() == 2: 如果 偏移量 : 类型字符串 = "<未知>" # TODO: 一旦脚本支持 type()调用,请删除此行 如果 torch.算子.是否正在脚本化(): 类型字符串 = 字符串(类型(偏移量)) raise ValueError( 如果输入是二维的,那么偏移量必须为 None ", 作为输入被处理为一个迷你批次" 固定长度序列。然而,发现 f类型偏移量{类型字符串}" ) 偏移量 = torch.arange( 0, 输入.元素数量(), 输入.尺寸(1), 数据类型=输入.数据类型, 设备=输入.设备 ) 输入 = 输入.重塑(-1) 如果 每样本权重 : 每样本权重 = 每样本权重.重塑(-1) elif 输入.() == 1: 如果 偏移量 : raise ValueError(偏移量必须是一个一维张量,但得到了 None) 如果 偏移量.() != 1: raise ValueError("偏移量必须是一个一维张量") else: raise ValueError( f"输入必须是一维或二维张量,但得到了维度为的张量"{输入.()}" ) 如果 模式 == "求和": 模式枚举 = 0 elif 模式 == 平均值: 模式枚举 = 1 elif 模式 == 最大: 模式枚举 = 2 如果 按频率缩放梯度: raise ValueError( "最大模式不支持按频率缩放梯度" ) 如果 稀疏: raise ValueError("最大模式不支持稀疏权重") else: raise ValueError("模式必须是 sum、mean 或 max 之一") 如果 max_norm : # XXX: 相当于 # 使用 torch.no_grad(): # torch.nembedding_renorm_ # 移除一旦脚本支持 set_grad_enabled _no_grad_embedding_renorm_(重量, 输入, 最大范数, 归一化类型) 如果 每样本权重 模式 != "求和": raise 不支持的操作异常( "embedding_bag: per_sample_weights 不为 None。" "仅支持 mode='sum' 模式。" f"(获取 mode='"{模式}'). 请在 GitHub 上提交功能请求。' ) 返回, _, _, _ = torch.嵌入包( 重量, 输入, 偏移量, 按频率缩放梯度, 模式枚举, 稀疏, 每样本权重, include_last_offset, 填充索引, ) 返回 返回
如果 嵌入包.__doc__: 嵌入包.__doc__ = 嵌入包.__doc__.格式(**可复现性说明) 定义 _验证批次大小(尺寸: 列表[整数]) 输入文本: -> 翻译: -> : # XXX:JIT 脚本不支持 functools 中的 reduce 操作,并且 mul 操作是 # 内置的,目前还不能用作函数的值,所以需要重写这个大小 # 检查一个简单的等效循环 # # TODO:当即时编译(JIT)准备好并具备缺失的功能时,像下面这样使用 reduce # 从运算符导入乘法 导入 functools # 如果 reduce(mul, size[2:], size[0]) 等于 1 产品尺寸 = 尺寸[0] for i 范围(长度(尺寸) - 2): 产品尺寸 *= 尺寸[i + 2] 如果 产品尺寸 == 1: raise ValueError( f"训练时每个通道预期超过 1 个值,但得到了输入大小"{尺寸}" )
[文档]def 批标准化( 输入: Tensor, 运行均值: Optional[Tensor], 运行方差: Optional[Tensor], weight: 可选[Tensor] = None, bias: 可选[Tensor] = None, training: 布尔型 = False, momentum: 浮点数 = 0.1, eps: float = 1e-5, ) -> Tensor: 应用批量归一化对数据批次中的每个通道进行处理。 查看 :class:`~torch.nn.BatchNorm1d`, :class:`~torch.nn.BatchNorm2d`, `torch.nn.BatchNorm3d` 的详细信息请参阅。 """ 如果 has_torch_function_variadic(input, running_mean, running_var, weight, bias) 为真: 返回 handle_torch_function( 批标准化 (输入,运行均值,运行方差,权重,偏置) 输入 运行均值 运行变量, weight=weight, bias=bias, training=training, momentum=动量, eps=epsilon, ) 如果训练: _verify_batch_size(input.size()) return torch.batch_norm( input, weight, 偏差, 运行均值, 运行方差, 训练, 动量, eps, torch.backends.cudnn.enabled, )
定义
验证空间大小(尺寸: 列表[整数]) 输入文本: -> 翻译: -> : # 验证实例归一化计算时是否存在大于 1 的空间元素。 产品尺寸 = 1 for i 范围(2, 长度(尺寸)): 产品尺寸 *= 尺寸[i] 如果 产品尺寸 == 1: raise ValueError( f"在训练时预期有超过 1 个空间元素,但得到了输入大小 "{尺寸}" )
[文档]def instance_norm( 输入: Tensor, running_mean: Optional[Tensor] = None, running_var: Optional[Tensor] = None, weight: 可选[Tensor] = None, bias: 可选[Tensor] = None, use_input_stats: 布尔 = True, momentum: 浮点数 = 0.1, eps: float = 1e-5, ) -> Tensor: 独立地对每个数据样本中的每个通道应用实例归一化。 查看 :class:`~torch.nn.InstanceNorm1d`, :class:`~torch.nn.InstanceNorm2d`, `torch.nn.InstanceNorm3d` 的详细信息请参阅。 """ 如果 has_torch_function_variadic(input, running_mean, running_var, weight, bias) 为真: 返回 handle_torch_function( instance_norm, (输入,运行均值,运行方差,权重,偏置), 输入, running_mean=running_mean, running_var=running_var, weight=weight, bias=bias, use_input_stats=use_input_stats, momentum=动量, eps=eps, ) 如果使用输入统计: _验证输入大小(input.size()) return torch.instance_norm( input, weight, 偏差, 运行均值, 运行方差, 使用输入统计信息, 动量, eps, torch.backends.cudnn.enabled, )
[文档]def layer_norm( 输入: Tensor, 标准化形状: list[int], weight: Optional[Tensor] = None, bias: Optional[Tensor] = None, eps: float = 1e-5, ) -> Tensor: r"""应用层归一化于最后若干维度。 查看 :class:`~torch.nn.LayerNorm` 获取详细信息。 """ 如果 has_torch_function_variadic(input, weight, bias) 为真: 返回 handle_torch_function( 层归一化 (输入,权重,偏置) 输入 归一化形状 weight=权重, bias=偏置, eps=epsilon, ) return torch.layer_norm( 输入,归一化形状,权重,偏置,eps,torch.backends.cudnn.enabled )
[文档]def rms_norm( 输入: Tensor, 标准化形状: list[int], weight: Optional[Tensor] = None, eps: 可选的浮点数 = None, ) -> 张量: 应用均方根层归一化。 详细信息请参阅 :class:`~torch.nn.RMSNorm`。 """ 如果具有 torch_function_variadic(input, weight): 返回 handle_torch_function( rms_norm, (input, weight), input, normalized_shape, weight=weight, eps=eps ) 返回 torch.rms_norm(input, normalized_shape, weight, eps)
[文档]def group_norm( 输入: Tensor, num_groups: int, weight: Optional[Tensor] = None, bias: Optional[Tensor] = None, eps: float = 1e-5, ) -> Tensor: r"""应用组归一化于最后若干维度。 查看 :class:`~torch.nn.GroupNorm` 获取详细信息。 """ 如果 has_torch_function_variadic(input, weight, bias) 为真: 返回 handle_torch_function( group_norm, ( input, weight, 偏差, ), 输入, 组数, weight=权重, bias=偏置, eps=epsilon, ) if input.dim() < 2: raise RuntimeError( f"期望输入张量至少有 2 个维度,但实际接收到 {input.dim()}" ) _verify_batch_size( [input.size(0) * input.size(1) // num_groups, num_groups] + list(input.size()[2:]) ) return torch.group_norm( input, num_groups, weight, bias, eps, torch.backends.cudnn.enabled )
[文档]def local_response_norm( 输入: Tensor, 大小: int, alpha: float = 1e-4, beta: 浮点数 = 0.75, k: 浮点数 = 1.0, ) -> 张量: r"""在输入信号上应用局部响应归一化。 输入信号由多个输入平面组成,其中通道占据第二维。 在通道间应用归一化。 详细信息请参阅 :class:`~torch.nn.LocalResponseNorm`。 """ if has_torch_function_unary(input): return handle_torch_function( local_response_norm, (input,), input, size, alpha=alpha, beta=beta, k=k ) dim = input.dim() if dim < 3: raise ValueError( f"期望 3D 或更高维度的输入(实际维度为{dim})" ) if input.numel() == 0: return input div = input.mul(input) if dim == 3: div = div.unsqueeze(1) div = pad(div, (0, 0, size // 2, (size - 1) // 2)) div = avg_pool2d(div, (size, 1), stride=1).squeeze(1) else: sizes = input.size() div = div.view(sizes[0], 1, sizes[1], sizes[2], -1) div = pad(div, (0, 0, 0, 0, size // 2, (size - 1) // 2)) div = avg_pool3d(div, (size, 1, 1), stride=1).squeeze(1) div = div.view(sizes) div = div.mul(alpha).add(k).pow(beta) return input / div
# 损失
[文档]定义 ctc_loss( log_probs: 张量, targets: 张量, input_lengths: 张量, 目标长度: 张量, 空白: 整型 = 0, 缩减: 字符串 = 平均值, 零无穷: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: r应用连接主义时序分类损失。 详细信息请参阅 :class:`~torch.nn.CTCLoss`。 注意: {cudnn_可复现性说明} 注意: {backward_reproducibility_note} 参数: log_probs: (T, N, C) 或 (T, C) 其中 C = 字母表中的字符数(包括空格) `T = 输入长度`,和 `N = 批处理大小`。 输出对数概率 例如,通过:func:`torch.nn.functional.log_softmax`获得。 目标::math:`(N, S)` 或 `(sum(target_lengths))` 目标不能为空。在第二种形式中,假设目标已连接。 input_lengths: :math:`(N)` 或 :math:`()` 输入长度(必须每个都 ≤ T) 目标长度::math:`(N)` 或 :math:`()`. 目标长度 空白(int,可选): 空白标签。默认 :math:`0`. reduction(字符串,可选):指定应用于输出的缩减 ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``: 输出的损失将除以目标长度,然后取批次的平均值, ``'sum'``: 输出将直接相加, 求和。默认值:``'mean'`` zero_infinity (bool, optional): 是否将无穷大的损失及其关联的梯度置零。 默认:``False`` 无穷大的损失主要发生在输入太短时。 与目标对齐。 示例:: >>> log_probs = torch.randn(50, 16, 20).log_softmax(2).detach().requires_grad_() >>> targets = torch.randint(1, 20, (16, 30), dtype=torch.long) >>> input_lengths = torch.full((16,), 50, dtype=torch.long) >>> target_lengths = torch.randint(10, 30, (16,), dtype=torch.long) >>> 损失 = F.ctc_loss(log_probs, targets, input_lengths, target_lengths) >>> loss.backward() "文档" 如果 has_torch_function_variadic(log_probs, targets, input_lengths, 目标长度): 返回 handle_torch_function( ctc_loss, (log_probs, targets, input_lengths, 目标长度), log_probs, targets, input_lengths, 目标长度, 空白=空白, 缩减=缩减, 零无穷=零无穷, ) 返回 torch.ctc_loss( log_probs, targets, input_lengths, 目标长度, 空白, _减少.获取枚举(缩减), 零无穷, )
如果 ctc_loss.__doc__: ctc_loss.__doc__ = ctc_loss.__doc__.格式(**可复现性说明)
[文档]定义 nll_loss( 输入: 张量, 目标: 张量, 重量: 可选[张量] = , 平均大小: 可选[布尔] = , 忽略索引: 整型 = -100, 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, ) 输入文本: -> 翻译: -> 张量: r计算负对数似然损失。 查看 :class:`~torch.nn.NLLLoss` 获取详细信息。 参数: 输入: :math:`(N, C)` 其中 `C = 类别数量` 或 :math:`(N, C, H, W)` 在 2D 损失的情况下,或:数学公式`(N, C, d_1, d_2, ..., d_K)`其中`K ≥ 1` 在 K 维损失的情况下。`input` 应为对数概率。 目标::math:`(N)` 其中每个值是 :math:`0 \leq \text{targets}[i] \leq C-1`, 或者 :math:`(N, d_1, d_2, ..., d_K)` 其中 :math:`K \geq 1`, K 维损失。 权重(Tensor,可选):为每个类别提供的手动缩放权重。如果提供,必须是一个大小为 `C` 的 Tensor。 类。如果提供,必须是大小为 `C` 的张量 size_average(布尔值,可选):已弃用(参见:attr:`reduction`)。默认情况下, 批量中的每个损失元素的平均值。注意,对于某些损失,每个样本可能有多个元素。如果将字段 :attr:`size_average` 设置为 ``False``,则损失将改为对每个小批量求和。当 reduce 为 ``False`` 时忽略。默认:``True`` 一些损失,每个样本有多个元素。如果字段:attr:`size_average` 设置为“False”,损失将分别对每个小批量进行求和。忽略 当 reduce 为``False``。默认:``True`` 忽略索引(int,可选):指定一个要忽略的目标值 并且不贡献于输入梯度。当 :attr:`size_average` 为 ``True`` 时, 损失将在非忽略的目标上进行平均。默认:-100 减少(布尔值,可选):已弃用(见:attr:`reduction`)。默认情况下, 损失在每个小批量上的观测值被平均或求和 在:attr:`size_average`。当:attr:`reduce`为``False``时,返回每个样本的损失 批量元素而不是,并忽略:attr:`size_average`。默认:``True`` reduction(字符串,可选):指定应用于输出的缩减 ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``:输出总和将除以输出元素的数量, ``'sum'``:输出将进行求和。注意::attr:`size_average` 和 :attr:`reduce` 正在弃用,在此期间, 指定这两个参数中的任何一个将覆盖 :attr:`reduction`。默认:``'mean'`` 示例:: >>> # 输入大小为 N x C = 3 x 5 >>> input = torch.randn(3, 5, requires_grad=True) >>> # 目标中的每个元素都必须满足 0 <= value < C >>> target = torch.tensor([1, 0, 4]) >>> output = F.nll_loss(F.log_softmax(input, dim=1), target) >>> output.backward() "文档" 如果 has_torch_function_variadic(输入, 目标, 重量): 返回 handle_torch_function( nll_loss, (输入, 目标, 重量), 输入, 目标, 重量=重量, 平均大小=平均大小, 忽略索引=忽略索引, 减少=减少, 缩减=缩减, ) 如果 size_average 或者 reduce : 减少 = _减少.旧版获取字符串(平均大小, 减少) 返回 torch._C._nn.nll_loss_nd( 输入, 目标, 重量, _减少.获取枚举(缩减), ignore_index )
[文档]定义 泊松 NLL 损失( 输入: 张量, 目标: 张量, 日志输入: 布尔 = , full: 布尔 = 错误, 平均大小: 可选[布尔] = , eps: 浮点数 = 1e-8, 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, ) 输入文本: -> 翻译: -> 张量: r泊松负对数似然损失。 详细信息请参阅 :class:`~torch.nn.PoissonNLLLoss`。 参数: 输入:底层泊松分布的期望。 目标:随机样本 :math:`target \sim \text{Poisson}(input)`。 log_input: 如果为 ``True``,则损失计算为 math:`\exp(\text{input}) - \text{target} * \text{input}`,如果为 ``False``,则损失为 math:`\text{input} - \text{target} * \log(\text{input}+\text{eps})`。默认:``True`` full: 是否计算完整损失,即添加 Stirling 近似项。默认值:``False`` math:`\text{目标} * \log(\text{目标}) - \text{目标} + 0.5 * \log(2 * \pi * \text{目标})` size_average(布尔值,可选):已弃用(参见:attr:`reduction`)。默认情况下, 批量中的每个损失元素的平均值。注意,对于某些损失,每个样本可能有多个元素。如果将字段 :attr:`size_average` 设置为 ``False``,则损失将改为对每个小批量求和。当 reduce 为 ``False`` 时忽略。默认:``True`` 一些损失,每个样本有多个元素。如果字段:attr:`size_average` 设置为“False”,损失将分别对每个小批量进行求和。忽略 当 reduce 为``False``。默认:``True`` eps (float, 可选): 避免评估 :math:`\log(0)` 的小值 `log_input` = ``False``. 默认:1e-8 减少(布尔值,可选):已弃用(见:attr:`reduction`)。默认情况下, 损失在每个小批量上的观测值被平均或求和 在:attr:`size_average`。当:attr:`reduce`为``False``时,返回每个样本的损失 批量元素而不是,并忽略:attr:`size_average`。默认:``True`` reduction(字符串,可选):指定应用于输出的缩减 ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``:输出总和将除以输出元素的数量, ``'sum'``:输出将进行求和。注意::attr:`size_average` 和 :attr:`reduce` 正在弃用,在此期间, 指定这两个参数中的任何一个将覆盖 :attr:`reduction`。默认:``'mean'`` "文档" 如果 has_torch_function_variadic(输入, 目标): 返回 handle_torch_function( 泊松 NLL 损失, (输入, 目标), 输入, 目标, 日志输入=日志输入, full=full, 平均大小=平均大小, eps=eps, 减少=减少, 缩减=缩减, ) 如果 size_average 或者 reduce : 减少 = _减少.旧版获取字符串(平均大小, 减少) 如果 减少 != 减少 != 平均值 减少 != "求和": 返回 = 输入 raise ValueError(减少 + "不是有效的缩减值") 返回 = torch.泊松 NLL 损失( 输入, 目标, 日志输入, full, eps, _减少.获取枚举(缩减) ) 返回 返回
[文档]定义 高斯负对数似然损失( 输入: 张量, 目标: 张量, 变量: 联盟[张量, float] full: 布尔 = 错误, eps: 浮点数 = 1e-6, 缩减: 字符串 = 平均值, ) 输入文本: -> 翻译: -> 张量: r高斯负对数似然损失。 详细信息请参阅 :class:`~torch.nn.GaussianNLLLoss`。 参数: 输入:高斯分布的期望 目标:从高斯分布中抽取样本 var:正方差(s)的张量,每个期望一个(异方差),或一个(同方差) 在输入中(异方差),或一个(同方差) 或为所有期望使用的正标量值。 full (bool, 可选): 是否在损失计算中包含常数项。默认:``False``。 eps (float, 可选): 添加到 var 中的值,以增加稳定性。默认:1e-6。 reduction (str, 可选): 指定应用于输出的缩减方式: ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``:输出为所有批次成员损失的均值, ``'sum'``:输出为所有批次成员损失的总和。 默认:``'mean'``。 "文档" 如果 has_torch_function_variadic(输入, 目标, 变量): 返回 handle_torch_function( 高斯负对数似然损失, (输入, 目标, 变量), 输入, 目标, 变量, full=full, eps=eps, 缩减=缩减, ) # var 的条目必须为非负 如果 isinstance(变量, float): 如果 变量 < 0: raise ValueError("变量包含负数项") 变量 = 变量 * torch.喜欢的(输入) elif torch.任何(变量 < 0): raise ValueError("变量包含负数项") # 检查变量大小 # 如果 var.size 等于 input.size,则情况为异方差性,无需进一步检查。 否则: 如果 变量.尺寸() != 输入.尺寸(): 如果变量比输入少一个维度,但其他维度大小匹配,则这是一个同方差情况。 例如:输入.size = (10, 2, 3),变量.size = (10, 2) -> 将变量扩展,使变量.shape = (10, 2, 1) 这样做是为了在损失计算中实现广播 如果 输入.尺寸()[:-1] == 变量.尺寸(): 变量 = torch.展平(变量, -1) 这检查是否与最终维度匹配,并且 var 的最终维度大小为 1。 这也是一个同方差的情况。 例如,input.size = (10, 2, 3),var.size = (10, 2, 1) elif ( 输入.尺寸()[:-1] == 变量.尺寸()[:-1] 变量.尺寸(-1) == 1 ): 异方差情况 通过 # 如果以上都不符合,则变量 var 的大小不正确。 else: raise ValueError("变量 var 的大小不正确") # 检查缩减模式的有效性 如果 减少 != 减少 != 平均值 减少 != "求和": raise ValueError(减少 + "无效") # 稳定性夹具 变量 = 变量.克隆() torch.不梯度(): 变量.clamp_(最小=eps) 计算损失 损失 = 0.5 * (torch.日志(变量) + (输入 - 目标) ** 2 / 变量) 如果 full: 损失 += 0.5 * 数学.日志(2 * 数学.π) 如果 减少 == 平均值: 返回 损失.均值() elif 减少 == "求和": 返回 损失.总和() else: 返回 损失
[文档]定义 kl_div( 输入: 张量, 目标: 张量, 平均大小: 可选[布尔] = , 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, 日志目标: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: r计算 KL 散度损失。 参考 - `Kullback-Leibler 散度损失` [https://en.wikipedia.org/wiki/Kullback-Leibler_divergence](https://en.wikipedia.org/wiki/Kullback-Leibler_divergence) 详细信息请参阅 :class:`~torch.nn.KLDivLoss`。 参数: 输入:任意形状的对数概率张量。 目标:与输入形状相同的张量。有关目标的解释,请参阅:attr:`log_target`。 目标的解释。 size_average(布尔值,可选):已弃用(参见:attr:`reduction`)。默认情况下, 批量中的每个损失元素的平均值。注意,对于某些损失,每个样本可能有多个元素。如果将字段 :attr:`size_average` 设置为 ``False``,则损失将改为对每个小批量求和。当 reduce 为 ``False`` 时忽略。默认:``True`` 一些损失,每个样本有多个元素。如果字段:attr:`size_average` 设置为“False”,损失将分别对每个小批量进行求和。忽略 当 reduce 为``False``。默认:``True`` 减少(布尔值,可选):已弃用(见:attr:`reduction`)。默认情况下, 损失在每个小批量上的观测值被平均或求和 在:attr:`size_average`。当:attr:`reduce`为``False``时,返回每个样本的损失 批量元素而不是,并忽略:attr:`size_average`。默认:``True`` reduction(字符串,可选):指定应用于输出的缩减 ``'none'`` | ``'batchmean'`` | ``'sum'`` | ``'mean'``。 ``'none'``:不应用降维 ``'batchmean'``:输出之和将被除以批大小 ``'sum'``: 输出将被求和 ``'mean'``: 输出将被除以输出中的元素数量 默认: ``'mean'`` log_target (布尔值): 一个标志,表示是否在对数空间中传递 ``target``。 建议传递某些分布(如 `softmax`) 在对数空间中,以避免由显式 `log` 引起的数值问题。 默认:``False`` .. 注意:: `size_average` 和 `reduce` 正在弃用中, 同时,指定这两个参数中的任何一个都将覆盖 `reduction`。 .. 警告:: `:attr:`reduction` = ``'mean'`` 不返回真正的 KL 散度值,请使用 `:attr:`reduction` = ``'batchmean'`` 这与 KL 数学定义一致。 "文档" 如果 has_torch_function_variadic(输入, 目标): 返回 handle_torch_function( kl_div, (输入, 目标), 输入, 目标, 平均大小=平均大小, 减少=减少, 缩减=缩减, 日志目标=日志目标, ) 如果 size_average 或者 reduce : 减法枚举 = _减少.旧版获取枚举(平均大小, 减少) else: 如果 减少 == 平均值: 警告.警告( "reduction: 'mean' 将总损失除以批大小和支持大小。" "'batchmean' 只除以批大小,并与 KL 除法数学定义一致。" "在下一个主要版本中,'mean' 将改为与 'batchmean' 的行为相同。" ) # 批 mean 的特殊情况 如果 减少 == 批量均值: 减法枚举 = _减少.获取枚举("求和") else: 减法枚举 = _减少.获取枚举(缩减) 减少 = torch.kl_div(输入, 目标, 减少枚举, 日志目标=日志目标) 如果 减少 == 批均值 输入.() != 0: 减少 = 减少 / 输入.尺寸()[0] 返回 减少
[文档]定义 交叉熵( 输入: 张量, 目标: 张量, 重量: 可选[张量] = , 平均大小: 可选[布尔] = , 忽略索引: 整型 = -100, 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, 标签平滑: 浮点数 = 0.0, ) 输入文本: -> 翻译: -> 张量: r计算输入对数几率和目标之间的交叉熵损失。 详细信息请参阅 :class:`~torch.nn.CrossEntropyLoss`。 参数: 输入 (Tensor) : 预测的非规范化对数几率; 查看下方的形状部分以了解支持的形状。 目标(张量):真实类索引或类概率 查看下方的形状部分以了解支持的形状。 权重(Tensor,可选):为每个类别提供的手动缩放权重。如果提供,必须是一个大小为 `C` 的 Tensor。 类。如果提供,必须是大小为 `C` 的张量 size_average(布尔值,可选):已弃用(参见:attr:`reduction`)。默认情况下, 批量中的每个损失元素的平均值。注意,对于某些损失,每个样本可能有多个元素。如果将字段 :attr:`size_average` 设置为 ``False``,则损失将改为对每个小批量求和。当 reduce 为 ``False`` 时忽略。默认:``True`` 一些损失,每个样本有多个元素。如果字段:attr:`size_average` 设置为“False”,损失将分别对每个小批量进行求和。忽略 当 reduce 为``False``。默认:``True`` 忽略索引(int,可选):指定一个要忽略的目标值 并且不贡献于输入梯度。当 :attr:`size_average` 为 ``True`` 时, “True”,损失是针对非忽略目标平均的。注意, attr:`ignore_index` 仅在目标包含类别索引时适用。 默认:-100 减少(布尔值,可选):已弃用(见:attr:`reduction`)。默认情况下, 损失在每个小批量上的观测值被平均或求和 在:attr:`size_average`。当:attr:`reduce`为``False``时,返回每个样本的损失 批量元素而不是,并忽略:attr:`size_average`。默认:``True`` reduction(字符串,可选):指定应用于输出的缩减 ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``:输出总和将除以输出元素的数量, ``'sum'``:输出将进行求和。注意::attr:`size_average` 和 :attr:`reduce` 正在弃用,在此期间, 指定这两个参数中的任何一个将覆盖 :attr:`reduction`。默认:``'mean'`` 标签平滑(浮点数,可选):一个位于[0.0, 1.0]之间的浮点数。指定平滑量 在计算损失时的平滑度,其中 0.0 表示无平滑。目标 原始真实值和如描述的均匀分布混合在一起 《重新思考计算机视觉的 Inception 架构 》。默认值::math:`0.0`。 形状: - 输入:形状 :math:`(C)`,:math:`(N, C)` 或 :math:`(N, C, d_1, d_2, ..., d_K)`,其中 :math:`K \geq 1` 在 `K` 维度损失的情况下。 - 目标:如果包含类别索引,形状为 :math:`()`, :math:`(N)` 或 :math:`(N, d_1, d_2, ..., d_K)`,其中 math:`K \geq 1` 在 K 维损失的情况下,每个值应在 :math:`[0, C)` 范围内。 如果包含类别概率,形状与输入相同,每个值应在 :math:`[0, 1]` 范围内。 其中: .. math:: \begin{aligned} C ={} & \text{类别数量} \\ N ={} & \text{批量大小} \\ \end{aligned} 示例: >>> # 示例:带有类别索引的目标 >>> input = torch.randn(3, 5, requires_grad=True) >>> target = torch.randint(5, (3,), dtype=torch.int64) >>> loss = F.cross_entropy(input, target) >>> loss.backward() ... >>> # 示例:带有概率类的目标 >>> input = torch.randn(3, 5, requires_grad=True) >>> target = torch.randn(3, 5).softmax(dim=1) >>> loss = F.cross_entropy(input, target) >>> loss.backward() "文档" 如果 has_torch_function_variadic(输入, 目标, 重量): 返回 handle_torch_function( 交叉熵, (输入, 目标, 重量), 输入, 目标, 重量=重量, 平均大小=平均大小, 忽略索引=忽略索引, 减少=减少, 缩减=缩减, 标签平滑=标签平滑, ) 如果 size_average 或者 reduce : 减少 = _减少.旧版获取字符串(平均大小, 减少) 返回 torch._C._nn.交叉熵损失( 输入, 目标, 重量, _减少.获取枚举(缩减), 忽略索引, 标签平滑, )
[文档]定义 二元交叉熵( 输入: 张量, 目标: 张量, 重量: 可选[张量] = , 平均大小: 可选[布尔] = , 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, ) 输入文本: -> 翻译: -> 张量: r测量目标概率与输入概率之间的二进制交叉熵。 请参阅:class:`~torch.nn.BCELoss` 以获取详细信息。 参数: 输入:任意形状的张量作为概率。 目标:与输入形状相同的张量,其值介于 0 和 1 之间。 权重(张量,可选):一个手动缩放权重 如果提供,则重复以匹配输入张量形状 size_average(布尔值,可选):已弃用(参见:attr:`reduction`)。默认情况下, 批量中的每个损失元素的平均值。注意,对于某些损失,每个样本可能有多个元素。如果将字段 :attr:`size_average` 设置为 ``False``,则损失将改为对每个小批量求和。当 reduce 为 ``False`` 时忽略。默认:``True`` 一些损失,每个样本有多个元素。如果字段:attr:`size_average` 设置为“False”,损失将分别对每个小批量进行求和。忽略 当 reduce 为``False``。默认:``True`` 减少(布尔值,可选):已弃用(见:attr:`reduction`)。默认情况下, 损失在每个小批量上的观测值被平均或求和 在:attr:`size_average`。当:attr:`reduce`为``False``时,返回每个样本的损失 批量元素而不是,并忽略:attr:`size_average`。默认:``True`` reduction(字符串,可选):指定应用于输出的缩减 ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``:输出总和将除以输出元素的数量, ``'sum'``:输出将进行求和。注意::attr:`size_average` 和 :attr:`reduce` 正在弃用,在此期间, 指定这两个参数中的任何一个将覆盖 :attr:`reduction`。默认:``'mean'`` 示例: >>> input = torch.randn(3, 2, requires_grad=True) >>> target = torch.rand(3, 2, requires_grad=False) >>> loss = F.binary_cross_entropy(torch.sigmoid(input), target) >>> loss.backward() "文档" 如果 has_torch_function_variadic(输入, 目标, 重量): 返回 handle_torch_function( 二元交叉熵, (输入, 目标, 重量), 输入, 目标, 重量=重量, 平均大小=平均大小, 减少=减少, 缩减=缩减, ) 如果 size_average 或者 reduce : 减法枚举 = _减少.旧版获取枚举(平均大小, 减少) else: 减法枚举 = _减少.获取枚举(缩减) 如果 目标.尺寸() != 输入.尺寸(): raise ValueError( f使用一个与输入大小不同的目标大小({目标.尺寸()}{输入.尺寸()})是 deprecated。 "请确保它们具有相同的大小。" ) 如果 权重 : 新尺寸 = _推断大小(目标.尺寸(), 重量.尺寸()) 权重 = 重量.展开(新尺寸) 返回 torch._C._nn.二元交叉熵(输入, 目标, 重量, 减少枚举)
[文档]定义 二元交叉熵(对数)( 输入: 张量, 目标: 张量, 重量: 可选[张量] = , 平均大小: 可选[布尔] = , 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, 正向权重: 可选[张量] = , ) 输入文本: -> 翻译: -> 张量: r计算目标与输入 logits 之间的二元交叉熵。 详细信息请参阅 :class:`~torch.nn.BCEWithLogitsLoss`。 参数: 输入:任意形状的张量,作为未归一化的分数(通常称为 logits)。 目标:与输入形状相同的张量,其值介于 0 和 1 之间。 权重(张量,可选):一个手动缩放权重 如果提供,则重复以匹配输入张量形状 size_average(布尔值,可选):已弃用(参见:attr:`reduction`)。默认情况下, 批量中的每个损失元素的平均值。注意,对于某些损失,每个样本可能有多个元素。如果将字段 :attr:`size_average` 设置为 ``False``,则损失将改为对每个小批量求和。当 reduce 为 ``False`` 时忽略。默认:``True`` 一些损失,每个样本有多个元素。如果字段:attr:`size_average` 设置为“False”,损失将分别对每个小批量进行求和。忽略 当 reduce 为``False``。默认:``True`` 减少(布尔值,可选):已弃用(见:attr:`reduction`)。默认情况下, 损失在每个小批量上的观测值被平均或求和 在:attr:`size_average`。当:attr:`reduce`为``False``时,返回每个样本的损失 批量元素而不是,并忽略:attr:`size_average`。默认:``True`` reduction(字符串,可选):指定应用于输出的缩减 ``'none'``:不应用缩减,``'mean'``:应用平均值缩减,``'sum'``:应用总和缩减 ``'mean'``:输出总和将除以输出元素的数量, ``'sum'``:输出将进行求和。注意::attr:`size_average` 和 :attr:`reduce` 正在弃用,在此期间, 指定这两个参数中的任何一个将覆盖 :attr:`reduction`。默认:``'mean'`` pos_weight (Tensor,可选): 正例的权重,将广播与目标一起使用。 必须是一个与类别维度的类别数量相等的张量。 请密切关注 PyTorch 的广播语义,以实现所需的效果。 操作。对于大小为[B, C, H, W]的目标(其中 B 是批量大小),将根据大小[B, C, H, W]应用不同的 pos_weight 到批量的每个元素或 [C, H, W]在整个批次中应用相同的 pos_weight。对于 2D 多类目标[C, H, W],要沿所有空间维度应用相同的正权重,请使用:[C, 1, 1]。 沿所有空间维度应用相同的正权重。对于 2D 多类目标[C, H, W],要沿所有空间维度应用相同的正权重,请使用:[C, 1, 1]。 [C, 1, 1]。对于 2D 多类目标[C, H, W],要沿所有空间维度应用相同的正权重,请使用:[C, 1, 1]。 默认:`None` 示例: >>> input = torch.randn(3, requires_grad=True) >>> target = torch.empty(3).random_(2) >>> loss = F.binary_cross_entropy_with_logits(input, target) >>> loss.backward() "文档" 如果 has_torch_function_variadic(输入, 目标, 重量, 正向权重): 返回 handle_torch_function( 二元交叉熵(对数), (输入, 目标, 重量, 正向权重), 输入, 目标, 重量=重量, 平均大小=平均大小, 减少=减少, 缩减=缩减, 正向权重=正向权重, ) 如果 size_average 或者 reduce : 减法枚举 = _减少.旧版获取枚举(平均大小, 减少) else: 减法枚举 = _减少.获取枚举(缩减) 如果 (目标.尺寸() == 输入.尺寸()): raise ValueError( f"目标大小("{目标.尺寸()})必须与输入大小("{输入.尺寸()})" ) 返回 torch.二元交叉熵(对数)( 输入, 目标, 重量, 正向权重, 减法枚举 )
[文档]def smooth_l1_loss( 输入: Tensor, 目标: Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = "mean", beta: float = 1.0, ) -> Tensor: 计算平滑 L1 损失。 函数在元素级误差低于 beta 时使用平方项,否则使用 L1 项。 详细信息请参阅 :class:`~torch.nn.SmoothL1Loss`。 有关详细信息,请参阅 :class:`~torch.nn.SmoothL1Loss`。 """ 如果具有 torch_function_variadic(input, target): 返回 handle_torch_function( smooth_l1_loss, 输入,目标 输入 目标 size_average=size_average reduce=reduce, reduction=reduction, beta=beta, ) 如果目标大小(target.size())不等于输入大小(input.size()) 警告: f"使用目标大小 ({target.size()}) 与输入大小 ({input.size()}) 不一致。 " 这可能会由于广播导致结果不正确。 请确保它们具有相同的大小。 stacklevel=2, ) 如果 size_average 不为 None 或 reduce 不为 None: reduction = _Reduction.legacy_get_string(size_average, reduce) expanded_input, expanded_target = torch.broadcast_tensors(input, target) if beta == 0.0: return torch._C._nn.l1_loss( expanded_input, expanded_target, _Reduction.get_enum(reduction) ) else: return torch._C._nn.smooth_l1_loss( expanded_input, expanded_target, _Reduction.get_enum(reduction), beta )
[文档]定义 胡伯损失( 输入: 张量, 目标: 张量, 缩减: 字符串 = 平均值, Δ: 浮点数 = 1.0, 重量: 可选[张量] = , ) 输入文本: -> 翻译: -> 张量: rhuber_loss(input, target, reduction='mean', delta=1.0, weight=None) -> Tensor 计算 Huber 损失,可选加权。 函数在元素级误差低于 delta 时使用平方项,否则使用 delta 缩放的 L1 项。 函数使用平方项如果元素级误差低于 delta,否则使用 delta 缩放的 L1 项。 当 delta 等于 1 时,此损失函数等同于 SmoothL1Loss。 通常情况下,Huber 损失与 SmoothL1Loss 的差别是一个 delta(也称为 Smooth L1 中的 beta)的系数。 参数: input (Tensor): 预测值。 target (Tensor): 真实值。 reduction(字符串,可选):指定应用于输出的缩减 'none' | 'mean' | 'sum'。'mean':取输出平均值。 '求和:输出将被求和。无:不应用任何缩减。' 默认:'平均'。 delta (浮点数,可选): 在 delta-scaled L1 和 L2 损失之间切换的阈值。默认:1.0。 权重(张量,可选):每个样本的权重。默认:None。 返回: 张量:Huber 损失(可选加权)。 "文档" 如果 has_torch_function_variadic(输入, 目标, 重量): 返回 handle_torch_function( 胡伯损失, (输入, 目标, 重量), 输入, 目标, 缩减=缩减, Δ=Δ, 重量=重量, ) 如果 (目标.尺寸() == 输入.尺寸()): 警告.警告( f使用一个与输入大小不同的目标大小({目标.尺寸()}{输入.尺寸()})。" "这可能会因为广播而导致结果不正确。" "请确保它们具有相同的大小。", 栈级别=2, ) 扩展输入, 扩展目标 = torch.广播张量(输入, 目标) 如果 权重 : 使用优化的 C++后端进行标准 Huber 损失 返回 torch._C._nn.胡伯损失( 扩展输入, 扩展目标, _减少.获取枚举(缩减), delta ) else: 如果 重量.尺寸() != 输入.尺寸(): raise ValueError(权重和输入必须具有相同的大小。) 首先计算未加权的损失 未加权损失 = torch._C._nn.胡伯损失( 扩展输入, 扩展目标, _减少.获取枚举(), delta ) # 将权重应用于未加权的损失 加权损失 = 未加权损失 * 权重 如果 减少 == : 返回 加权损失 elif 减少 == "求和": 返回 torch.总和(加权损失) elif 减少 == 平均值: 返回 加权损失.均值() else: raise ValueError( f"无效的减少模式:"{缩减}. 预期的是 'none'、'mean' 或 'sum' 之一。 )
[文档]定义 l1_loss:L1 损失( 输入: 张量, 目标: 张量, 平均大小: 可选[布尔] = , 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, 重量: 可选[张量] = , ) 输入文本: -> 翻译: -> 张量: # noqa: D400,D402 rl1_loss(input, target, size_average=None, reduce=None, reduction='mean') -> Tensor 函数用于计算元素间平均的绝对值差。 详细信息请参阅 :class:`~torch.nn.L1Loss`。 "文档" 如果 has_torch_function_variadic(输入, 目标): 返回 handle_torch_function( l1_loss:L1 损失, (输入, 目标, 重量), 输入, 目标, 平均大小=平均大小, 减少=减少, 缩减=缩减, ) 如果 (目标.尺寸() == 输入.尺寸()): 警告.警告( f使用一个与输入大小不同的目标大小({目标.尺寸()}{输入.尺寸()})。" "这可能会因为广播而导致结果不正确。" "请确保它们具有相同的大小。", 栈级别=2, ) 如果 size_average 或者 reduce : 减少 = _减少.旧版获取字符串(平均大小, 减少) 扩展输入, 扩展目标 = torch.广播张量(输入, 目标) 如果 权重 : 如果 重量.尺寸() != 输入.尺寸(): raise ValueError(权重和输入必须具有相同的大小。) 绝对误差 = torch.绝对值(扩展输入 - 扩展目标) 加权绝对误差 = 绝对误差 * 权重 如果 减少 == : 返回 加权绝对误差 elif 减少 == "求和": 返回 torch.总和(加权绝对误差) elif 减少 == 平均值: 返回 torch.总和(加权绝对误差) / torch.总和(重量) else: raise ValueError( f"无效的减少模式:"{缩减}. 预期的是 'none'、'mean' 或 'sum' 之一。 ) else: 返回 torch._C._nn.l1_loss:L1 损失( 扩展输入, 扩展目标, _减少.获取枚举(缩减) )
[文档]定义 mse_loss( 输入: 张量, 目标: 张量, 平均大小: 可选[布尔] = , 减少: 可选[布尔] = , 缩减: 字符串 = 平均值, 重量: 可选[张量] = , ) 输入文本: -> 翻译: -> 张量: rmse_loss(input, target, size_average=None, reduce=None, reduction='mean', weight=None) -> Tensor 测量元素级的均方误差,可选加权。 参数: input (Tensor): 预测值。 target (Tensor): 真实值。 size_average (bool, 可选): 已废弃(使用 reduction)。 reduce (bool, 可选): 已废弃(使用 reduction)。 reduction(字符串,可选):指定应用于输出的缩减 'none' | 'mean' | 'sum'。'mean':取输出平均值。 '求和:输出将被求和。无:不应用任何缩减。' 默认:'平均'。 权重(张量,可选):每个样本的权重。默认:None。 返回: 张量:均方误差损失(可选加权)。' "文档" 如果 has_torch_function_variadic(输入, 目标, 重量): 返回 handle_torch_function( mse_loss, (输入, 目标, 重量), 输入, 目标, 平均大小=平均大小, 减少=减少, 缩减=缩减, 重量=重量, ) 如果 (目标.尺寸() == 输入.尺寸()): 警告.警告( f使用一个与输入大小不同的目标大小({目标.尺寸()}{输入.尺寸()})。" "这可能会因为广播而导致结果不正确。" "请确保它们具有相同的大小。", 栈级别=2, ) 如果 size_average 或者 reduce : 减少 = _减少.旧版获取字符串(平均大小, 减少) 扩展输入, 扩展目标 = torch.广播张量(输入, 目标) 如果 权重 : 如果 重量.尺寸() != 输入.尺寸(): raise ValueError(权重和输入必须具有相同的大小。) 手动执行加权均方误差损失 平方误差 = torch.pow(扩展输入 - 扩展目标, 2) 加权平方误差 = 平方误差 * 权重 如果 减少 == : 返回 加权平方误差 elif 减少 == "求和": 返回 torch.总和(加权平方误差) elif 减少 == 平均值: 返回 torch.总和(加权平方误差) / torch.总和(重量) else: raise ValueError( f"无效的减少模式:"{缩减}. 预期的是 'none'、'mean' 或 'sum' 之一。 ) else: 返回 torch._C._nn.mse_loss( 扩展输入, 扩展目标, _减少.获取枚举(缩减) )
[文档]def margin_ranking_loss( 输入 1: Tensor, 输入 2: Tensor, 目标: Tensor, margin: 浮点数 = 0, size_average: 可选[布尔] = None, reduce: 可选[布尔] = None, reduction: 字符串 = "mean", ) -> 张量: # noqa: D400,D402 r"""边缘排序损失(input1, input2, 目标, margin=0, size_average=None, reduce=None, reduction='mean') -> 张量 详细信息请参阅 :class:`~torch.nn.MarginRankingLoss` """ if has_torch_function_variadic(input1, input2, target): return handle_torch_function( margin_ranking_loss, (input1, input2, target), 输入 1, 输入 2, 目标, 边距=边距, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为 None 或 reduce 不为 None: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) else: reduction_enum = _Reduction.get_enum(reduction) 如果 input1 的维度不等于 input2 的维度,或者 input1 的维度不等于 target 的维度: raise RuntimeError( f"margin_ranking_loss : 所有输入张量应具有相同的维度,但得到了以下大小:" f"input1: {input1.size()}, input2: {input2.size()}, target: {target.size()} " ) 返回 torch.margin_ranking_loss(input1, input2, target, margin, reduction_enum)
[文档]def hinge_embedding_loss( 输入: Tensor, 目标: Tensor, 边距: float = 1.0, size_average: 可选[bool] = None, reduce: 可选[bool] = None, reduction: str = "mean", ) -> Tensor: # noqa: D400,D402 r"""hinge_embedding_loss(input, target, margin=1.0, size_average=None, reduce=None, reduction='mean') -> Tensor 查看详细信息请参阅 :class:`~torch.nn.HingeEmbeddingLoss`。 """ if has_torch_function_variadic(input, target): return handle_torch_function( hinge_embedding_loss, (input, target), input, target, margin=margin, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为空或 reduce 不为空: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) else: reduction_enum = _Reduction.get_enum(reduction) return torch.hinge_embedding_loss(input, target, margin, reduction_enum)
[文档]def multilabel_margin_loss( 输入: Tensor, 目标: Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = "mean", ) -> Tensor: # noqa: D400,D402 r"""多标签边缘损失(input, target, size_average=None, reduce=None, reduction='mean') -> Tensor 查看详细信息请参阅::class:`~torch.nn.MultiLabelMarginLoss` """ 如果 has_torch_function_variadic(input, target) 为真: 返回 handle_torch_function( 多标签边缘损失, (输入,目标), 输入, 目标, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为 None 或 reduce 不为 None: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) else: reduction_enum = _Reduction.get_enum(reduction) return torch._C._nn.multilabel_margin_loss(input, target, reduction_enum)
[文档]def soft_margin_loss( 输入: Tensor, 目标: Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = "mean", ) -> Tensor: # noqa: D400,D402 r""" soft_margin_loss(input, target, size_average=None, reduce=None, reduction='mean') -> Tensor 详细信息请参阅 :class:`~torch.nn.SoftMarginLoss`。 """ if has_torch_function_variadic(input, target): return handle_torch_function( soft_margin_loss, (input, target), input, target, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为 None 或者 reduce 不为 None: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) 否则: reduction_enum = _Reduction.get_enum(reduction) return torch._C._nn.soft_margin_loss(input, target, reduction_enum)
[文档]def multilabel_soft_margin_loss( 输入: Tensor, 目标: Tensor, 权重: Optional[Tensor] = None, size_average: 可选[bool] = None, reduce: 可选[bool] = None, reduction: str = "mean", ) -> Tensor: # noqa: D400,D402 r"""多标签软边界损失(input, target, weight=None, size_average=None, reduce=None, reduction='mean') -> Tensor""" 查看文档 :class:`~torch.nn.MultiLabelSoftMarginLoss` 获取详细信息。 """ if has_torch_function_variadic(input, target, weight): return handle_torch_function( multilabel_soft_margin_loss, (input, target, weight), input, target, weight=weight, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为空或 reduce 不为空: reduction = _Reduction.legacy_get_string(size_average, reduce) loss = -(target * logsigmoid(input) + (1 - target) * logsigmoid(-input)) if weight is not None: loss = loss * weight class_dim = input.dim() - 1 C = 输入的大小(class_dim) loss = loss.sum(dim=class_dim) / C # 仅返回 N 个 loss 值 if reduction == "none": ret = loss elif reduction == "mean": ret = loss.mean() elif reduction == "sum": ret = loss.sum() else: ret = input raise ValueError(减少 + " 无效") return ret
[文档]def 余弦嵌入损失( 输入 1: 张量, 输入 2: 张量, 目标: 张量, margin: 浮点数 = 0, size_average: 可选[布尔] = None, reduce: 可选[布尔] = None, reduction: 字符串 = "mean", ) -> 张量: # noqa: D400,D402 r"""余弦嵌入损失(input1, input2, 目标, margin=0, size_average=None, reduce=None, reduction='mean') -> 张量 详细信息请参阅 :class:`~torch.nn.CosineEmbeddingLoss`。 """ if has_torch_function_variadic(input1, input2, target): return handle_torch_function( 余弦嵌入损失, (input1, input2, target), 输入 1, 输入 2, 目标, 边距=边距, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为 None 或 reduce 不为 None: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) else: reduction_enum = _Reduction.get_enum(reduction) 返回 torch.cosine_embedding_loss(input1, input2, target, margin, reduction_enum)
[文档]def 多边损失( 输入: Tensor, 目标: Tensor, p: int = 1, margin: 浮点数 = 1.0, weight: 可选[Tensor] = None, size_average: 可选[布尔] = None, reduce: 可选[布尔] = None, reduction: str = "mean", ) -> Tensor: # noqa: D400,D402 r"""多边损失(input, target, p=1, margin=1, weight=None, size_average=None, reduce=None, reduction='mean') -> Tensor 查看详情请见 :class:`~torch.nn.MultiMarginLoss`。 """ 如果具有 torch_function_variadic(input, target, weight): 返回 handle_torch_function( multi_margin_loss, (输入,目标,权重) 输入 目标 p=p margin=margin, weight=weight, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为空或 reduce 不为空: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) else: reduction_enum = _Reduction.get_enum(reduction) if p != 1 and p != 2: raise ValueError("only p == 1 and p == 2 supported") 如果 weight 不为 None: 如果 weight.dim()不等于 1: 抛出 ValueError 异常("weight 必须是一维的") return torch._C._nn.multi_margin_loss( 输入,目标,p,边距,权重,减少枚举 )
像素混淆
= _添加文档字符串( torch.pixel_shuffle, r"" 像素混淆(input, upscale_factor) -> 张量 重新排列形状为 :math:`(*, C \times r^2, H, W)` 的张量中的元素 张量形状为 :math:`(*, C, H \times r, W \times r)`,其中 r 是 :attr:`upscale_factor`。 查看 :class:`~torch.nn.PixelShuffle` 以获取详细信息。 参数: 输入(张量):输入张量 upscale_factor (int): 用于增加空间分辨率的因子 示例:: >>> input = torch.randn(1, 9, 4, 4) >>> output = torch.nn.functional.pixel_shuffle(input, 3) >>> 打印(output.size()) torch.Size([1, 1, 12, 12]) """, ) pixel_unshuffle = _添加文档字符串( torch.像素重排, r"" pixel_unshuffle(input, downscale_factor) -> Tensor 通过重新排列元素来反转 :class:`~torch.nn.PixelShuffle` 操作 将形状为 :math:`(*, C, H \times r, W \times r)` 的张量转换为形状为 math:`(*, C \times r^2, H, W)` 的张量,其中 r 是 :attr:`downscale_factor` 请参阅:class:`~torch.nn.PixelUnshuffle` 以获取详细信息。 参数: 输入(张量):输入张量 downscale_factor(整数):通过该因子增加空间分辨率 示例:: >>> input = torch.randn(1, 1, 12, 12) >>> output = torch.nn.functional.pixel_unshuffle(input, 3) >>> 打印(output.size()) torch.Size([1, 9, 4, 4]) """, ) channel_shuffle = _添加文档字符串( torch.频道洗牌, r"" channel_shuffle(input, groups) -> 索引张量 将形状为 :math:`(*, C , H, W)` 的张量中的通道进行划分 将文本分组为 g 组,并重新排列为:(*, C(g), g, H, W) 保持原始张量形状。 请参阅:class:`~torch.nn.ChannelShuffle` 以获取详细信息。 参数: 输入(张量):输入张量 groups(整数):将通道划分成多少组以及重新排列的数目。 示例:: >>> input = torch.randn(1, 4, 2, 2) >>> print(input) [[[[1, 2], [3, 4] [[5, 6]] [7, 8] [[9, 10]] [11, 12] [[13, 14]] [15, 16] ]] >>> output = torch.nn.functional.channel_shuffle(input, 2) >>> print(output) [[[[1, 2], [3, 4] [[9, 10]] [11, 12] [[5, 6]] [7, 8] [[13, 14]] [15, 16] ]] """, ) 原生通道随机 = _添加文档字符串( torch.本地频道随机打乱, r"" native_channel_shuffle(input, groups) -> 张量 `channel_shuffle`的原生内核级实现。 此函数可能在未来的版本中变为私有,请谨慎使用。 将形状为 :math:`(*, C , H, W)` 的张量中的通道进行划分 将文本分组为 g 组,并重新排列为:(*, C(g), g, H, W) 保持原始张量形状。 请参阅:class:`~torch.nn.ChannelShuffle` 以获取详细信息。 参数: 输入(张量):输入张量 groups(整数):将通道划分成多少组以及重新排列的数目。 示例:: >>> input = torch.randn(1, 4, 2, 2) >>> print(input) [[[[1, 2], [3, 4] [[5, 6]] [7, 8] [[9, 10]] [11, 12] [[13, 14]] [15, 16] ]] >>> output = torch.nn.functional.native_channel_shuffle(input, 2) >>> print(output) [[[[1, 2], [3, 4] [[9, 10]] [11, 12] [[5, 6]] [7, 8] [[13, 14]] [15, 16] ]] """, ) @_overload 定义 上采样( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[float] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , ) 输入文本: -> 翻译: -> 张量: # 无需注意:B950 通过 @_overload 定义 上采样( # noqa: F811 输入: 张量, 尺寸: 可选[列表[整数]] = , 缩放因子: 可选[float] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , ) 输入文本: -> 翻译: -> 张量: # 无需注意:B950 通过
[文档]定义 上采样( # noqa: F811 输入, 尺寸=, 缩放因子=, 模式=最近邻, align_corners=, ): r上采样输入。 提供的张量被上采样到给定的 :attr:`size` 或给定的 使用哪种插值算法由 :attr:`mode` 决定。 .. 警告:: 此函数已被弃用,推荐使用 :func:`torch.nn.functional.interpolate`。 这与 ``nn.functional.interpolate(...)`` 等效。 注意: {backward_reproducibility_note} 上采样所使用的算法由 :attr:`mode` 决定。 目前支持时间、空间和体积上采样,即 预期输入形状为 3-D、4-D 或 5-D。 输入维度以以下形式解释: `批大小 x 通道 x [可选深度] x [可选高度] x 宽度`。 可用的上采样模式有:`最近邻`、`线性`(仅 3D)、 `双线性`、`双三次`(仅 4D)、`三线性`(仅 5D) 参数: 输入(张量):输入张量 大小(int 或 Tuple[int]或 Tuple[int, int]或 Tuple[int, int, int]): 输出空间大小。 scale_factor (浮点数或浮点数元组): 空间大小的乘数。如果是一个元组,必须与输入大小匹配。 mode (字符串): 用于上采样的算法: ``'nearest'`` | ``'linear'`` | ``'bilinear'`` | ``'bicubic'`` | ``'trilinear'``。默认值:``'nearest'`` align_corners (bool, 可选): 几何上,我们将输入和输出的像素视为正方形而不是点。 input and output as squares rather than points. 如果设置为 ``True``,输入和输出张量将根据其角落像素的中心点对齐,保留角落像素的值。 如果设置为 ``True``,输入和输出张量将根据其角落像素的中心点对齐,保留角落像素的值。 如果设置为 ``False``,输入和输出张量将根据其角像素的角点对齐,并且插值使用边缘值填充。 如果设置为 ``False``,输入和输出张量将根据其角像素的角点对齐,并且插值使用边缘值填充。 对于超出边界值,使此操作与输入大小无关 当保持 :attr:`scale_factor` 不变时。这仅在 :attr:`mode` 是 ``'线性'``、``'双线性'``、``'双三次'`` 或 ``'三线性'``。 默认:``False`` .. 注意:: 使用 ``mode='双三次'`` 可能会导致溢出,换句话说,它可能会产生 负值或大于 255 的值,对于图像。 如果您想减少溢出,请显式调用 ``result.clamp(min=0, max=255)``。 .. 警告:: 使用 `align_corners = True` 时,线性插值模式(`linear`、`bilinear` 和 `trilinear`)不会按比例对齐输出和输入像素,因此输出值可能取决于输入大小。这些模式在此版本之前默认就是这样。 这意味着输出和输入像素的比例关系不匹配,因此输出值可能取决于输入大小。 这意味着输出和输入像素的比例关系不匹配,因此输出值可能取决于输入大小。 这意味着输出和输入像素的比例关系不匹配,因此输出值可能取决于输入大小。 0.3.1. 从那时起,默认行为是 `align_corners = False`。 请参阅 :class:`~torch.nn.Upsample` 以获取具体示例。 这会影响输出。 "文档" 警告.警告( "`nn.functional.upsample` 已弃用。" "请使用 `nn.functional.interpolate` 代替。", 栈级别=2, ) 返回 interpolate(输入, 尺寸, 缩放因子, 模式, align_corners)
如果 上采样.__doc__: 上采样.__doc__ = 上采样.__doc__.格式(**可复现性说明) 定义 _是整数(x) 输入文本: -> 翻译: -> 布尔: r检查输入数字是否为整数。 对于 int、SymInt、Numpy 整数和具有整数元素的 Tensors,将返回 True。 "文档" 如果 isinstance(x, (整数, torch.SymInt)): 返回 真实 如果 np isinstance(x, numpy.整数): 返回 真实 返回 isinstance(x, 张量) x.is_floating_point() @_overload 定义 interpolate( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[列表[float]] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , 重新计算缩放因子: 可选[布尔] = , 抗锯齿: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: # 无需注意:B950 通过 @_overload 定义 interpolate( # noqa: F811 输入: 张量, 尺寸: 可选[列表[整数]] = , 缩放因子: 可选[列表[float]] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , 重新计算缩放因子: 可选[布尔] = , 抗锯齿: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: # 无需注意:B950 通过 @_overload 定义 interpolate( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[float] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , 重新计算缩放因子: 可选[布尔] = , 抗锯齿: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: # 无需注意:B950 通过 @_overload 定义 interpolate( # noqa: F811 输入: 张量, 尺寸: 可选[列表[整数]] = , 缩放因子: 可选[float] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , 重新计算缩放因子: 可选[布尔] = , 抗锯齿: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: 通过
[文档]定义 interpolate( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[列表[float]] = , 模式: 字符串 = 最近邻, align_corners: 可选[布尔] = , 重新计算缩放因子: 可选[布尔] = , 抗锯齿: 布尔 = 错误, ) 输入文本: -> 翻译: -> 张量: # 无需注意:B950 r对输入进行下/上采样。 张量插值到给定的 :attr:`size` 或给定的 :attr:`scale_factor`。 使用哪种插值算法由 :attr:`mode` 决定。 算法用于插值的算法由 :attr:`mode` 决定。 目前支持时间、空间和体积采样,即 预期输入形状为 3-D、4-D 或 5-D。 输入维度以以下形式解释: `批大小 x 通道 x [可选深度] x [可选高度] x 宽度`。 可用的缩放模式有:`最近邻`、`线性`(仅 3D)、 `双线性`、`双三次`(仅 4D)、`三线性`(仅 5D)、`区域`、`最近邻精确` 参数: 输入(张量):输入张量 大小(int 或 Tuple[int]或 Tuple[int, int]或 Tuple[int, int, int]): 输出空间大小。 scale_factor (浮点数或浮点数元组): 空间大小的乘数。如果 `scale_factor` 是元组,其长度必须与空间维度数匹配;`input.dim() - 2`。 其长度必须与空间维度数匹配;`input.dim() - 2`。 mode (字符串): 用于上采样的算法: ``'nearest'`` | ``'linear'`` | ``'bilinear'`` | ``'bicubic'`` | ``'trilinear'`` | ``'area'`` | ``'nearest-exact'``. 默认: ``'nearest'`` align_corners (bool, 可选): 几何上,我们将输入和输出的像素视为正方形而不是点。 input and output as squares rather than points. 如果设置为 ``True``,输入和输出张量将根据其角落像素的中心点对齐,保留角落像素的值。 如果设置为 ``True``,输入和输出张量将根据其角落像素的中心点对齐,保留角落像素的值。 如果设置为 ``False``,输入和输出张量将根据其角像素的角点对齐,并且插值使用边缘值填充。 如果设置为 ``False``,输入和输出张量将根据其角像素的角点对齐,并且插值使用边缘值填充。 对于超出边界值,使此操作与输入大小无关 当保持 :attr:`scale_factor` 不变时。这仅在 :attr:`mode` 是 ``'线性'``、``'双线性'``、``'双三次'`` 或 ``'三线性'``。 默认:``False`` recompute_scale_factor (布尔值,可选):重新计算 scale_factor 以用于 插值计算。如果 `recompute_scale_factor` 为 `True`,则 `scale_factor` 必须传入,并使用 `scale_factor` 来计算 输出 `size`。计算得到的输出 `size` 将用于推断插值的新尺度 注意,当 `scale_factor` 为浮点数时,它可能不同 由于四舍五入和精度问题,重新计算的 `scale_factor`。 如果 `recompute_scale_factor` 为 ``False``,则直接使用 `size` 或 `scale_factor` 进行插值。默认:``None``。 抗锯齿(bool,可选):应用抗锯齿的标志。默认:``False``。使用抗锯齿 (bool, 可选): 应用抗锯齿的标志。默认:``False``。使用抗锯齿 与 `align_corners=False` 选项一起,插值结果将与 Pillow 相匹配 下采样操作的输出结果。支持的模式:`'bilinear'`、`'bicubic'` .. 注意:: 使用 ``mode='双三次'`` 可能会导致溢出,换句话说,它可能会产生 负值或大于 255 的值,对于图像。 如果您想减少溢出,请显式调用 ``result.clamp(min=0, max=255)``。 .. 注意:: 模式 `mode='nearest-exact'` 与 Scikit-Image 和 PIL 的最近邻插值算法相匹配 并修复了 `mode='nearest'` 的已知问题。此模式被引入以保持 向后兼容。 模式 `mode='nearest'` 与有缺陷的 OpenCV 的 `INTER_NEAREST` 插值算法匹配。 .. 注意:: 在 CUDA 上,对于 `float16` 数据类型的梯度在上采样操作中可能不准确。 当使用模式 `['linear', 'bilinear', 'bicubic', 'trilinear', 'area']` 时。 更多详情,请参阅讨论内容 issue#104157 _. 注意: {backward_reproducibility_note} "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( interpolate, (输入,), 输入, 尺寸=尺寸, 缩放因子=缩放因子, 模式=模式, align_corners=align_corners, 重新计算缩放因子=重新计算缩放因子, 抗锯齿=抗锯齿, ) 如果 模式 (最近邻, 面积, "最近邻精确"): 如果 对齐角落 : raise ValueError( "“对齐角点”选项只能与以下内容一起设置" "插值模式:线性 | 双线性 | 双三次 | 三线性" ) else: 如果 对齐角落 : 对齐角落 = 维度 = 输入.() - 2 # 空间维度数量。 处理大小和 scale_factor。验证是否恰好设置了一个。 如果它是列表,则验证其长度;如果是标量,则扩展它。 在此块之后,output_size 和 scale_factors 中恰好有一个非 None,并且它将是一个列表(或元组)。 将非 None 值设为列表(或元组)。 如果 大小 缩放系数 : raise ValueError("仅应定义大小或缩放因子之一") elif 大小 : 断言 缩放系数 缩放系数 = 如果 isinstance(尺寸, (列表, 元组)): 如果 长度(尺寸) != : raise ValueError( "输入和输出必须具有相同的空间维度,但得到了 " f"具有空间维度的输入 "{列表(输入.形状[2:])}并且输出大小为{尺寸}. "请提供输入张量,格式为 (N, C, d1, d2, ...,dK) " "以(o1, o2, ...,oK)格式输出大小。" ) 如果 torch.算子.是否正在脚本化(): 如果 所有(_是整数(x) for x 尺寸): raise 类型错误( "期望大小为 int 或 Tuple[int] 或 Tuple[int, int] 或 Tuple[int, int, int],但得到的大小类型为" f"但得到的大小类型为"{[类型(x) for x 尺寸]}" ) 输出大小 = 大小 else: 输出大小 = [大小 for _ 范围()] elif 缩放系数 : 断言 大小 输出大小 = 如果 isinstance(缩放因子, (列表, 元组)): 如果 长度(缩放因子) != : raise ValueError( "输入和 scale_factor 必须具有相同的空间维度,但" f"得到了具有以下空间维度的输入"{列表(输入.形状[2:])} f形状的 scale_factor{缩放因子}. "请提供输入张量,格式为 (N, C, d1, d2, ...,dK) " "尺度因子格式为 (s1, s2, ...,sK) 。" ) 缩放系数 = 缩放系数 else: 缩放系数 = [缩放系数 for _ 范围()] else: raise ValueError("大小或 scale_factor 必须定义") 如果 ( recompute_scale_factor recompute_scale_factor 大小 ): raise ValueError( "在显式大小的情况下,重新计算 scale_factor 没有意义。" ) "区域"模式始终需要显式的大小而不是缩放因子。 重新使用 recompute_scale_factor 代码路径。 如果 模式 == 面积 输出大小 : recompute_scale_factor = 真实 如果 recompute_scale_factor 重新计算缩放因子: 我们在这里计算输出大小,然后取消设置缩放因子。 C++代码将根据(整数)输出大小重新计算它。 断言 缩放系数 如果 torch.算子.是否正在脚本化() torch._C._获取追踪状态(): 在跟踪时将 scale_factor 转换为张量,以便常量不会烘焙进去 输出大小 = [ ( torch.向下取整( ( 输入.尺寸(i + 2).float() * torch.张量(缩放因子[i] 数据类型=torch.float32) ).float() ) ) for i 范围() ] elif torch.算子.是否正在脚本化(): 输出大小 = [ 整数(数学.向下取整(float(输入.尺寸(i + 2)) * 缩放因子[i])) for i 范围() ] else: 输出大小 = [ _sym_int(输入.尺寸(i + 2) * 缩放因子[i]) for i 范围() ] 缩放系数 = 如果 抗锯齿 (模式 (双线性, 双三次) 输入.维数 == 4): raise ValueError( 抗锯齿选项仅限于双线性双三次模式,并需要 4 维张量作为输入 ) 如果 输入.() == 3 模式 == 最近邻: 返回 torch._C._nn.上采样最近邻 1D(输入, output_size, 缩放因子) 如果 输入.() == 4 模式 == 最近邻: 返回 torch._C._nn.upsample_nearest2d(输入, output_size, 缩放因子) 如果 输入.() == 5 模式 == 最近邻: 返回 torch._C._nn.最近邻上采样 3D(输入, output_size, 缩放因子) 如果 输入.() == 3 模式 == "最近邻精确": 返回 torch._C._nn._upsample_nearest_exact1d(输入, output_size, 缩放因子) 如果 输入.() == 4 模式 == "最近邻精确": 返回 torch._C._nn._最近邻精确 2d 上采样(输入, output_size, 缩放因子) 如果 输入.() == 5 模式 == "最近邻精确": 返回 torch._C._nn._upsample_nearest_exact3d(输入, output_size, 缩放因子) 如果 输入.() == 3 模式 == 面积: 断言 输出大小 返回 adaptive_avg_pool1d(输入, output_size) 如果 输入.() == 4 模式 == 面积: 断言 输出大小 返回 adaptive_avg_pool2d(输入, output_size) 如果 输入.() == 5 模式 == 面积: 断言 输出大小 返回 自适应平均池化 3D(输入, output_size) 如果 输入.() == 3 模式 == 线性: 断言 对齐角落 返回 torch._C._nn.upsample_linear1d(线性 1D 上采样)( 输入, output_size, align_corners, 缩放系数 ) 如果 输入.() == 4 模式 == 双线性: 断言 对齐角落 如果 抗锯齿: 返回 torch._C._nn._upsample_bilinear2d_aa( 输入, output_size, align_corners, 缩放系数 ) # 两个级别是必要的,以防止 TorchScript 触及 # are_deterministic_algorithms_enabled. 如果 torch.算子.是否正在脚本化(): 如果 torch.是否启用了确定性算法() ( 输入.is_cuda 或者 输入.是_xpu ): # 使用慢速反编译,其反向操作将涉及 index_put # 需要 importlib,因为导入不能是顶层 # (循环)且不能嵌套(TS 不支持) 返回 importlib.导入模块( torch._decomp.分解 )._上采样线性向量(输入, output_size, align_corners, 缩放因子) 返回 torch._C._nn.upsample_bilinear2d( 输入, output_size, align_corners, 缩放系数 ) 如果 输入.() == 5 模式 == 三线性: 断言 对齐角落 返回 torch._C._nn.三线性上采样 3D( 输入, output_size, align_corners, 缩放系数 ) 如果 输入.() == 4 模式 == 双三次: 断言 对齐角落 如果 抗锯齿: 返回 torch._C._nn._upsample_bicubic2d_aa( 输入, output_size, align_corners, 缩放系数 ) 返回 torch._C._nn.upsample_bicubic2d( 输入, output_size, align_corners, 缩放系数 ) 如果 输入.() == 3 模式 == 双线性: raise 不支持的操作异常("输入为 3D,但双线性模式需要 4D 输入") 如果 输入.() == 3 模式 == 三线性: raise 不支持的操作异常("收到 3D 输入,但三线性模式需要 5D 输入") 如果 输入.() == 4 模式 == 线性: raise 不支持的操作异常("收到 4D 输入,但线性模式需要 3D 输入") 如果 输入.() == 4 模式 == 三线性: raise 不支持的操作异常("输入为 4D,但三线性模式需要 5D 输入") 如果 输入.() == 5 模式 == 线性: raise 不支持的操作异常("输入为 5D,但线性模式需要 3D 输入") 如果 输入.() == 5 模式 == 双线性: raise 不支持的操作异常("输入为 5D,但双线性模式需要 4D 输入") raise 不支持的操作异常( "输入错误:仅支持 3D、4D 和 5D 输入张量" f"(获取了"{输入.()}D)对于模式:最近邻 | 线性 | 双线性 | 双三次 | 三线性 | 面积 | 最近邻精确 f"(获取了"{模式})" )
如果 interpolate.__doc__: interpolate.__doc__ = interpolate.__doc__.格式(**可复现性说明) @_overload 定义 最近邻上采样( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[float] = , ) 输入文本: -> 翻译: -> 张量: 通过 @_overload 定义 最近邻上采样( # noqa: F811 输入: 张量, 尺寸: 可选[列表[整数]] = , 缩放因子: 可选[float] = , ) 输入文本: -> 翻译: -> 张量: 通过
[文档]def upsample_nearest(input, size=None, scale_factor=None): # noqa: F811 r"""使用最近邻像素值上采样输入。""" .. 警告:: 此函数已被弃用,建议使用 :func:`torch.nn.functional.interpolate`。 这与 `nn.functional.interpolate(..., mode='nearest')` 等价。 目前支持空间和体积上采样(即输入应为 4 或 5 维)。 输入是 4 或 5 维)。 参数: 输入(张量):输入 大小(int 或 Tuple[int, int] 或 Tuple[int, int, int]):输出空间 大小。 scale_factor(int):空间大小的乘数。必须是一个整数。 备注: {向后可重现性备注} """ 默认情况下忽略 DeprecationWarning 警告 warnings.warn( "``nn.functional.upsample_nearest`` 已弃用。" "请使用 ``nn.functional.interpolate`` 代替。" stacklevel=2, ) 返回 interpolate(input, size, scale_factor, mode="nearest")
如果
最近邻上采样.__doc__: 最近邻上采样.__doc__ = 最近邻上采样.__doc__.格式(**可复现性说明) @_overload 定义 双线性上采样( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[float] = , ) 输入文本: -> 翻译: -> 张量: 通过 @_overload 定义 双线性上采样( # noqa: F811 输入: 张量, 尺寸: 可选[列表[整数]] = , 缩放因子: 可选[float] = , ) 输入文本: -> 翻译: -> 张量: 通过 @_overload 定义 双线性上采样( # noqa: F811 输入: 张量, 尺寸: 可选[整数] = , 缩放因子: 可选[列表[float]] = , ) 输入文本: -> 翻译: -> 张量: 通过 @_overload 定义 双线性上采样( # noqa: F811 输入: 张量, 尺寸: 可选[列表[整数]] = , 缩放因子: 可选[列表[float]] = , ) 输入文本: -> 翻译: -> 张量: 通过
[文档]def upsample_bilinear(input, size=None, scale_factor=None): # noqa: F811 r"""对输入进行上采样,使用双线性上采样。 .. 警告:: 该函数已被弃用,建议使用 :func:`torch.nn.functional.interpolate`。 这与等效 ``nn.functional.interpolate(..., mode='bilinear', align_corners=True)``. 预期输入是空间(4 维)。使用 `upsample_trilinear` 对 体积(5 维)输入。 Args: 输入 (Tensor): 输入 大小 (int 或 Tuple[int, int]): 输出空间大小。 scale_factor (int 或 Tuple[int, int]): 空间大小的乘数 备注: {向后可重现性备注} """ 默认情况下忽略 DeprecationWarning 警告 warnings.warn( "``nn.functional.upsample_bilinear`` 已弃用。" "请使用 ``nn.functional.interpolate`` 代替。" stacklevel=2, ) return interpolate(input, size, scale_factor, mode="bilinear", align_corners=True)
如果
双线性上采样.__doc__: 双线性上采样.__doc__ = 双线性上采样.__doc__.格式( **可复现性说明 ) 网格采样插值模式 = { 双线性: 0, 最近邻: 1, 双三次: 2, } 网格样本填充模式 = { : 0, 边界: 1, 反射: 2, }
[文档]定义 网格采样( 输入: 张量, 网格: 张量, 模式: 字符串 = 双线性, 填充模式: 字符串 = , align_corners: 可选[布尔] = , ) 输入文本: -> 翻译: -> 张量: r计算网格样本。 给定一个 :attr:`输入` 和一个流场 :attr:`网格`,使用 :attr:`输入` 值和 :attr:`网格` 中的像素位置计算 ``输出``。 目前,仅支持空间(4-D)和体积(5-D):attr:`输入`。 目前,仅支持空间(4-D)和体积(5-D):attr:`输入`。 不支持。 在空间(4-D)情况下,对于形状为 :attr:`input` 的 :math:`(N, C, H_\text{in}, W_\text{in})` 和形状为 :attr:`grid` 的 :math:`(N, H_\text{out}, W_\text{out}, 2)`,输出将具有形状 math:`(N, H_\text{out}, W_\text{out})`。 math:`(N, C, H_\text{out}, W_\text{out})`。 math:`(N, C, H_\text{out}, W_\text{out})`。 对于每个输出位置 `output[n, :, h, w]`,大小为 2 的向量 `grid[n, h, w]` 指定了 :attr:`input` 像素位置 `x` 和 `y`, 这些位置用于插值输出值 `output[n, :, h, w]`。 对于 5D 输入,`grid[n, d, h, w]` 指定了 ``x``、``y``、``z`` 像素位置用于插值 ``output[n, :, d, h, w]``。:attr:`mode` 参数指定 ``nearest`` 或 ``bilinear`` 插值方法来采样输入像素。 attr:`grid` 指定采样像素位置,按归一化处理 输入的:attr:`input` 空间维度。因此,它应该具有大多数值在 范围 ``[-1, 1]`` 内。例如,值 ``x = -1, y = -1`` 是:attr:`input` 的 左上像素,而值 ``x = 1, y = 1`` 是:attr:`input` 的 右下像素。 如果 :attr:`grid` 的值超出 ``[-1, 1]`` 范围 输出处理方式由 :attr:`padding_mode` 定义。选项有 * ``padding_mode="zeros"``: 使用 ``0`` 对越界网格位置进行填充 * ``padding_mode="border"``: 使用边界值处理超出网格范围的网格位置, * ``padding_mode="reflection"``: 使用边界反射的值 边界外的网格位置。对于远离边界的位置, 它将不断反射,直到变为边界内,例如,(归一化)像素位置 ``x = -3.5`` 通过边界 ``-1`` 反射 ,例如,(归一化)像素位置 ``x = -3.5`` 通过边界 ``-1`` 反射 然后通过边界“1”反射变为“x' = 1.5” “x'' = -0.5” 注意: 此函数通常与:func:`affine_grid`一起使用 构建空间变换网络_。 注意: 使用 CUDA 后端时,此操作可能引起非确定性 行为在其反向传播中不易关闭。 请参阅:doc:`/notes/randomness` 中的笔记以获取背景信息。 注意: 在 :attr:`grid` 中的 NaN 值将被解释为 ``-1``。 参数: 输入 (Tensor):形状为 :math:`(N, C, H_\text{in}, W_\text{in})` 的输入 (4-D 情况) 或 :math:`(N, C, D_\text{in}, H_\text{in}, W_\text{in})` (5-D 情况) grid (Tensor):形状为 :math:`(N, H_\text{out}, W_\text{out}, 2)` 的流场 (4-D 情况) 或 :math:`(N, D_\text{out}, H_\text{out}, W_\text{out}, 3)` (5-D 情况) 模式 (str):计算输出值的插值模式 ``'bilinear'`` | ``'nearest'`` | ``'bicubic'``. 默认: ``'bilinear'` 注意:``mode='bicubic'`` 只支持 4-D 输入。 当`mode='bilinear'`且输入为 5-D 时,插值模式 实际上在内部使用将是三线性。然而,当输入是 4-D 时, 插值模式将合法地是双线性。 padding_mode (str): 用于外部网格值的填充模式 ``'zeros'`` | ``'border'`` | ``'reflection'``. 默认: ``'zeros'`` align_corners (bool, 可选): 几何上,我们将输入和输出的像素视为正方形而不是点。 input 作为正方形而不是点。 如果设置为 ``True``,则极值(``-1`` 和 ``1``)被视为引用 将其设置为 ``False`` 时,则被视为指向输入的角像素的角点。 否则,它们被视为指向输入的角像素的角点。 这样可以使采样更加分辨率无关。 此选项与 ``align_corners`` 选项相对应。 func:`interpolate`,因此这里使用哪个选项 应该在那里也使用它来在网格采样之前调整输入图像的大小。 默认:``False`` 返回: 输出(张量):输出张量 .. _`空间变换网络`: https://arxiv.org/abs/1506.02025 .. 警告:: 当 ``align_corners = True`` 时,网格位置取决于像素 输入图像大小的相对大小,因此在不同分辨率下(即放大或缩小后)采样的位置将不同 func:`grid_sample` 的结果将因输入分辨率的不同而不同 (即,在放大或缩小后)。版本 1.2.0 之前的默认行为是 ``align_corners = True``。 版本 1.2.0 之前的默认行为是 ``align_corners = True``。 自那时起,默认行为已更改为 `align_corners = False`, 以使其与 :func:`interpolate` 的默认值保持一致。 .. 注意:: ``mode='bicubic'`` 使用 `三次卷积算法`_,其中 :math:`\alpha=-0.75`。 常数 :math:`\alpha` 在不同的包中可能会有所不同。 例如,`PIL`_ 和 `OpenCV`_ 分别使用 -0.5 和 -0.75。 此算法可能会“超出”其插值值范围的限制。 例如,当对输入值[0, 255]进行插值时,可能会产生负值或大于 255 的值。 使用 :func:`torch.clamp` 函数对结果进行钳位,以确保它们在有效范围内。 .. _`三次卷积算法`: https://zh.wikipedia.org/wiki/Bicubic_interpolation .. _`PIL`: https://github.com/python-pillow/Pillow/blob/4634eafe3c695a014267eefdce830b4a825beed7/src/libImaging/Resample.c#L51 .. _`OpenCV`: https://github.com/opencv/opencv/blob/f345ed564a06178670750bad59526cfa4033be55/modules/imgproc/src/resize.cpp#L908 "文档" 如果 has_torch_function_variadic(输入, 网格): 返回 handle_torch_function( 网格采样, (输入, 网格), 输入, 网格, 模式=模式, 填充模式=填充模式, align_corners=align_corners, ) 如果 模式 != 双线性 模式 != 最近邻 模式 != 双三次: raise ValueError( fnn.functional.grid_sample():期望模式为 'bilinear'、'nearest' 或 'bicubic',但得到:'{模式} ) 如果 ( 填充模式 != "零" 填充模式 != "边界" 填充模式 != 反射 ): raise ValueError( "nn.functional.grid_sample(): 预期填充模式 " "应为 'zeros'、'border' 或 'reflection'," f但是得到了: '{填充模式} ) 如果 模式 == 双线性: 模式枚举 = 0 elif 模式 == 最近邻: 模式枚举 = 1 else: # mode == 'bicubic' 模式枚举 = 2 如果 填充模式 == : 填充模式枚举 = 0 elif 填充模式 == 边界: 填充模式枚举 = 1 else: # 填充模式 == '反射' 填充模式枚举 = 2 如果 对齐角落 : 警告.警告( "默认的 grid_sample 和 affine_grid 行为已更改" "自 1.3.0 版本起更改为 align_corners=False。请指定" "如果需要旧的行为,请指定 align_corners=True。" "查看 grid_sample 的文档以获取详细信息。" ) 对齐角落 = 返回 torch.网格采样器(输入, 网格, 模式枚举, padding_mode_enum, align_corners)
[文档]定义 affine_grid( 西塔: 张量, 尺寸: 列表[整数] align_corners: 可选[布尔] = , ) 输入文本: -> 翻译: -> 张量: r根据给定的仿射矩阵批处理:attr:`theta`,生成 2D 或 3D 流场(采样网格)。 .. 注意:: 此函数通常与:func:`grid_sample`一起使用。 构建空间变换网络_。 参数: theta (张量):输入的仿射矩阵批次,形状为 (:math:`N \times 2 \times 3`) 用于 2D 或 (:math:`N \times 3 \times 4`) 用于 3D size (torch.Size):目标输出图像大小。 (:math:`N \times C \times H \times W` 对于 2D 或 math:`N \times C \times D \times H \times W` 对于 3D) 示例:torch.Size((32, 3, 24, 24)) align_corners (bool, 可选): 如果为 ``True``,则将 ``-1`` 和 ``1`` 解释为角落像素的中心,而不是图像的角落。 请参阅 :func:`grid_sample` 获取更完整的描述。 由 :func:`affine_grid` 生成的网格应传递给 :func:`grid_sample` 使用相同的设置选项。 默认:``False`` 返回: 输出(张量):大小为 (:math:`N \times H \times W \times 2`) 的输出张量 .. _`空间变换网络`: https://arxiv.org/abs/1506.02025 .. 警告:: 当 ``align_corners = True`` 时,网格位置取决于像素 输入图像大小的相对大小,因此在不同分辨率下(即放大或缩小后)采样的位置将不同 func:`grid_sample` 的结果将因输入分辨率的不同而不同 (即,在放大或缩小后)。版本 1.2.0 之前的默认行为是 ``align_corners = True``。 版本 1.2.0 之前的默认行为是 ``align_corners = True``。 自那时起,默认行为已更改为 `align_corners = False`, 以使其与 :func:`interpolate` 的默认值保持一致。 .. 警告:: 当 `align_corners = True` 时,对 1D 数据进行 2D 仿射变换以及 对 2D 数据进行 3D 仿射变换(即当其中一个空间维度 维度具有单位大小)是不明确的,也不是预期的用例。 当 `align_corners = False` 时,这不是问题。 在版本 1.2.0 之前,单位维度上的所有网格点都被任意地认为是 `-1`。 被任意地认为是 `-1`。 从版本 1.3.0 开始,在`align_corners = True`的情况下,所有网格点 沿着单位维度被认为是“0” (输入图像的中心)。 "文档" 如果 has_torch_function_unary(西塔): 返回 handle_torch_function( affine_grid, (西塔,), 西塔, 尺寸, align_corners=对齐角落 ) 如果 对齐角落 : 警告.警告( "默认的 grid_sample 和 affine_grid 行为已更改" "自 1.3.0 版本起更改为 align_corners=False。请指定" "如果需要旧的行为,请指定 align_corners=True。" "查看 grid_sample 的文档以获取详细信息。" ) 对齐角落 = # 在 theta 上强制使用浮点数据类型 如果 西塔.is_floating_point(): raise ValueError( f预期 theta 为浮点类型,但得到了{西塔.数据类型}" ) # 检查形状和大小是否匹配 如果 长度(尺寸) == 4: 如果 西塔.() != 3 或者 西塔.形状[-2] != 2 或者 西塔.形状[-1] != 3: raise ValueError( f预期一个形状为 Nx2x3 的 2D 仿射矩阵的批次大小{尺寸}.得到了{西塔.形状} ) 空间大小 = 尺寸[-2] # 空间维度大小 elif 长度(尺寸) == 5: 如果 西塔.() != 3 或者 西塔.形状[-2] != 3 或者 西塔.形状[-1] != 4: raise ValueError( f预期一个形状为 Nx3x4 的 3D 仿射矩阵批次{尺寸}.得到了{西塔.形状} ) 空间大小 = 尺寸[-3] # 空间维度大小 else: raise 不支持的操作异常( "仿射网格仅支持 4D 和 5D 大小," "分别对应 2D 和 3D 仿射变换。" f"获取大小"{尺寸} ) # 检查空跨度 如果 对齐角落 最小(spatial_size) == 1: 警告.警告( "自版本 1.3.0 起,affine_grid 的行为已更改" "当 align_corners=True 时,对于单位大小的网格。" "这不是 affine_grid 的预期用途。" "请参阅 affine_grid 的文档以获取详细信息。" ) elif 最小(尺寸) 0: raise ValueError(f"期望输出大小非零且为正。得到"{尺寸}") 返回 torch.线性网格生成器(西塔, 尺寸, align_corners)
[文档]定义 填充( 输入: 张量, 填充: 列表[整数] 模式: 字符串 = 常数, : 可选[float] = , ) 输入文本: -> 翻译: -> 张量: r"" pad(input, pad, mode="constant", value=None) -> Tensor 填充张量。 填充大小: 通过填充大小来填充:attr:`input`的一些维度 从最后一个维度开始描述,向前移动。 math:`\left\lfloor\frac{\text{len(pad)}}{2}\right\rfloor` 维度 的 `input` 将会被填充。 例如,如果要只填充输入张量的最后一个维度,那么 `:attr:`pad` 的形式是` `(:math:`(\text{padding\_left}, \text{padding\_right})`)`;` 为了填充输入张量的最后两个维度,然后使用` `padding_left`, `padding_right`,` `padding_top`, `padding_bottom`)`; 要填充最后三个维度,请使用 `padding_left`, `padding_right`,` `padding_top`, `padding_bottom` `padding_front, padding_back)`。 填充模式: 请参阅 :class:`torch.nn.CircularPad2d`, :class:`torch.nn.ConstantPad2d`, class:`torch.nn.ReflectionPad2d`, 以及 :class:`torch.nn.ReplicationPad2d` 关于如何使用每种填充模式的具体示例。 填充适用于任意维度。环形、复制和反射填充用于填充最后三个维度。 反射填充被实现用于填充一个张量的最后三个维度。 4D 或 5D 输入张量,3D 或 4D 输入张量的最后 2 个维度 或 2D 或 3D 输入张量的最后一个维度。 注意: 使用 CUDA 后端时,此操作可能引起非确定性 行为在其反向传播中不易关闭。 请参阅:doc:`/notes/randomness` 中的笔记以获取背景信息。 参数: 输入(Tensor):N 维张量 填充(元组):m 个元素的元组,其中 $\frac{m}{2} \leq$ 输入维度且$m$为偶数。 模式:``'constant'``、``'reflect'``、``'replicate'`` 或 ``'circular'``。 默认:``'constant'`` value:用于 ``'constant'`` 填充的填充值。默认:``0`` 示例: >>> t4d = torch.empty(3, 3, 4, 2) >>> p1d = (1, 1) # 在最后一个维度两侧各填充 1 >>> out = F.pad(t4d, p1d, "constant", 0) # 实际上为零填充 >>> print(out.size()) torch.Size([3, 3, 4, 4]) >>> p2d = (1, 1, 2, 2) # 在最后一个维度上填充(1, 1),在倒数第二个维度上填充(2, 2) >>> out = F.pad(t4d, p2d, "constant", 0) >>> print(out.size()) torch.Size([3, 3, 8, 4]) >>> t4d = torch.empty(3, 3, 4, 2) >>> p3d = (0, 1, 2, 1, 3, 3) # pad by (0, 1), (2, 1), and (3, 3) >>> out = F.pad(t4d, p3d, "constant", 0) >>> print(out.size()) torch.Size([3, 9, 7, 3]) "文档" 如果 has_torch_function_unary(输入): 返回 handle_torch_function( torch.神经网络.功能性.填充, (输入,), 输入, 填充, 模式=模式, = ) 如果 torch.算子.是否正在脚本化(): 如果 torch.是否启用了确定性算法() ( 输入.is_cuda 或者 输入.是_xpu ): 如果 模式 == 复制: 使用慢速反编译,其反向操作将以 index_put 为基准。 # 需要 importlib,因为导入不能是顶层 # (循环)且不能嵌套(TS 不支持) 返回 importlib.导入模块( torch._decomp.分解 ).复制垫(输入, 填充) 返回 torch._C._nn.填充(输入, 填充, 模式, )
# TODO: 通过 https://github.com/pytorch/pytorch/issues/75798 修复 填充.__module__ = "torch.nn.functional" # 距离 对应距离 = _添加文档字符串( torch.对距离, r"" pairwise_distance(x1, x2, p=2.0, eps=1e-6, keepdim=False) -> 张量 详细信息请参阅 :class:`torch.nn.PairwiseDistance` """, ) pdist = _添加文档字符串( torch.pdist, r"" 计算输入之间的 p 范距离,p=2 时表示欧几里得距离。-> 计算输入之间的 p 范距离,p=2 时表示欧几里得距离 计算输入中每一对行向量的 p 范数距离。 这与上三角部分(不包括对角线)相同。 `torch.norm(input[:, None] - input, dim=2, p=p)`。如果行是连续的,这个函数将会更快。 如果行是连续的,将会更快。 如果输入的形状为 :math:`N \times M`,则输出形状将为 1/2 N (N - 1) 此函数等同于 `scipy.spatial.distance.pdist(input,`) minkowski 距离,p=p)`` 当 :math:`p \in (0, \infty)`。当 :math:`p = 0` 时,它是 等价于 `scipy.spatial.distance.pdist(input, 'hamming') * M`. 当 :math:`p = \infty` 时,最接近的 scipy 函数是 `scipy.spatial.distance.pdist(xn, lambda x, y: np.abs(x - y).max())`. 参数: 输入:形状为 :math:`N \times M` 的输入张量。 p:计算每个向量对之间的 p-范数距离的 p 值 math:`\in [0, \infty]`。 """, ) 余弦相似度 = _添加文档字符串( torch.余弦相似度, r"" cosine_similarity(x1, x2, dim=1, eps=1e-8) -> Tensor 返回 `x1` 和 `x2` 之间的余弦相似度,沿 dim 计算。`x1` 和 `x2` 必须可广播到公共形状。 公共形状。`dim` 指的是这个公共形状中的维度。输出维度的 `dim` 被压缩(参见 :func:`torch.squeeze`),结果为 压缩(参见 :func:`torch.squeeze`),结果为 输出维度减少 1 的张量。 .. math :: \text{相似度} = \dfrac{x_1 \cdot x_2}{\max(\Vert x_1 \Vert _2, \epsilon) \cdot \max(\Vert x_2 \Vert _2, \epsilon)} 支持 :ref:`类型提升 `. 参数: x1(张量):第一个输入。 x2(张量):第二个输入。 dim(int,可选):计算余弦相似度的维度。默认:1 eps(float,可选):避免除以零的小值。 默认:1e-8 示例:: >>> input1 = torch.randn(100, 128) >>> input2 = torch.randn(100, 128) >>> output = F.cosine_similarity(input1, input2) >>> print(output) """, ) 热编码 = _添加文档字符串( torch._C._nn.one_hot, r"" one_hot(tensor, num_classes=-1) -> LongTensor 接受形状为 ``(*)`` 的 LongTensor 索引值并返回一个张量 形状为 ``(*, num_classes)`` 的张量,除最后一个维度的索引与输入张量中对应的值匹配外,其余位置均为零 其中最后一个维度的索引与输入张量中对应的值匹配 在这种情况下将是 1。 参见维基百科上的`One-hot`_ 。 .. _One-hot 在维基百科上: https://en.wikipedia.org/wiki/One-hot 参数: 张量(LongTensor):任何形状的类别值。 num_classes (int, 可选): 总类别数。如果设置为 -1,则表示 类数将被推断为大于最大类数的一个数 输入张量中的值。默认:-1 返回: 长张量,比 1 值多一个维度 输入指示的最后一个维度索引,其他地方为 0 否则。 示例: >>> F.one_hot(torch.arange(0, 5) % 3) tensor([[1, 0, 0], [0, 1, 0] [0, 0, 1] [1, 0, 0] [0, 1, 0] >>> F.one_hot(torch.arange(0, 5) % 3, num_classes=5) tensor([[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [1, 0, 0, 0, 0], [[0, 1, 0, 0, 0]]) >>> F.one_hot(torch.arange(0, 6).view(3,2) % 3) tensor([[[1, 0, 0], [0, 1, 0]] [[0, 0, 1]] [[1, 0, 0]] [[0, 1, 0]] [[0, 0, 1]]]] """, )
[文档]def triplet_margin_loss( 锚点: Tensor, 正样本: Tensor, 负样本: Tensor, margin: 浮点数 = 1.0, p: 浮点数 = 2, eps: 浮点数 = 1e-6, swap: 布尔值 = False, size_average: 可选[布尔] = None, reduce: 可选[布尔] = None, reduction: str = "mean", ) -> Tensor: 计算给定输入张量之间的三元组损失,并设置一个大于 0 的边界。 详细信息请参阅 :class:`~torch.nn.TripletMarginLoss`。 "" 如果有_torch_function_variadic(anchor, positive, negative): return handle_torch_function( triplet_margin_loss, (anchor, positive, negative), anchor, 正面, 负面, margin=margin, p=p, eps=eps, swap=swap, size_average=size_average, reduce=reduce, reduction=reduction, ) 如果 size_average 不为空或 reduce 不为空: reduction_enum = _Reduction.legacy_get_enum(size_average, reduce) else: reduction_enum = _Reduction.get_enum(reduction) if 毛利率 <= 0: raise ValueError(f"毛利率必须大于 0,获取到 {毛利率}") return torch.triplet_margin_loss( 锚点,正样本,负样本,间隔,p,eps,交换,reduction_enum )
[文档]定义 三重边距与距离损失( 锚点: 张量, 正的: 张量, 负面: 张量, *, 距离函数: 可选[可调用[[张量, 张量] 张量]] = , 边距: 浮点数 = 1.0, 交换: 布尔 = 错误, 缩减: 字符串 = 平均值, ) 输入文本: -> 翻译: -> 张量: r使用自定义距离函数计算输入张量的三元组损失。 详细信息请参阅 :class:`~torch.nn.TripletMarginWithDistanceLoss`。 "文档" 如果 torch.算子.是否正在脚本化(): raise 不支持的操作异常( "F.triplet_margin_with_distance_loss 不支持 JIT 脚本:" "需要 Callable 的函数无法进行脚本化。" ) 如果 has_torch_function_variadic(锚点, 正的, 负面): 返回 handle_torch_function( 三重边距与距离损失, (锚点, 正的, 负面), 锚点, 正的, 负面, 距离函数=距离函数, 边距=边距, 交换=交换, 缩减=缩减, ) # 检查缩减模式的有效性 如果 减少 (平均值, "求和", ): raise ValueError(f"{缩减}不是有效的缩减值) 检查边距的有效性 如果 边距 0: raise ValueError(f"边距必须大于 0,实际得到"{边距}") 检查尺寸 一个维度 = 锚点.维数 p_dim = 正的.维数 n_维度 = 负面.维数 如果 (一个维度 == p_dim p_dim == n_dim): raise 运行时错误( f"锚点、正张量和负张量应具有相同的维度,但得到的是:锚点" f"维度数相同,但得到了:anchor"{一個維度}D," f"積極的{p 維度}D,和负{n_dim}D 输入 ) 计算损失 如果 距离函数 : 距离函数 = torch.对应距离 正距离 = 距离函数(锚点, 正的) dist_neg = 距离函数(锚点, 负面) # 距离交换在论文《学习浅层卷积特征描述符的三元损失》中进行了描述,作者为 V. Balntas,E. Riba 等。如果为 True,并且正例更接近于 # # 距离交换在论文《学习浅层卷积特征描述符的三元损失》中进行了描述,作者为 V. Balntas,E. Riba 等。如果为 True,并且正例更接近于 # # 距离交换在论文《学习浅层卷积特征描述符的三元损失》中进行了描述,作者为 V. Balntas,E. Riba 等。如果为 True,并且正例更接近于 与锚点相比,负例比正例更差,交换正例和锚点在损失计算中。 锚点在损失计算中。 如果 交换: 距离交换 = 距离函数(正的, 负的) dist_neg = torch.最小(分布式否定, 交换距离) 损失 = torch.最小限制(边距 + 正距离 - 分布式否定, 0) 应用缩减 如果 减少 == "求和": 返回 torch.总和(损失) elif 减少 == 平均值: 返回 torch.均值(损失) else: # reduction == "none" 返回 损失
[文档]def normalize( 输入: Tensor, p: float = 2.0, dim: int = 1, eps: float = 1e-12, out: Optional[Tensor] = None, ) -> Tensor: r"""执行输入在指定维度上的 :math:`L_p` 归一化。 对于一个大小为 :math:`(n_0, ..., n_{dim}, ..., n_k)` 的张量 :attr:`input`,每个 `n_dim` -元素向量 `v` 沿维度 `dim` 转换为 .. 数学表达式 v = v / max(∥v∥_p, ε) 使用默认参数时,它使用维度 :math:`1` 上的欧几里得范数进行归一化。 Args: 输入:任何形状的输入张量 p (浮点数):范数公式中的指数值。默认:2 dim (int 或 int 元组的元组):降维的维度。默认:1 eps (float): 避免除以零的小值。默认:1e-12 输出(Tensor,可选):输出张量。如果使用:attr:`out`,则 操作不可微。 """ 如果具有 torch_function_variadic(input, out): 返回 handle_torch_function( normalize, (input, out), input, p=p, dim=dim, eps=eps, out=out ) if out is None: denom = input.norm(p, dim, keepdim=True).clamp_min(eps).expand_as(input) return input / denom else: denom = input.norm(p, dim, keepdim=True).clamp_min_(eps).expand_as(input) return torch.div(input, denom, out=out)
定义
断言整型或对偶(arg: 列表[整数] 参数名称: 字符串, 消息: 字符串) 输入文本: -> 翻译: -> : 断言 isinstance(arg, 整数) 或者 长度(arg) == 2, 消息.格式(参数名称)
[文档]def 展开( 输入: Tensor, 核大小: BroadcastingList2[int], 扩展率: BroadcastingList2[int] = 1, padding: BroadcastingList2[int] = 0, stride: BroadcastingList2[int] = 1, ) -> Tensor: r"""从批处理的输入张量中提取滑动局部块。""" ..警告:: 目前仅支持 4-D 输入张量(批量的图像类张量)。 支持。 ..警告:: 展开的张量可能包含多个元素指向同一个内存位置。因此,原地操作(尤其是向量化的操作)可能会导致不正确的行为。如果您需要向张量写入,请先对其进行克隆。 作为结果,原地操作(尤其是向量化的操作)可能会导致不正确的行为。如果您需要向张量写入,请先对其进行克隆。 如果您需要向张量写入,请先对其进行克隆。 如果您需要向张量写入,请先对其进行克隆。 查看 :class:`torch.nn.Unfold` 获取详细信息 """ 如果 has_torch_function_unary(input): 返回 handle_torch_function( 展开, (输入,), 输入, 核心大小, dilation=dilation, padding=padding, stride=stride, ) return torch._C._nn.im2col( 输入,_pair(kernel_size),_pair(dilation),_pair(padding),_pair(stride) )
[文档]def fold( 输入: Tensor, 输出大小: BroadcastingList2[int], 核大小: BroadcastingList2[int], dilation: 广播列表 2[int] = 1, padding: 广播列表 2[int] = 0, stride: 广播列表 2[int] = 1, ) -> 张量: 将一系列滑动局部块组合成一个大的包含张量。 .. 警告:: 目前仅支持未批处理(3D)或批处理(4D)的图像类似输出张量。 详细信息请参阅 :class:`torch.nn.Fold` """ 如果存在 torch 函数单例(input): 返回 handle_torch_function( fold, 输入, 输入, 输出大小, 核大小, dilation=dilation, padding=padding, stride=stride, ) return torch._C._nn.col2im( 输入 _pair(output_size) _pair(kernel_size) _pair(膨胀) _pair(填充) _pair(步长) )
# 多头注意力 # 定义 _in_projection_packed( q: 张量, k: 张量, v: 张量, w: 张量, b: 可选
[张量] = , ) 输入文本: -> 翻译: -> 列表[张量]: r执行注意力操作的投影步骤,使用打包的权重。 输出是一个包含查询、键和值投影张量的三元组。 参数: q, k, v:查询、键和值张量将被投影。对于自注意力机制, 这些通常是相同的张量;对于编码器-解码器注意力机制, k 和 v 通常是指同一个张量。 (我们利用这些 身份用于性能,如果存在的话。无论如何,q,k 和 v 必须共享一个共同的嵌入维度;否则它们的形状可能不同。 q, k 和 v 的投影权重,打包成一个张量。权重沿维度 0 打包,顺序为 q, k, v。 打包顺序为 q, k, v。 b:q, k 和 v 的可选投影偏置,打包成一个张量 ,顺序为 q, k, v。 形状: 输入: - q::math:`(..., E)` 其中 E 是嵌入维度 - k::math:`(..., E)` 其中 E 是嵌入维度 - v::math:`(..., E)` 其中 E 是嵌入维度 - w: (E * 3, E) 其中 E 是嵌入维度 - b: E * 3 其中 E 是嵌入维度 输出: - 在输出列表 [q', k', v'] 中,每个输出张量将具有 与相应的输入张量形状相同。 "文档" E = q.尺寸(-1) 如果 k v: 如果 q k: # 自注意力 项目 = 线性(q, w, b) # 调整形状为 3, E 和不是 E,3 是故意为之,以实现更好的内存归约并保持与 chunk()相同的顺序 项目 = ( 项目.unflatten(-1, (3, E)) .展平(0) .转置(0, -2) .挤压(-2) .连续() ) 返回 项目[0] 项目[1] 项目[2] else: 编码器-解码器注意力 w_q, w_kv = w.分割[E, E * 2]) 如果 b : b_q = b_kv = else: b_q, b_kv = b.分割[E, E * 2]) q_proj = 线性(q, w_q, b_q) kv_proj = 线性(k, w_kv, b_kv) # 重新塑形为 2,E 和非 E,2 是故意的,为了更好的内存归约并保持与 chunk()相同的顺序 kv_proj = ( kv_proj.unflatten(-1, (2, E)) .展平(0) .转置(0, -2) .挤压(-2) .连续() ) 返回 (q_proj, kv_proj[0] kv_proj[1]) else: w_q, w_k, w_v = w.数据块(3) 如果 b : b_q = b_k = b_v = else: b_q, b_k, b_v = b.数据块(3) 返回 线性(q, w_q, b_q), 线性(k, w_k, b_k), 线性(v, w_v, b_v) 定义 投影中( q: 张量, k: 张量, v: 张量, w_q: 张量, w_k: 张量, w_v: 张量, b_q: 可选[张量] = , b_k: 可选[张量] = , b_v: 可选[张量] = , ) 输入文本: -> 翻译: -> 元组[张量, 张量, 张量]: r执行注意力操作的投影步骤。 这只是一个由线性投影组成的 triple, 权重上有形状约束, 确保投影输出中的嵌入维度一致性。 输出是一个包含查询、键和值投影张量的三元组。 参数: q, k, v:要投影的查询、键和值张量。 w_q, w_k, w_v:q、k 和 v 的权重,分别对应。 b_q, b_k, b_v:q、k 和 v 的可选偏置,分别对应。 形状: 输入: - q: (Qdims..., Eq) 其中 Eq 是查询嵌入维度,Qdims 是任意维度。 主导维度数量。 - k: (Kdims..., Ek) 其中 Ek 是键嵌入维度,Kdims 是任意维度。 主导维度数量。 - v: :math:`(Vdims..., Ev)` 其中 Ev 是值嵌入维度,Vdims 是任何 主导维度数量。 - w_q: (Eq, Eq) - w_k: (Eq, Ek) - w_v: (Eq, Ev) - b_q: (方程式) - b_k: (方程式) - b_v: (方程式) 输出:在输出三元组(q', k', v')中, - q': :math:`[Qdims..., Eq]` - k': :math:`[Kdims..., Eq]` - v': :math:`[Vdims..., Eq]` "文档" 等式, Ek, Ev = q.尺寸(-1), k.尺寸(-1), v.尺寸(-1) 断言 w_q.形状 == ( 等式, 等式, ), f预期查询权重形状为{(等式, 等式)}, 但得到{w_q.形状}" 断言 w_k.形状 == ( 等式, Ek, ), f预期键权重形状为{(等式, Ek)}, 但得到{w_k.形状}" 断言 w_v.形状 == ( 等式, 欧文, ), f预期值权重形状为{(等式, 欧文)}, 但得到{w_v.形状}" 断言 b_q 或者 b_q.形状 == ( 等式, ), f期待查询偏差形状{(等式,)}, 但得到{b_q.形状}" 断言 b_k 或者 b_k.形状 == ( 等式, ), f期待键偏置形状{(等式,)}, 但得到{b_k.形状}" 断言 b_v 或者 b_v.形状 == ( 等式, ), f预期值偏差形状的{(等式,)}, 但得到{b_v.形状}" 返回 线性(q, w_q, b_q), 线性(k, w_k, b_k), 线性(v, w_v, b_v) 缩放点积注意力机制 = _添加文档字符串( torch._C._nn.扩放点积注意力, r"""缩放点积注意力机制(query, key, value, attn_mask=None, dropout_p=0.0, is_causal=False, scale=None, enable_gqa=False) -> Tensor: 计算查询、键和值张量上的缩放点积注意力,如果传递了可选的注意力掩码, 并应用大于 0.0 的概率的 dropout。可选的 scale 参数只能作为关键字参数指定。 .. 代码块 :: python # 高效实现等价于以下代码: def scaled_dot_product_attention(query, key, value, attn_mask=None, dropout_p=0.0, is_causal=False, scale=None, enable_gqa=False) -> torch.Tensor: L, S = query.size(-2), key.size(-2) scale_factor = 1 / math.sqrt(query.size(-1)) if scale is None else scale attn_bias = torch.zeros(L, S, dtype=query.dtype, device=query.device) if is_causal: assert attn_mask is None temp_mask = torch.ones(L, S, dtype=torch.bool).tril(diagonal=0) attn_bias.masked_fill_(temp_mask.logical_not(), float("-inf")) 将 attn_bias 转换为 query 的数据类型 如果 attn_mask 不为空: 如果 attn_mask 的数据类型为 torch.bool: attn_bias.masked_fill_(attn_mask.logical_not(), float("-inf")) 否则: attn_bias = attn_mask + attn_bias if enable_gqa: key = key.repeat_interleave(query.size(-3)//key.size(-3), -3) value = value.repeat_interleave(query.size(-3)//value.size(-3), -3) attn_weight = query @ key.transpose(-2, -1) * scale_factor attn_weight += attn_bias attn_weight = torch.softmax(attn_weight, dim=-1) attn_weight = torch.dropout(attn_weight, dropout_p, train=True) return attn_weight @ value .. 警告:: 此函数处于测试阶段,可能会发生变化。 .. 警告:: 此函数始终根据指定的 `dropout_p` 参数应用 dropout。 要在评估期间禁用 dropout,请确保传递 `0.0` 的值,当模块的函数调用不在训练模式时。 使得函数调用不在训练模式。 例如: .. 代码块 :: python 类 MyModel(nn.Module): def __init__(self, p=0.5): super().__init__() self.p = p def forward(self, ...): return F.scaled_dot_product_attention(..., dropout_p=(self.p if self.training else 0.0)) 注意: 目前支持三种缩放点积注意力机制的实现: - `FlashAttention-2:更快的注意力机制,更好的并行性和工作分区` - `内存高效注意力机制` - 使用 C++定义的与上述公式匹配的 PyTorch 实现 The function may call optimized kernels for improved performance when using the CUDA backend. 对于所有其他后端,将使用 PyTorch 实现。 所有实现默认启用。缩放点积注意力尝试自动选择 基于输入的最优实现。为了提供更多细粒度的控制,以实现 用于启用和禁用实现的功能如下。 上下文管理器是首选机制: - :func:`torch.nn.attention.sdpa_kernel`:用于启用或禁用任何实现的上下文管理器。 - :func:`torch.backends.cuda.enable_flash_sdp`: 全局启用或禁用 FlashAttention。 - :func:`torch.backends.cuda.enable_mem_efficient_sdp`: 全局启用或禁用内存高效注意力。 - :func:`torch.backends.cuda.enable_math_sdp`: 全局启用或禁用 PyTorch C++ 实现。 每个融合内核都有特定的输入限制。如果用户需要使用特定的融合实现, 使用 :func:`torch.nn.attention.sdpa_kernel` 禁用 PyTorch 的 C++ 实现。 如果没有可用的融合实现,将发出警告,说明融合实现无法运行的原因。 融合实现无法运行的原因。 由于融合浮点运算的特性,此函数的输出可能因所选后端内核而异。 取决于所选后端内核。 C++ 实现支持 torch.float64,当需要更高精度时可以使用。 对于数学后端,如果输入为 torch.half 或 torch.bfloat16,所有中间结果都保持在 torch.float。 欲了解更多信息,请参阅:doc:`/notes/numerical_accuracy` 分组查询注意力(GQA)是一个实验性功能。目前它仅适用于 Flash_attention 和 CUDA 张量上的数学内核,不支持嵌套张量。 GQA 的约束条件: - 头数查询 % 头数键值 == 0 且, - 头数键 == 头数值 注意: {cudnn_可复现性说明} """.格式( **可复现性说明 ) + r"" 参数: 查询(张量):查询张量;形状:math:`(N, ..., Hq, L, E)`。 密钥(张量):密钥张量;形状:math:`(N, ..., H, S, E)`。 值(张量):值张量;形状:math:`(N, ..., H, S, Ev)`。 attn_mask(可选张量):注意力掩码;形状必须可广播到注意力权重形状。 这是一个数学表达式:(N,..., L, S)。支持两种类型的掩码。 这是一个布尔掩码,其中 True 值表示该元素*应该*参与注意力。 这是一个与查询、键、值相同类型的浮点掩码,它被添加到注意力分数中。 dropout_p (浮点数): Dropout 概率;如果大于 0.0,则应用 dropout。 is_causal (布尔值): 如果设置为 true,当掩码是正方形矩阵时,注意力掩码是一个下三角矩阵。 正方形矩阵。当掩码是非正方形矩阵时,注意力掩码具有上左因果偏差的形式(参见 :class:`torch.nn.attention.bias.CausalBias`)。 如果同时设置了 attn_mask 和 is_causal,则会抛出错误。 如果同时设置了 attn_mask 和 is_causal,则会抛出错误。 缩放因子(可选浮点数,关键字参数):在 softmax 之前应用的缩放因子。如果为 None,则设置默认值 到 :math:`\frac{1}{E}{E}}`. enable_gqa (布尔值): 如果设置为 True,则启用分组查询注意力(GQA),默认设置为 False。 返回: output (张量): 注意力输出;形状 :math:`(N, ..., Hq, L, Ev)`。 形状说明: - :math:`N: 批处理大小 ... : 其他批处理维度数量(可选)` - S:源序列长度 - L:目标序列长度 - E:查询和键的嵌入维度 - Ev:值的嵌入维度 - :math:`Hq: \text{查询头数}` - :math:`H: \text{键和值的头数}` 示例: >>> # 可选使用上下文管理器以确保运行融合内核之一 >>> query = torch.rand(32, 8, 128, 64, dtype=torch.float16, device="cuda") >>> key = torch.rand(32, 8, 128, 64, dtype=torch.float16, device="cuda") >>> value = torch.rand(32, 8, 128, 64, dtype=torch.float16, device="cuda") >>> with sdpa_kernel(backends=[SDPBackend.FLASH_ATTENTION]): >>> F.scaled_dot_product_attention(query,key,value) >>> # GQA 样本用于 llama3 >>> query = torch.rand(32, 32, 128, 64, dtype=torch.float16, device="cuda") >>> key = torch.rand(32, 8, 128, 64, dtype=torch.float16, device="cuda") >>> value = torch.rand(32, 8, 128, 64, dtype=torch.float16, device="cuda") >>> with sdpa_kernel(backends=[SDPBackend.MATH]): >>> F.scaled_dot_product_attention(query,key,value,enable_gqa=True) .. _FlashAttention-2: 更快速的注意力机制,具有更好的并行性和工作分区 https://arxiv.org/abs/2307.08691 .. _Memory-Efficient Attention: 内存高效注意力机制 https://github.com/facebookresearch/xformers .. _Grouped-Query Attention: https://arxiv.org/pdf/2305.13245 """, ) 定义 _mha_shape_check( 查询: 张量, : 张量, : 张量, 关键填充掩码: 可选[张量] 注意掩码: 可选[张量] 头数: 整数, ): # 验证 `query`、`key`、`value`、`key_padding_mask` 和 `attn_mask` 的预期形状 # 并返回输入是否批处理 如果 `query` 不是二维(非批量)或三维(批量)张量,则会引发错误。 形状检查。 如果 查询.() == 3: 批量输入。 批处理 = 真实 断言 .() == 3 .() == 3, ( 对于批处理(3-D)`查询`,期望`键`和`值`为 3-D f"但找到了"{.()}-D 和{.()}-D 张量分别" ) 如果 key_padding_mask : 断言 关键填充掩码.() == 2, ( "对于批量(3-D)`查询`,期望`key_padding_mask`为`None`或 2-D" f"但找到了"{关键填充掩码.()}-D 索引张量而不是 ) 如果 注意力掩码 : 断言 注意掩码.() (2, 3), ( "对于批处理(3-D)`查询`,期望`注意力掩码`为`None`,2-D 或 3-D" f"但找到了"{注意掩码.()}-D 索引张量而不是 ) elif 查询.() == 2: 未分批输入 批处理 = 断言 .() == 2 .() == 2, ( 对于未分批(2-D)的`query`,期望`key`和`value`为 2-D f"但找到了"{.()}-D 和{.()}-D 张量分别" ) 如果 key_padding_mask : 断言 关键填充掩码.() == 1, ( 对于未分批(2-D)`query`,期望`key_padding_mask`为`None`或 1-D f"但找到了"{关键填充掩码.()}-D 索引张量而不是 ) 如果 注意力掩码 : 断言 注意掩码.() (2, 3), ( 对于未分批(2-D)的`query`,期望`attn_mask`为`None`,2-D 或 3-D f但找到{attn_mask.暗淡()}“-D 张量而不是” ) 如果 attn_mask.() == 3: 预期形状 = (头数, 查询.形状[0] .形状[0]) 断言 ( 注意掩码.形状 == 预期形状 ), f预期 `attn_mask` 的形状为{预期形状}但是得到了{注意掩码.形状}" else: raise 断言错误( f查询应为未批处理的 2D 或批处理的 3D 张量,但收到{查询.()}-D 查询张量 ) 返回 批处理 定义 _规范掩码( 面具: 可选[张量] 面具名称: 字符串, 其他类型: 可选的[DType] 其他名称: 字符串, 目标类型: 数据类型, 检查其他: 布尔 = , ) 输入文本: -> 翻译: -> 可选[张量]: 如果 面具 : _掩码数据类型 = 面具.dtype _mask 是否为浮点数 = torch.is_floating_point(面具) 如果 _掩码数据类型 != torch.布尔 _mask 是否为浮点数: raise 断言错误( f"仅支持布尔型和浮点型"{mask_name}支持 ) 如果 检查其他 并且 其他类型 : 如果 _掩码数据类型 != 其他类型: 警告.警告( f支持不匹配{掩码名称}{其他名称} " 已弃用。请使用相同类型代替。 ) 如果 _mask 是否为浮点数: 面具 = 火把.与...相同形状的零(面具, 数据类型=目标类型).遮蔽填充( 遮罩, float(-无穷大) ) 返回 面具 定义 _无或数据类型(输入: 可选[张量]) -> 可选[数据类型] 如果 输入 : 返回 elif isinstance(输入, torch.张量): 返回 输入.dtype raise 运行时错误("_none_or_dtype()的输入必须是 None 或 torch.Tensor") 定义 检查键填充掩码( 关键填充掩码: torch.张量, 源长度: 整数, bsz: 整型 ) 输入文本: -> 翻译: -> : torch._check_with( 断言错误, 关键填充掩码.形状[0] == bsz, lambda: f预期 key_padded_mask.shape[0] 的值{bsz}, 但得到{关键填充掩码.形状[0]}", ) torch._check_with( 断言错误, 关键填充掩码.形状[1] == 源长度, lambda: f"期望 key_padded_mask.shape[1] 的值{源长度}, 但得到{key_padding_mask.shape[1]}", ) 定义 multi_head_attention_forward( 查询: 张量, : 张量, : 张量, 验证嵌入维度: 整数, 头数: 整数, 输入投影权重: 可选[张量] 输入投影偏置: 可选[张量] 偏置_k: 可选[张量] 偏置_v: 可选[张量] 添加零注意力: 布尔, dropout_p: float, 输出投影权重: 张量, 输出投影偏置: 可选[张量] 训练: 布尔 = , 关键填充掩码: 可选[张量] = , 需要的权重: 布尔 = , 注意掩码: 可选[张量] = , 使用独立项目权重: 布尔 = 错误, q_proj_weight: 可选[张量] = , k_proj_weight: 可选[张量] = , v_项目权重: 可选[张量] = , 静态_k: 可选[张量] = , 静态_v: 可选[张量] = , 平均注意力权重: 布尔 = , 因果: 布尔 = 错误, ) 输入文本: -> 翻译: -> 元组[张量, 可选[张量]] r多头注意力方法的向前方法。 .. 注意:: 请参阅此教程 了解 PyTorch 提供的用于构建自己的 Transformer 层的高效构建块深入讨论。 有关 PyTorch 提供的用于构建自己的 Transformer 层的高效构建块的深入讨论,请参阅。 Transformer 层。 请参阅:class:`torch.nn.MultiheadAttention`以获取详细信息。 参数: 查询、键、值:将查询和一组键值对映射到输出。 请参阅“Attention Is All You Need”以获取更多详细信息。 embed_dim_to_check:模型的总维度。 num_heads: 并行注意力头。 in_proj_weight, in_proj_bias: 输入投影权重和偏差。 bias_k, bias_v: 在 dim=0 处添加 key 和 value 序列的偏差。 add_zero_attn: 向 key 添加一个新的全零批次。 dim=1 的值序列。 dropout_p:将元素置零的概率。 out_proj_weight, out_proj_bias:输出投影权重和偏差。 training:如果为 True 则应用 dropout。 key_padding_mask:如果提供,指定键中的填充元素 被注意力忽略。这是一个二进制掩码。当值为真时, 相应的注意力层上的值将被填充为-inf。 需要权重:输出注意力输出权重。 默认:`True` 注意:`needs_weight` 默认为 `True`,但应设置为 `False` 当不需要注意力权重时,为了最佳性能。 *将 `needs_weights` 设置为 `True` 导致性能显著下降。 attn_mask:2D 或 3D 掩码,用于阻止对某些位置的注意力。2D 掩码将广播到所有 批处理时,3D 掩码允许为每个批次的条目指定不同的掩码。 is_causal: 如果指定,则应用因果掩码作为注意力掩码,并忽略 计算缩放点积注意力机制的 attn_mask。 默认:``False``。 .. 警告:: is_causal 提供了 attn_mask 是因果掩码的提示。 提供错误的提示可能导致执行错误,包括前向和反向传播。 包括前向和反向传播在内的执行错误。 兼容性。 use_separate_proj_weight: 该函数接受查询、键、 和值的不同形式的 proj.权重。如果为 false,则使用 in_proj_weight,它是 q_proj_weight、k_proj_weight、v_proj_weight 的组合。 q_proj_weight, k_proj_weight, v_proj_weight, in_proj_bias:输入投影权重和偏差。 static_k, static_v:用于注意力操作器的静态键和值。 average_attn_weights:如果为 true,表示返回的`attn_weights`应在头部之间平均。 否则,`attn_weights`将按头部分别提供。注意,此标志仅在此处有效 当 `need_weights=True`。默认:True 形状: 输入: - 查询::math:`(L, E)` 或 :math:`(L, N, E)`,其中 L 是目标序列长度,N 是批大小,E 是 嵌入维度。 - 键::math:`(S, E)` 或 :math:`(S, N, E)`,其中 S 是源序列长度,N 是批大小,E 是 嵌入维度。 - value: (S, E) 或 (S, N, E) 其中 S 是源序列长度,N 是批量大小,E 是 嵌入维度。 key_padding_mask: :math:`(S)` 或 :math:`(N, S)` 其中 N 是批大小,S 是源序列长度。 如果提供一个 FloatTensor,它将直接添加到值中。 如果提供一个 BoolTensor,则值为 ``True`` 的位置将被忽略,而值为 ``False`` 的位置将保持不变。 值为 ``True`` 的位置将被忽略,而值为 ``False`` 的位置将保持不变。 - attn_mask:2D 掩码:math:`(L, S)`,其中 L 为目标序列长度,S 为源序列长度。 3D 掩码:math:`(N*num_heads, L, S)`,其中 N 为批大小,L 为目标序列长度, S 为源序列长度。attn_mask 确保位置 i 可以关注未掩码的位置。 如果提供 BoolTensor,则位置与``True``相关。 在此情况下不允许参加,而 ``False`` 值将保持不变。如果提供一个浮点张量, 它将被添加到注意力权重中。 - static_k: :math:`(N*num_heads, S, E/num_heads)`,其中 S 是源序列长度, N 是批大小,E 是嵌入维度。E/num_heads 是头维度。 - 静态_v: :math:`(N*num_heads, S, E/num_heads)`,其中 S 是源序列长度, N 是批大小,E 是嵌入维度。E/num_heads 是头维度。 输出: - attn_output: :math:`(L, E)` 或 :math:`(L, N, E)` 其中 L 是目标序列长度,N 是批大小, E 是嵌入维度。 - 当`need_weights=True`时返回`attn_output_weights`。如果`average_attn_weights=True`,则返回 在输入未批处理时,头部的注意力权重平均值,形状为:math:`(L, S)`, math:`(N, L, S)`,其中:N 是批处理大小,:math:`L`是目标序列长度,:math:`S`是序列长度, `S` 是源序列长度。如果 `average_attn_weights=False`,则返回每个注意力头的注意力权重。 形状为 :math:`(num_heads, L, S)` 的注意力头,当输入未批处理时或形状为 :math:`(N, num_heads, L, S)`。 "文档" 线性代数操作 = ( 查询, , , 输入投影权重, 输入投影偏置, 偏置_k, 偏置_v, 输出投影权重, 输出投影偏置, ) 如果 有 torch 功能(线性运算): 返回 handle_torch_function( multi_head_attention_forward, 线性运算, 查询, , , 验证嵌入维度, 头数, 输入投影权重, 输入投影偏置, 偏置_k, 偏置_v, 添加零注意力, dropout_p, 输出投影权重, 输出投影偏置, 训练=训练, 关键填充掩码=关键填充掩码, 需要的权重=需要的权重, 注意掩码=注意掩码, 因果=因果, 使用独立项目权重=使用独立项目权重, q_proj_weight=q_proj_weight, k_proj_weight=k_proj_weight, v_项目权重=v_项目权重, 静态_k=静态_k, 静态_v=静态_v, 平均注意力权重=平均注意力权重, ) 批处理 = _mha_shape_check( 查询, , , 关键填充掩码, 注意掩码, 头数 ) 对于未分批输入,我们在预期的批处理维度上取消展平,以假装输入 # 批量处理,运行计算,然后返回之前挤压 # 挤压批量维度,以便输出不携带这个临时的批量维度。 如果 批处理: # 如果输入未批量处理,则展开 查询 = 查询.展平(1) key = .展平(1) = .展平(1) 如果 key_padding_mask : key_padding_mask = 关键填充掩码.展平(0) # 设置形状变量 tgt_len, bsz, 嵌入维度 = 查询.形状 源长度, _, _ = .形状 key_padding_mask = _规范掩码( 面具=关键填充掩码, 掩码名称="关键填充掩码", 其他类型=_无或数据类型(注意掩码), 其他名称="注意力掩码", 目标类型=查询.数据类型, ) 如果 是因果的 注意力掩码 : raise 运行时错误( 需要指定 is_causal 提示时,需要 attn_mask。 您可以使用 Transformer 模块方法 `generate_square_subsequent_mask` 用于创建此掩码。 ) 如果 是因果的 key_padding_mask 需要的权重: # 当我们有 kpm 或需要权重时,我们需要 attn_mask # 否则,我们使用 is_causal 提示直接作为 is_causal 指示 SDPA 注意力掩码 = else: 注意力掩码 = _规范掩码( 面具=注意掩码, 掩码名称="注意力掩码", 其他类型=, 其他名称=输入文本翻译为简体中文为:"", 目标类型=查询.数据类型, 检查其他=错误, ) 如果 key_padding_mask : 我们已经有了 attn_mask,并使用它来合并 kpm。 关闭使用 is_causal 提示,因为合并后的掩码不再具有因果性。 # 更新:由于合并后的掩码不再具有因果性,因此不再使用 is_causal 提示。 是因果的 = 断言 ( 嵌入维度 == 嵌入维度检查 ), f期待嵌入维度为{验证嵌入维度}, 但得到{嵌入维度}" 如果 isinstance(嵌入维度, 火把.张量): # embed_dim 可以是一个张量,当进行 JIT 追踪时 头维度 = 嵌入维度.除法(头数, 四舍五入模式=截断) else: 头维度 = 嵌入维度 // 头数 断言 ( 头维度 * 头数 == 嵌入维度 ), f嵌入维度{嵌入维度}不能被 num_heads 整除{头数}" 如果 使用独立项目权重: 允许在单独使用投影权重时,MHA 具有不同的嵌入维度 断言 ( .形状[2] == .形状[2] ), f"键的序列和批次维度"{.形状[2]}与值的维度不匹配{.形状[2]}" else: 断言 ( .形状 == .形状 ), f"关键形状"{.形状}值形状不匹配{.形状}" # # 在投影中计算 # 如果 使用独立项目权重: 断言 ( 投影权重 ), 使用_separate_proj_weight 为 False 但_in_proj_weight 为 None q, k, v = _in_projection_packed(查询, , , 输入投影权重, 输入投影偏置) else: 断言 ( q_proj_weight ), "use_separate_proj_weight 为 True 但 q_proj_weight 为 None" 断言 ( k_proj_weight ), "use_separate_proj_weight 为 True 但 k_proj_weight 为 None" 断言 ( v_proj_weight ), "use_separate_proj_weight 为 True 但 v_proj_weight 为 None" 如果 in_proj_bias : b_q = b_k = b_v = else: b_q, b_k, b_v = 输入投影偏置.数据块(3) q, k, v = 投影中( 查询, , , q_proj_weight, k_proj_weight, v_项目权重, b_q, b_k, b_v, ) 预处理注意力掩码 如果 注意力掩码 : 确保注意力掩码的维度为 3 如果 注意掩码.() == 2: 确保二维尺寸正确 = (tgt_len, 源长度) 如果 注意掩码.形状 != 正确的二维尺寸: raise 运行时错误( f"2D attn_mask 的形状是{注意掩码.形状},但应该是{正确的二维尺寸} ) 注意力掩码 = 注意掩码.展平(0) elif 注意掩码.() == 3: 正确的 3D 尺寸 = (批大小 * 头数, tgt_len, 源长度) 如果 注意掩码.形状 != 正确的 3D 尺寸: raise 运行时错误( f3D 注意力掩码的形状是{注意掩码.形状},但应该是{正确的 3D 尺寸} ) else: raise 运行时错误( f注意力掩码的维度{注意掩码.()}不受支持" ) # 在批处理维度上添加偏差(目前是第二个) 如果 偏差_k 偏置_v : 断言 静态键 , "偏差不能添加到静态键。" 断言 static_v , 偏差不能添加到静态值。 k = torch.[k, 偏置_k.重复(1, bsz, 1)]]) v = torch.[v, 偏置_v.重复(1, bsz, 1)]]) 如果 注意力掩码 : 注意力掩码 = 填充(注意掩码, (0, 1)) 如果 key_padding_mask : key_padding_mask = 填充(关键填充掩码, (0, 1)) else: 断言 偏差_k 断言 偏置_v # # 重新排列 q、k、v 以进行多头注意力并使它们成为批处理优先 # q = q.视图(tgt_len, 批大小 * 头数, 头维度).转置(0, 1) 如果 静态键 : k = k.视图(k.形状[0] 批大小 * 头数, 头维度).转置(0, 1) else: # TODO 完成解耦控制流,这样在传递静态变量时就不会执行内投影 断言 ( 静态_k.尺寸(0) == 批大小 * 头数 ), f预期 static_k.size(0) 的值{批大小 * 头数}, 但得到{静态_k.尺寸(0)}" 断言 ( 静态_k.尺寸(2) == 头维度 ), f预期 static_k.size() 为 2{头维度}, 但得到{静态_k.尺寸(2)}" k = 静态键 如果 static_v : v = v.视图(v.形状[0] 批大小 * 头数, 头维度).转置(0, 1) else: # TODO 完成解耦控制流,这样在传递静态变量时就不会执行内投影 断言 ( 静态_v.尺寸(0) == 批大小 * 头数 ), f预期 static_v.size(0) 的值{批大小 * 头数}, 但得到{静态_v.尺寸(0)}" 断言 ( 静态_v.尺寸(2) == 头维度 ), f预期 static_v.size(2) 为{头维度}, 但得到{静态_v.尺寸(2)}" v = static_v 在批处理维度上添加零注意力(现在为第一个) 如果 添加零注意力: 零注意力形状 = (批大小 * 头数, 1, 头维度) k = 火把.( [k, 火把.零值(zero_attn_shape 零注意力形状, 数据类型=k.数据类型, 设备=k.设备)], =1 ) v = 火把.( [v, 火把.零值(zero_attn_shape 零注意力形状, 数据类型=v.数据类型, 设备=v.设备)], =1 ) 如果 注意力掩码 : 注意力掩码 = 填充(attn_mask, (0, 1)) 如果 key_padding_mask : key_padding_mask = 填充(关键填充掩码, (0, 1)) # 更新调整后的源序列长度 源长度 = k.尺寸(1) 合并填充和注意力掩码键 如果 key_padding_mask : 如果 火把.算子.是否正在脚本化() 火把.算子.is_tracing(): 检查键填充掩码(关键填充掩码, 源长度, bsz) key_padding_mask = ( 关键填充掩码.视图(bsz, 1, 1, 源长度) .展开(-1, 头数, -1, -1) .重塑(批大小 * 头数, 1, 源长度) ) 如果 注意力掩码 : 注意力掩码 = key_padding_mask else: 注意力掩码 = 注意力掩码 + key_padding_mask 调整 dropout 概率 如果 训练: dropout 概率 = 0.0 # (深呼吸)计算注意力与输出投影 # 如果 需要的权重: _B, _Nt, E = q.形状 q_scaled = q * 数学.平方根(1.0 / float(E)) 断言 ( 是因果的 注意力掩码 ), "FIXME:is_causal 对 need_weights 未实现" 如果 注意力掩码 : attn_output_weights = torch.抱歉,您提供的文本 "baddbmm" 似乎没有明确的意义或上下文,因此无法进行准确的翻译。请提供具有明确意义的文本以便翻译( 注意掩码, q 缩放, k.转置(-2, -1) ) else: attn_output_weights = torch.bmm(q 缩放, k.转置(-2, -1)) attn_output_weights = 软式最大化(注意力输出权重, =-1) 如果 dropout 概率 > 0.0: attn_output_weights = dropout(注意力输出权重, p=dropout_p) attn_output = torch.bmm(注意力输出权重, v) attn_output = ( attn_output.转置(0, 1).连续().视图(目标长度 * bsz, 嵌入维度) ) attn_output = 线性(attn_output, 输出投影权重, 输出投影偏置) attn_output = attn_output.视图(tgt_len, bsz, attn_output.尺寸(1)) # 可选地平均头注意力权重 attn_output_weights = 注意力输出权重.视图(bsz, 头数, tgt_len, 源长度) 如果 平均注意力权重: attn_output_weights = 注意力输出权重.均值(=1) 如果 批处理: 如果输入未批处理,则压缩输出 attn_output = attn_output.挤压(1) attn_output_weights = 注意力输出权重.挤压(0) 返回 attn_output, attn_output_weights else: # attn_mask 可以是(L,S)或者(N*num_heads, L, S) # 如果 attn_mask 的形状是(1, L, S),我们需要将其展平为(1, 1, L, S) # 为了与输入的 SDPA 形状(N, num_heads, L, S)相匹配 如果 注意力掩码 : 如果 注意掩码.尺寸(0) == 1 attn_mask.() == 3: 注意力掩码 = attn_mask.展平(0) else: 注意力掩码 = attn_mask.视图(bsz, 头数, -1, 源长度) q = q.视图(bsz, 头数, tgt_len, 头维度) k = k.视图(bsz, 头数, 源长度, 头维度) v = v.视图(bsz, 头数, 源长度, 头维度) attn_output = 扩放点积注意力( q, k, v, 注意掩码, dropout_p, 是因果的 ) attn_output = ( attn_output.排列(2, 0, 1, 3).连续().视图(批大小 * tgt_len, 嵌入维度) ) attn_output = 线性(attn_output, 输出投影权重, 输出投影偏置) attn_output = attn_output.视图(tgt_len, bsz, attn_output.尺寸(1)) 如果 批处理: 如果输入未批处理,则压缩输出 attn_output = attn_output.挤压(1) 返回 attn_output,

© 版权所有 PyTorch 贡献者。

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

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源