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

torch.functional 源代码

# mypy: 允许未类型化定义
导入 itertools
导入 操作符
from collections.abc 导入 序列
from 打字 导入 任何, 可选, 类型检查, 联合

导入 火炬
导入 torch.nn.functional as F
from 火炬 导入 _VF, 张量
from torch._C 导入 添加文档字符串
from torch._jit_internal 导入 覆盖 as 过载, boolean 分派
from torch._低秩 导入 pca 低秩, svd 低秩
from torch.overrides 导入 (
    handle_torch_function,
    有 torch 功能,
    has_torch_function_unary,
    has_torch_function_variadic,
)


全部 = [
    "至少_1 天",
    "至少_2 天",
    "至少_3 天",
    "对齐张量",
    "广播形状",
    "广播张量",
    "笛卡尔积",
    "块对角矩阵",
    "cdist",
    "chain_matmul",
    "einsum",
    "istft",
    "lu",
    "norm",
    "meshgrid",
    "pca_lowrank",
    "拆分",
    "stft",
    "SVD 低秩",
    "张量点",
    "唯一",
    独特连续,
    "unravel_index",
]


[文档]def broadcast_tensors(*tensors): 广播张量(*tensors) 广播张量(*tensors) -> 张量列表 广播给定的张量,根据::ref:`广播语义`. Args: *tensors: 同类型张量的任意数量 .. warning:: 超过广播张量的一个元素可能指向单个 内存位置。因此,原地操作(尤其是那些 可能因向量化而导致行为不正确。如果您需要编写 请先克隆这些张量。 示例: >>> x = torch.arange(3).view(1, 3) >>> y = torch.arange(2).view(2, 1) >>> a, b = torch.broadcast_tensors(x, y) >>> a.size() torch.Size([2, 3]) >>> a tensor([[0, 1, 2], [0, 1, 2]]) """ # 此包装器存在以支持可变参数。 if has_torch_function(tensors): return handle_torch_function(broadcast_tensors, tensors, *tensors) return _VF.broadcast_tensors(tensors) # 忽略未定义的属性
[文档]定义 广播形状(*形状): r"""broadcast_shapes(*shapes) -> 大小 类似于 :func:`broadcast_tensors` 但用于形状。 这相当于 ``torch.broadcast_tensors(*map(torch.empty, shapes))[0].shape`` 但避免了创建中间张量的需求。这在某些情况下很有用 广播具有相同批量形状但不同最右形状的张量, 例如,将均值向量广播到协方差矩阵。 示例:: >>> torch.broadcast_shapes((2,), (3, 1), (1, 1, 1)) torch.Size([1, 3, 2]) 参数: \*shapes (torch.Size): 张量的形状。 返回值: shape (torch.Size): 与所有输入形状兼容的形状。 抛出异常: RuntimeError: 如果形状不兼容。 """ # 此包装器存在是为了支持可变参数。 一旦 jit 对 torch.Size 的支持更好,就将其移动到 C++ 如果 not 火炬.算子.is_tracing(): 最大长度 = 0 对于 形状 进入 形状: 如果 isinstance(形状, (int, 火炬.SymInt)): 如果 最大长度 < 1: 最大长度 = 1 elif isinstance(形状, (元组, 列表)): s = 长度(形状) 如果 最大长度 < s: 最大长度 = s 结果 = [1] * 最大长度 from torch.fx.experimental.symbolic_shapes 导入 ( 守护大小无关, 是否嵌套整型, ) 对于 形状 进入 形状: 如果 isinstance(形状, (int, 火炬.SymInt)): 形状 = (形状,) 如果 isinstance(形状, (元组, 列表)): 对于 i 进入 范围(-1, -1 - 长度(形状), -1): 如果 形状[i] < 0: 抛出 RuntimeError( f尝试创建具有负维度的张量({形状[i]}): ({形状[i]})" ) # NB: 处理嵌套整数特别小心,以避免在 Ne(j0, 1) 上无效的守卫。 如果 是否嵌套整型(形状[i)] # 允许广播为 (j0, 1) 或 (j0, j0); # 不允许 (j0, j1),(j0, 5) 等。 如果 是否嵌套整型(结果[i]) 守护大小无关( 形状[i] == 结果[i] ): continue 否则: # NB: 结果初始化为 1 所以这实际上是一个 # 等于一个测试 如果 守护大小无关(形状[i] == 1) 或者 守护大小无关( 形状[i] == 结果[i] ): continue 如果 结果[i] != 1: 抛出 RuntimeError( 形状不匹配:对象无法广播到单个形状 ) 结果[i] = 形状[i] 否则: 抛出 RuntimeError( 输入形状应为 int 类型、int 元组或 int 列表,却得到了, 形状, ) 返回 火炬.尺寸(结果) 否则: 在上述实现中,torch.jit.trace 会硬编码大小,这导致后续重放失败 替换为 火炬.不梯度(): 标量 = 火炬.零值((), 设备="cpu") 张量 = [标量.展开(形状) 对于 形状 进入 形状] 张量 = 广播张量(*张量) 返回 张量[0].形状
[文档]定义 分割( 张量: 张量, 分割大小或部分: 联合[int, 列表[int]], 维度: 整型 = 0, ) -> 元组[张量, ...] r将张量分割成块。每个块是原始张量的视图。 如果 `split_size_or_sections` 是一个整型,则 `tensor` 将被分割成等大小的块(如果可能)。如果沿着给定维度 `dim` 的张量大小不能被 `split_size` 整除,则最后一个块将更小。 如果沿着给定维度 `dim` 的张量大小不能被 `split_size` 整除,则最后一个块将更小。 如果沿着给定维度 `dim` 的张量大小不能被 `split_size` 整除,则最后一个块将更小。 如果沿着给定维度 `dim` 的张量大小不能被 `split_size` 整除,则最后一个块将更小。 如果 :attr:`split_size_or_sections` 是一个列表,那么 :attr:`tensor` 将会被分割 将输入文本翻译为简体中文如下: 将输入文本分为 `len(split_size_or_sections)` 个大小在 `:attr:`dim` 中的块 到:`split_size_or_sections` 属性。 参数: 张量(Tensor):要分割的张量。 单个块的大小或分块数(int)或(int 列表):单个块的大小或分块数列表 每个块的大小列表 dim(int):分割张量的维度。 示例:: >>> a = torch.arange(10).reshape(5, 2) >>> a tensor([[0, 1], [2, 3], [4, 5], [6, 7] [8, 9]] >>> torch.split(a, 2) (tensor([[0, 1], [2, 3]]), tensor([[4, 5], [6, 7]]), tensor([[8, 9]])) >>> torch.split(a, [1, 4]) (tensor([[0, 1]]), tensor([[2, 3], [4, 5], [6, 7] [8, 9] """ 如果 has_torch_function_unary(张量): 返回 handle_torch_function( 分割, (张量,), 张量, 分割大小或部分, 维度=维度 ) # 覆盖原因: # 这将根据 split_size_or_sections 的类型调用两个 ATen 函数 # 分支代码在 _tensor.py 中 #请在此处调用。 返回 张量.分割(分割大小或部分, 维度)
[文档]定义 einsum(*参数: 任何) -> 张量: r"einsum(equation, *operands) -> Tensor" 对输入 :attr:`operands` 的元素乘积沿指定维度求和。 基于爱因斯坦求和约定。 Einsum 允许通过表示来计算许多常见的多维线性代数数组操作。 以爱因斯坦求和约定为基础的简写格式,由:attr:`equation` 给出。该格式的详细信息如下,但基本思想是给输入的每个:attr:`operands` 维度标注一个下标,并定义哪些下标是输出的一部分。输出然后通过计算那些下标不属于输出的:attr:`operands` 元素沿维度的乘积之和来得到。 该格式的具体描述如下,但基本思想是给输入的每个:attr:`operands` 维度标注一个下标,并定义哪些下标是输出的一部分。 输出是通过计算那些下标不属于输出的:attr:`operands` 元素沿维度的乘积之和来得到的。 输出是通过计算那些下标不属于输出的:attr:`operands` 元素沿维度的乘积之和来得到的。 输出。例如,可以使用 einsum 计算矩阵乘法,如 `torch.einsum("ij,jk->ik", A, B)`。 其中,j 是求和下标,i 和 k 是输出下标(详见下文了解更多细节)。 公式: attr:`equation` 字符串指定了每个维度的下标(字母 `[a-zA-Z]`)。 输入:attr:`operands`,按照维度顺序排列,每个操作数的下标用逗号(',')分隔 例如,`'ij,jk'`指定了两个二维操作数的下标。具有相同下标的维度必须是可广播的,也就是说,它们的大小必须匹配或为`1`。例外情况是,如果某个下标对于同一个输入操作数重复出现,在这种情况下,对于此操作数的该下标所标记的维度 必须是可广播的,即它们的大小必须匹配或为`1`。例外情况是如果某个下标对于同一个输入操作数重复出现,在这种情况下,对于此操作数的该下标所标记的维度 必须是可广播的,即它们的大小必须匹配或为`1`。例外情况是如果某个下标对于同一个输入操作数重复出现,在这种情况下,对于此操作数的该下标所标记的维度 必须大小匹配,操作数将被其对这些维度的对角线替换。 在 :attr:`equation` 中恰好出现一次的下标将包含在输出中,并按字母顺序升序排列。 输出是通过逐元素相乘输入的 :attr:`operands`,根据下标对齐维度,然后对不包含在输出中的维度进行求和计算得到的。 输出是通过逐元素相乘输入的 :attr:`operands`,根据下标对齐维度,然后对不包含在输出中的维度进行求和计算得到的。 可选地,输出下标可以显式定义,方法是在等式末尾添加箭头('->') 然后跟输出下标。例如,以下等式计算矩阵乘法的转置:'ij,jk->ki'。输出下标必须至少在某个输入操作数中出现一次,并且在输出中最多出现一次。 矩阵乘法:'ij,jk->ki'。输出下标必须至少在某个输入操作数中出现一次,并且在输出中最多出现一次。 输出下标必须至少在某个输入操作数中出现一次,并且在输出中最多出现一次。 省略号('...')可以用作下标,以表示省略号覆盖的维度。 每个输入操作数最多只能有一个省略号,它将覆盖下标未覆盖的维度, 例如,对于一个具有 5 个维度的输入操作数,方程 `'ab...c'` 中的省略号覆盖了第三和第四维度。 省略号不需要在所有操作数上覆盖相同数量的维度,但 省略号(它们覆盖的维度大小)的 'shape' 必须一起广播。如果输出没有明确地使用箭头 ('->') 符号定义,省略号将首先出现在输出中(最左侧的维度), 在出现一次的输入操作数的下标标签之前。例如,以下方程实现了批矩阵乘法 `'...ij,...jk'`。 在出现一次的输入操作数的下标标签之前。例如,以下方程实现了批矩阵乘法 `'...ij,...jk'`。 在出现一次的输入操作数的下标标签之前。例如,以下方程实现了批矩阵乘法 `'...ij,...jk'`。 一些最后的注意事项:该方程可能在不同元素(下标、省略号等)之间包含空格 箭头和逗号)但类似于 `'. . .'` 的格式是无效的。对于标量操作数,空字符串 `''` 是有效的。 .. 注意:: torch.einsum 处理省略号('...')的方式与 NumPy 不同,因为它允许维度 被省略号覆盖以进行求和,即省略号不需要成为输出的一部分。 .. 注意:: 请安装 opt-einsum(https://optimized-einsum.readthedocs.io/en/stable/)以便加入更高效的 einstein 求和操作。 您可以在安装 torch 时安装它,如下所示:`pip install torch[opt-einsum]`,或者单独安装。 使用`pip install opt-einsum`进行安装。 如果 opt-einsum 可用,此函数将自动加速计算并/或减少内存消耗。 通过通过我们的 opt_einsum 后端优化收缩顺序:mod:`torch.backends.opt_einsum`(_与-之间的区别,我知道,很令人困惑)。当至少有三个输入时,才会发生这种优化,因为顺序并不重要 注意,找到`最优`路径是一个 NP 难题,因此,opt-einsum 依赖于不同的启发式方法来获得近似最优结果。如果 opt-einsum 不可用,则默认的顺序是收缩 。请注意,找到`最优`路径是一个 NP 难题,因此,opt-einsum 依赖于不同的启发式方法来获得近似最优结果。如果 opt-einsum 不可用,则默认的顺序是收缩 。如果 opt-einsum 不可用,则默认的顺序是收缩 从左到右。 要绕过此默认行为,请添加以下内容以禁用 opt_einsum 并跳过路径计算: ``torch.backends.opt_einsum.enabled = False`` 要指定 opt_einsum 计算收缩路径的策略,请添加以下行: ``torch.backends.opt_einsum.strategy = 'auto'`` 默认策略为 'auto',同时我们也支持 'greedy' 和 'optimal'。 注意,'optimal' 的运行时间与输入数量呈阶乘关系!更多详情请参阅 opt_einsum 文档(https://optimized-einsum.readthedocs.io/en/stable/path_finding.html)。 截至 PyTorch 1.10,:func:`torch.einsum` 也支持子列表格式(以下有示例)。在此格式中, .. 注意:: 有关详细信息,请参阅 PyTorch 1.10 的 :func:`torch.einsum` 文档。 每个操作数的下标由子列表指定,子列表是范围在[0, 52)内的整数列表。这些子列表 跟随其操作数,并且输入末尾可以额外出现一个子列表来指定输出的下标,例如`torch.einsum(op1, sublist1, op2, sublist2, ..., [subslist_out])`。Python 的`Ellipsis`对象 可以在子列表中提供,以启用如上方程部分所述的广播。 提供在子列表中,以启用如上方程部分所述的广播。 参数: 方程(字符串):爱因斯坦求和的子脚标。 操作数(张量列表):计算爱因斯坦求和的张量。 示例: >>> # xdoctest: +IGNORE_WANT("非确定性") >>> # 跟踪 >>> torch.einsum('ii', torch.randn(4, 4)) 张量(-1.2104) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> # 对角线 >>> torch.einsum('ii->i', torch.randn(4, 4)) 张量([-0.1034, 0.7952, -0.2433, 0.4545]) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> # 外积 >>> x = torch.randn(5) >>> y = torch.randn(4) >>> torch.einsum('i,j->ij', x, y) tensor([[ 0.1156, -0.2897, -0.3918, 0.4963], [-0.3744, 0.9381, 1.2685, -1.6070], [ 0.7208, -1.8058, -2.4419, 3.0936], [ 0.1713, -0.4291, -0.5802, 0.7350], [0.5704, -1.4290, -1.9323, 2.4480]]) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> # 批量矩阵乘法 >>> As = torch.randn(3, 2, 5) >>> Bs = torch.randn(3, 5, 4) >>> torch.einsum('bij,bjk->bik', As, Bs) tensor([[[[-1.0564, -1.5904, 3.2023, 3.1271], [[-1.6706, -0.8097, -0.8025, -2.1183]] [[4.2239, 0.3107, -0.5756, -0.2354]] [[-1.4558, -0.3460, 1.5087, -0.8530]] [[2.8153, 1.8787, -4.3839, -1.2112]] [[0.3728, -2.1131, 0.0921, 0.8305]]]) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> # 使用子列表格式和省略号 >>> torch.einsum(As, [..., 0, 1], Bs, [..., 1, 2], [..., 0, 2]) tensor([[[[-1.0564, -1.5904, 3.2023, 3.1271], [[-1.6706, -0.8097, -0.8025, -2.1183]] [[4.2239, 0.3107, -0.5756, -0.2354]] [[-1.4558, -0.3460, 1.5087, -0.8530]] [[2.8153, 1.8787, -4.3839, -1.2112]] [[0.3728, -2.1131, 0.0921, 0.8305]]]) >>> # 批量排列 >>> A = torch.randn(2, 3, 4, 5) >>> torch.einsum('...ij->...ji', A).shape torch.Size([2, 3, 5, 4]) >>> 等价于 torch.nn.functional.bilinear >>> A = torch.randn(3, 5, 4) >>> l = torch.randn(2, 5) >>> r = torch.randn(2, 4) >>> torch.einsum('bn,anm,bm->ba', l, A, r) tensor([[-0.3430, -5.2405, 0.4494], [ 0.3311, 5.5201, -3.0356]]) """ 导入 torch.backends.opt_einsum as opt_einsum # 此包装器存在是为了支持可变参数。 如果 长度(参数) < 2: 抛出 值错误( "einsum():必须指定方程字符串和至少一个操作数," "至少一个操作数及其下标列表" ) 方程 = 操作数 = 如果 isinstance(参数[0] 火炬.张量): # 将操作数及其下标列表的交错格式转换为下标列表格式 # 列表,末尾可选输出子脚标列表(更多详细信息请参阅文档) 将方程字符串格式化为从下标列表创建方程字符串并分组 将输入操作数放入一个 tensorlist(Tensor 列表)中。 定义 解析下标(n: int) -> str: 如果 n == 省略号: 返回 "..." 如果 n 0 n < 26: 返回 chr(ord("A") + n) 如果 n 26 n < 52: 返回 chr(ord("一个") + n - 26) 抛出 值错误( "einsum(): 索引列表中的索引不在有效范围 [0, 52) 内" ) # 解析输入操作数的下标 方程 = ",".连接(输入文本翻译为简体中文为:"".连接(解析下标(s) 对于 s 进入 l) 对于 l 进入 参数[1::2]) 解析可选的输出下标(当参数数量为奇数时提供) 如果 长度(参数) % 2 == 1: 方程 += "→" + 输入文本翻译为简体中文为:"".连接(解析下标(s) 对于 s 进入 参数[-1]) 操作数 = 参数[-1:2] 否则: 操作数 = 参数[::2] 否则: 方程 = 参数[0] 操作数 = 参数[1] 如果 有 torch 功能(操作数): 返回 handle_torch_function(einsum, 操作数, 方程, *操作数) 如果 长度(操作数) == 1 isinstance(操作数[0] (列表, 元组)): # 将操作数作为单个列表参数传递的旧接口 _操作数 = 操作数[0] # 递归,如果操作数包含具有 torch 函数的值 # 在原始实现中,此行被省略 返回 einsum(方程, *操作数) 如果 长度(操作数) <= 2 或者 not OptEinsum.启用: 合同路径优化已进行 0 或 1 次 或者用户已禁用使用 opt_einsum 返回 _VF.einsum(方程, 操作数) # 类型:忽略[已定义] 路径 = 如果 OptEinsum.是否可用(): _opt_einsum = OptEinsum.get_opt_einsum() tupled_path = _opt_einsum.contract_path( 方程, *操作数, 优化=OptEinsum.策略 )]0] # 分发到 C++的扁平路径 路径 = [*itertools.chain.from_iterable(tupled_path)] 返回 _VF.einsum(方程, 操作数, 路径=路径) # type: ignore[attr-defined]
# 此包装器存在是为了支持可变参数。 如果 类型检查: JIT 不理解联合类型,因此只为 mypy 添加类型注解。 定义 网格( *张量: 联合[张量, 列表[张量]], 索引: 可选[str] = ) -> 元组[张量, ...] 返回 网格(*张量, 索引=索引) 否则:
[文档] 定义 网格(*张量, 索引: 可选[str] = ) -> 元组[张量, ...] r生成由`attr`:tensors 中的 1D 输入指定的坐标网格。 这在您想可视化某些数据时非常有用。 输入范围。以下为绘图示例。 给定 :math:`N` 个 1D 张量 :math:`T_0 \ldots T_{N-1}` 作为 输入,对应的大小为 :math:`S_0 \ldots S_{N-1}`, 这将创建 :math:`N` 个 N 维张量 :math:`G_0 \ldots \( G_{N-1} \),每个的形状为:\( (S_0, ..., S_{N-1}) \) 输出 \( G_i \) 通过展开 \( T_i \) 构建。 将结果扩展到结果形状。 .. 注意:: 0 维输入等效于 1 维输入。 单个元素。 ..警告: `torch.meshgrid(*tensors)` 目前具有相同的行为 作为调用 `numpy.meshgrid(*arrays, indexing='ij')`。 未来 `torch.meshgrid` 将过渡到 默认为 `indexing='xy'`。 请参阅 https://github.com/pytorch/pytorch/issues/50276 跟踪。 本问题旨在迁移到 NumPy 的行为。 参考文献也请参阅。 `torch.cartesian_prod` 具有相同的效果,但它 收集数据到一个向量张量中。 参数: 张量(Tensor 列表):标量或一维张量的列表。标量将被 自动视为大小为 :math:`(1,)` 的张量处理。 索引模式:(str, 可选): 索引模式,可以是 "xy" 或 "ij",默认为 "ij"。有关未来更改的警告请参阅。 或者 "ij",默认为 "ij"。有关未来更改的警告请参阅。 如果选择 "xy",则第一个维度对应第二个输入的基数,第二个维度对应第三个输入的基数。 维度对应第三个输入的基数。 维度对应于第一个的基数 输入 如果选择“ij”,维度相同 输入的基数作为顺序。 返回值: seq (序列):如果输入有 :math:`N` 张量大小为:`S_0 ... S_{N-1}`,然后 输出也将包含:`N` 个张量,其中每个张量 是形状:`(S_0, ..., S_{N-1})`。 示例:: >>> x = torch.tensor([1, 2, 3]) >>> y = torch.tensor([4, 5, 6]) 观察网格中的逐元素配对,(1, 4), (1, 5),...,(3,6)。这与笛卡尔积相同。 这是同一件事。 >>> grid_x, grid_y = torch.meshgrid(x, y, indexing='ij') >>> grid_x tensor([[1, 1, 1], [2, 2, 2], [[3, 3, 3]] >>> grid_y tensor([[4, 5, 6], [[4, 5, 6]] [4, 5, 6]]] 当这些网格正确堆叠时,这种对应关系可以观察到。 堆叠得当。 >>> torch.equal(torch.cat(tuple(torch.dstack([grid_x, grid_y]))), torch.cartesian_prod(x, y) 的笛卡尔积 True `torch.meshgrid` 通常用于生成网格 用于绘图。 >>> # xdoctest: +REQUIRES(module:matplotlib) >>> # xdoctest: +REQUIRES(env:DOCTEST_SHOW) >>> 导入 matplotlib.pyplot 库 >>> xs = torch.linspace(-5, 5, steps=100) >>> ys = torch.linspace(-5, 5, steps=100) >>> x, y = torch.meshgrid(xs, ys, indexing='xy') >>> z = torch.sin(torch.sqrt(x * x + y * y)) >>> ax = plt.axes(projection='3d') >>> ax.plot_surface(x.numpy(), y.numpy(), z.numpy()) >>> plt.show() .. 图片:: ../_static/img/meshgrid.png 宽度: 512 """ 返回 网格(*张量, 索引=索引)
定义 网格(*张量, 索引: 可选[str)] 如果 有 torch 功能(张量): 返回 handle_torch_function(网格, 张量, *张量, 索引=索引) 如果 长度(张量) == 1 isinstance(张量[0] (列表, 元组)): # 将操作数作为单个列表参数传递的旧接口 张量 = 张量[0] # 类型:忽略[赋值] # 继续允许调用不带索引的老方法 # 为向前兼容添加参数 # # 在发布两周后删除此内容 kwargs = {} 如果 索引 否则 {索引: 索引} 返回 _VF.网格(张量, **关键字参数) # 类型:忽略[已定义]
[文档]定义 stft( 输入: 张量, n_fft: int, 跳长: 可选[int] = , 窗长: 可选[int] = , 窗口: 可选[张量] = , 中心: 布尔值 = True, 填充模式: 字符串 = 反射, 标准化: 布尔值 = False, 单向的: 可选[bool] = , 返回复杂: 可选[bool] = , 与窗口对齐: 可选[bool] = , ) -> 张量: r短时傅里叶变换(STFT)。 ..警告: 从版本 1.8.0 开始,:attr:`return_complex`必须始终提供 专门用于真实输入,且`return_complex=False`已被 已弃用。强烈建议使用 `return_complex=True`,如未来版本中所示 PyTorch 发布,此函数将仅返回复杂数组。 请注意::func:`torch.view_as_real` 可以用于恢复实数 张量具有一个额外的最后一个维度,用于实部和虚部。 ..警告:: 从版本 2.1 开始,如果未指定 :attr:`window`,将提供警告。在未来版本中,此属性将是必需的。 如果未指定窗口,从版本 2.1 开始将提供警告。在未来版本中,此属性将成为必需项。 当前不提供窗口默认使用矩形窗口, 这可能会导致不希望出现的伪影。请考虑使用锥形窗口, 例如::func:`torch.hann_window`。 STFT 计算短重叠窗口的傅里叶变换 输入. 这提供信号随时间变化的频率分量 时间。此功能界面模仿了(但并非*直接替换*) 替代 librosa_ stft 函数。 https://librosa.org/doc/latest/generated/librosa.stft.html 忽略可选的批量维度,此方法计算以下 表达式: .. math:: X[ω, m] = ∑_{k = 0}^{win_length-1}% window[k] input[m × hop_length + k]% \exp\left(- j \frac{2 \pi \cdot \omega k}{n_fft}\right), 其中 :math:`m` 是滑动窗口的索引,而 :math:`\omega` 是 频率:$0 \leq \omega < \text{n\_fft}$ 对于 `onesided=False` 或 $0 \leq \omega < \lfloor \text{n\_fft} / 2 \rfloor + 1$ 对于 `onesided=True` * :attr:`input` 必须是 1-D 时间序列或 2-D 时间序列批 如果 :attr:`hop_length` 为 ``None``(默认),则视为等于 ``floor(n_fft / 4)``。 如果 :attr:`win_length` 为 ``None``(默认),则视为等于 attr:`n_fft`。 * :attr:`window` 可以是一个大小为 :attr:`win_length` 的 1-D 张量,例如从 torch.hann_window。如果 :attr:`window` 是 ``None``(默认),则是 被视为窗口中到处都有:数学公式`1`。如果 `win_length < n_fft` 时,:attr:`window` 将被填充 在应用之前,对两边的长度进行:attr:`n_fft`。 如果:attr:`center` 为 ``True``(默认),则:attr:`input` 将被填充。 以便第:math:`t` 个帧在时间:math:`t \times \text{hop\_length}` 处居中。 否则,第:math:`t` 个帧。 开始时间为::math:`t \times \text{hop\_length}`。 * :attr:`pad_mode` 决定了在 :attr:`input` 上使用的填充方法。 attr:`center` 为 ``True``。请参阅 :meth:`torch.nn.functional.pad` 了解所有可用选项。 默认为 ``"reflect"``。 如果 :attr:`onesided` 为 ``True``(实数输入的默认值),则只返回 math:`\omega` 在 :math:`\left[0, 1, 2, \dots, \left\lfloor \frac{\text{n\_fft}}{2} \right\rfloor + 1\right]` 范围内的值,因为 实数到复数的傅里叶变换满足共轭对称性, 即,:math:`X[m, \omega] = X[m, \text{n\_fft} - \omega]^*`. 注意,如果输入或窗口张量是复数,则 :attr:`onesided` 输出不可行。 * 如果 :attr:`normalized` 为 ``True``(默认为 ``False``),则函数 返回归一化的 STFT 结果,即乘以 :math:`(frame\_length)^{-0.5}`。 * 如果 :attr:`return_complex` 为 ``True``(如果输入是复数则为默认值),则返回 是 ``input.dim() + 1`` 维的复数张量。如果 ``False``,则 输出是一个 ``input.dim() + 2`` 维的实数张量,其中最后一个 维度表示实部和虚部。 返回一个大小为 :math:`(* \times N \times T)` 的复杂张量 :attr:`return_complex` 为 true,或一个大小为 :math:`(* \times N` 的实张量 \( \times T \times 2) \)。其中,:math:`*` 是可选的批量大小。 输入::attr:`input`, :math:`N` 是应用短时傅里叶变换的频率数量 翻译:输入::attr:`input`,:math:`N` 是应用短时傅里叶变换的频率数 并且:`T` 是使用的总帧数。 ..警告: 此函数在版本 0.4.1 中更改了签名。调用时使用 前一个签名可能引起错误或返回不正确的结果。 参数: 输入(张量):形状为 `(B?, L)` 的输入张量,其中 `B?` 是可选的批处理维度 批处理维度 n_fft(整数):傅里叶变换的大小 hop_length(整数,可选):相邻滑动窗口之间的距离 帧数。默认值:``None``(视为等于 ``floor(n_fft / 4)``) 窗口长度(int,可选):窗口帧和 STFT 滤波器的大小。 默认值:``None``(视为等于 :attr:`n_fft`) 窗口(Tensor,可选):可选的窗口函数。 形状必须是 1 维且 `<= n_fft` 默认:`None`(视为全部为 1 秒的窗口) center(布尔值,可选):是否在`input`的两侧进行填充 以使得第`t`个帧在时间`t × hop_length`处居中。 默认:``True`` pad_mode(字符串,可选):控制填充方法 attr:`center` 为 ``True``。默认:``"reflect"`` normalized(布尔值,可选):控制是否返回归一化的 STFT 结果 默认:``False`` onesided(布尔值,可选):控制是否返回结果的一半 避免对真实输入的冗余 默认:对于真实 :attr:`input` 和 :attr:`window`,为 ``True``,否则为 ``False`` 返回复数张量(bool,可选):是否返回复数张量,或 带有额外最后一个维度的实数张量。 用于实部和虚部。 .. 版本变更:: 2.0 ``return_complex`` 现在对于真实输入是必须的参数, 因为默认值正在过渡到 ``True``。 .. 已弃用:: 2.0 ``return_complex=False`` 已弃用,请使用 ``return_complex=True`` 代替 注意调用 :func:`torch.view_as_real` 对输出进行操作 可以恢复已弃用的输出格式。 返回值: 张量:包含 STFT 结果的张量,形状为`(B?, N, T, C?)`,其中 - `B?` 是从输入中可选的批处理维度。 `- N 是频率样本的数量,对于 n_fft // 2 + 1` `onesided=True`,否则为 `n_fft`。 `- T 是帧数,对于 center=True,为 1 + L // hop_length` `,否则为 1 + (L - n_fft) // hop_length`。 - `C?` 是一个可选的长度为 2 的实部和虚部维度 组件,当 `return_complex=False` 时存在。 """ 如果 has_torch_function_unary(输入): 返回 handle_torch_function( stft, (输入,), 输入, n_fft, 跳长=跳长, 窗长=窗长, 窗口=窗口, 中心=中心, 填充模式=填充模式, 标准化=标准化, 单向的=单向的, 返回复杂=返回复杂, 与窗口对齐=与窗口对齐, ) 如果 中心 窗口对齐 not : 抛出 RuntimeError( "STFT 窗口对齐仅在 center 为 false 时设置" ) # NOTE: Do not edit. This code will be removed once the forward-compatibility # period is over for PR #73432 如果 中心: 信号维度 = 输入.维度() 扩展形状 = [1] * (3 - 信号维度) + 列表(输入.尺寸()) 填充 = int(FFT 长度 // 2) 输入 = F.填充(输入.视图(扩展形状), [填充, 填充] 填充模式) 输入 = 输入.视图(输入.形状[-信号维度]) 返回 _VF.stft( # 类型:忽略[已定义] 输入, n_fft, 跳长, 窗长, 窗口, 标准化, 单向的, 返回复杂, 与窗口对齐, )
双谱(Inverse Short-Time Fourier Transform) = _添加文档字符串( 火炬.短时傅里叶变换, istft(input, n_fft, 跳长=None, 窗长=None, 窗口=None, center=True, ) normalized=False, onesided=None, length=None, return_complex=False) -> 张量:输入文本翻译为简体中文为:\n" r"" 逆短时傅里叶变换。这应该与 :func:`~torch.stft` 的逆运算相对应。 .. 警告:: 从版本 2.1 开始,如果未指定 :attr:`window`,将提供警告。在未来版本中,此属性将是必需的。 如果未指定窗口,从版本 2.1 开始将提供警告。在未来版本中,此属性将成为必需项。 请提供与 stft 调用中使用的相同窗口。 它具有相同的参数(+可选参数:attr:`length`)并且应该返回 原始信号的平方最小二乘估计。算法将使用 NOLA 条件( 非零重叠)进行检查。 重要参数:attr:`窗口`和:attr:`中心`的考虑,以确保所有窗口的求和在某个时间点永远不会为零。 具体来说,求和:math:`\sum_{t=-\infty}^{\infty} |w|^2[n-t\times hop\_length] \cancel{=} 0`。 由于:func:`~torch.stft`在信号末尾元素无法适应帧时将丢弃这些元素,因此, 信号帧的长度为:func:`~torch.stft`的长度。 ``istft`` 可能返回比原始信号更短的信号(如果 :attr:`center` 为 False 的话可能会发生) 由于信号没有填充)。如果 `length` 在参数中给出并且比预期更长, ``istft`` 将会在返回的信号末尾填充零。 如果 :attr:`center` 为 ``True``,则会有填充,例如 ``'constant'``、``'reflect'`` 等。 左侧填充可以精确地被移除,因为它们可以计算出来,但右侧填充不能,因为没有额外的信息可以计算。 可以计算出来,无需额外信息。 例如:假设最后一个窗口是: ``[17, 18, 0, 0, 0]`` 与 ``[18, 0, 0, 0, 0]`` `:attr:`n_fft`、:attr:`hop_length`、:attr:`win_length` 都相同,这阻止了计算 右侧填充。这些额外值可以是零或信号的反射,因此提供 `:attr:`length` 可能很有用。如果 :attr:`length` 是 `None`,则将积极移除填充 (信号有一定损失)。 [1] D. W. Griffin 和 J. S. Lim, "从修改后的短时傅里叶变换中估计信号," IEEE 信号处理汇刊,第 32 卷,第 2 期,第 236-243 页,1984 年 4 月。 参数: 输入(张量):输入张量。期望格式为 :func:`~torch.stft`, 输出。这是一个形状为 `(B?, N, T)` 的复数张量, - `B?` 是可选的批量维度 - `N` 是频率样本的数量,`(n_fft // 2) + 1` 对于单边输入,否则 `n_fft` - `T` 是帧数,对于中心化 STFT,为 `1 + length // hop_length` 或 `1 + (长度 - n_fft) // 跳长` 否则。 .. 版本变更:: 2.0 实数数据类型输入不再受支持。输入必须现在具有 复数数据类型,如 ``stft(..., return_complex=True)`` 返回的。 n_fft (int): 傅里叶变换的大小 hop_length (Optional[int]): 相邻滑动窗口帧之间的距离。 (Default: ``n_fft // 4``) win_length (Optional[int]): 窗口帧的大小和 STFT 滤波器。 (Default: ``n_fft``) 窗口(Optional[torch.Tensor]):可选的窗口函数。 形状必须是 1 维且 `<= n_fft` (默认:``torch.ones(win_length)``) center(布尔值):是否对:attr:`input` 进行了两侧填充,以便使:math:`t`-th 帧的 中心位于时间:`t × hop_length`。 (默认:`True`) 标准化(布尔值):STFT 是否进行了标准化。(默认:`False`) 单边(可选[布尔值]):STFT 是否为单边。 (默认情况下,如果输入大小中的 `n_fft` 不等于 `fft_size`,则为 `True`) 长度(可选[int]):通过信号的数量(即,) 原始信号长度)。默认为`(T - 1) * hop_length`。 居中对齐 STFT,或`n_fft + (T - 1) * hop_length`,其中`T` 输入帧的数量。 return_complex(可选[bool]): 输出是否应为复数,或者输入是否应 假设来自实信号和窗口。 注意这与 `onesided=True` 不兼容。 (默认:`False`) 返回: 张量:原始信号的平方最小二乘估计,形状为 `(B?, length)`。 `B?` 是输入张量中的一个可选批处理维度。 """, ) 如果 类型检查: 这些 _impl 函数返回可变数量的张量作为输出, # __torch_function__; 已经完成了元组拆包,而不是进行 # 由 _impl 函数的调用者完成 _unique_impl_out = 任何 否则: _unique_impl_out = 元组[张量, 张量, 张量] 定义 _唯一实现( 输入: 张量, 排序: 布尔值 = True, 返回反向: 布尔值 = False, 返回计数: 布尔值 = False, 维度: 可选[int] = , ) -> _unique_impl_out: runique(input, sorted=True, return_inverse=False, return_counts=False, dim=None) -> tuple[Tensor, Tensor, Tensor] 返回输入张量中的唯一元素。 .. note:: 此函数与 :func:`torch.unique_consecutive` 不同之处在于 此函数还会消除非连续重复值。 .. 注意:: 目前在 CUDA 实现和 CPU 实现中, `torch.unique` 总是在开始时对张量进行排序,无论 `sort` 参数如何。 排序可能会很慢,因此如果您的输入张量已经排序,建议使用 func:`torch.unique_consecutive`,它避免了排序。 参数: 输入(张量):输入张量 排序(布尔值):是否按升序排序唯一元素 在返回输出之前。 返回_inverse(布尔值):是否还返回索引,表示 原始输入中的元素最终出现在返回的唯一列表中。 return_counts (bool): 是否同时返回每个唯一元素的计数 element. dim (int, 可选): 要操作的维度。如果 ``None``,则表示使用当前维度。 返回展平输入的唯一值。否则,返回每个值。 张量按给定维度索引被视为一个 要应用唯一操作的元素。请参阅示例以获取更多信息 详细信息。默认值:``None`` 返回值: (Tensor, Tensor (可选), Tensor (可选)): 包含张量或张量元组的张量 - **输出** (*Tensor*): 唯一标量元素的输出列表 - **inverse_indices** (*Tensor*): (可选) 如果 attr:`return_inverse` 为 True,则将有一个额外的 返回与输入相同形状的索引张量 表示原始输入中的元素映射到输出中的位置; 否则,此函数将仅返回一个张量。 - **counts** (*张量*):可选的,如果 当 `return_counts` 为 True 时,将返回一个额外的 张量(与输出或 output.size(dim) 相同的形状, 如果指定了 dim)表示每个唯一值或张量的出现次数 示例:: >>> output = torch.unique(torch.tensor([1, 3, 2, 3], dtype=torch.long)) >>> output tensor([1, 2, 3]) >>> 输出,逆索引 = torch.unique( ... torch.tensor([1, 3, 2, 3], dtype=torch.long), sorted=True, return_inverse=True) >>> output tensor([1, 2, 3]) >>> inverse_indices tensor([0, 2, 1, 2]) >>> 输出,逆索引 = torch.unique( ... torch.tensor([[1, 3], [2, 3]], dtype=torch.long), sorted=True, return_inverse=True) >>> output tensor([1, 2, 3]) >>> inverse_indices tensor([[0, 2], [[1, 2]]] >>> a = torch.tensor([ ... [ ... [1, 1, 0, 0], ... [1, 1, 0, 0], ... [0, 0, 1, 1], ... ], ... [ [0, 0, 1, 1] [0, 0, 1, 1] [1, 1, 1, 1] ] ... ...[1, 1, 0, 0] ...[1, 1, 0, 0] ...[0, 0, 1, 1] ... ... >>> 如果我们调用 `torch.unique(a, dim=0)`,每个张量 `a[idx, :, :]` 都将被比较。我们可以看到 `a[0, :, :]` 和 `a[2, :, :]` 是匹配的 >>> 将会进行比较。我们可以看到 `a[0, :, :]` 和 `a[2, :, :]` 匹配 >>> # 每个都会被删除,所以其中一个将被移除。 >>> (a[0, :, :] == a[2, :, :]).all() tensor(True) >>> a_unique_dim0 = torch.unique(a, dim=0) >>> a_unique_dim0 tensor([[[0, 0, 1, 1], [0, 0, 1, 1], [1, 1, 1, 1]], [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1]] >>> # 注意哪些子张量从 `a` 与子张量从 >>> # `a_unique_dim0`: >>> (a_unique_dim0[0, :, :] == a[1, :, :]).all() tensor(True) >>> (a_unique_dim0[1, :, :] == a[0, :, :]).all() tensor(True) >>> 对于 `torch.unique(a, dim=1)`,每个张量 `a[:, idx, :]` 都会被比较。 >>> `a[:, 0, :]` 和 `a[:, 1, :]` 相匹配,所以其中一个将被移除。 >>> >>> (a[:, 0, :] == a[:, 1, :]).all() tensor(True) >>> torch.unique(a, dim=1) tensor([[[0, 0, 1, 1], [[1, 1, 0, 0]] [[1, 1, 1, 1]] [[0, 0, 1, 1]] [[0, 0, 1, 1]] [1, 1, 0, 0]]]) 对于 `torch.unique(a, dim=2)`,张量 `a[:, :, idx]` 进行比较。 `a[:, :, 0]` 和 `a[:, :, 1]` 相匹配。同时,`a[:, :, 2]` 和 >>> `a[:, :, 3]`彼此匹配得也很好。所以在这种情况下,两个中的 >>> # 将移除子张量。 >>> (a[:, :, 0] == a[:, :, 1]).all() tensor(True) >>> (a[:, :, 2] == a[:, :, 3]).all() tensor(True) >>> torch.unique(a, dim=2) tensor([[[0, 1], [0, 1], [1, 0] [[1, 0]] [1, 0] [1, 1] [[0, 1]] [[0, 1]] [[1, 0]] """ 如果 has_torch_function_unary(输入): 返回 handle_torch_function( 独特, (输入,), 输入, 排序=排序, 返回反向=返回反向, 返回计数=返回计数, 维度=维度, ) 如果 维度 not : 输出, 反向索引, 计数 = _VF.独特维度( 输入, 维度, 排序=排序, 返回反向=返回反向, 返回计数=返回计数, ) 否则: 输出, 反向索引, 计数 = 火炬._unique2( 输入, 排序=排序, 返回反向=返回反向, 返回计数=返回计数, ) 返回 输出, 反向索引, 计数 定义 _唯一连续实现( 输入: 张量, 返回反向: 布尔值 = False, 返回计数: 布尔值 = False, 维度: 可选[int] = , ) -> 唯一实现输出: r消除每个连续等效元素组中除第一个元素之外的所有元素。 .. 注意:: 此函数与 :func:`torch.unique` 在意义上有所不同 仅消除连续重复的值。此语义类似于 `std::unique` 在 C++中 参数: 输入(张量):输入张量 return_inverse (bool): 是否同时返回原始输入中元素在返回的唯一列表中的索引 elements in the original input ended up in the returned unique list. return_counts (bool): 是否同时返回每个唯一元素的计数 element. dim (int): 应用唯一的维度。如果为 ``None``,则返回展平输入的唯一值。默认:``None`` default: ``None`` 返回值: (Tensor, Tensor (可选), Tensor (可选)): 包含张量或张量元组的张量 - **输出** (*Tensor*): 唯一标量元素的输出列表 - **inverse_indices** (*Tensor*): (可选) 如果 attr:`return_inverse` 为 True,则将有一个额外的 返回与输入相同形状的索引张量 表示原始输入中的元素映射到输出中的位置; 否则,此函数将仅返回一个张量。 - **counts** (*张量*):可选的,如果 当 `return_counts` 为 True 时,将返回一个额外的 张量(与输出或 output.size(dim) 相同的形状, 如果指定了 dim)表示每个唯一值或张量的出现次数 示例:: >>> x = torch.tensor([1, 1, 2, 2, 3, 1, 1, 2]) >>> output = torch.unique_consecutive(x) >>> output tensor([1, 2, 3, 1, 2]) >>> output, inverse_indices = torch.unique_consecutive(x, return_inverse=True) >>> output tensor([1, 2, 3, 1, 2]) >>> inverse_indices tensor([0, 0, 1, 1, 2, 3, 3, 4]) >>> output, counts = torch.unique_consecutive(x, return_counts=True) >>> output tensor([1, 2, 3, 1, 2]) >>> 计数 tensor([2, 2, 1, 2, 1]) """ 如果 has_torch_function_unary(输入): 返回 handle_torch_function( 唯一连续, (输入,), 输入, 返回反向=返回反向, 返回计数=返回计数, 维度=维度, ) 输出, 反向索引, 计数 = _VF.唯一连续( # 类型:忽略[已定义] 输入, 返回反向=返回反向, 返回计数=返回计数, 维度=维度 ) 返回 输出, 反向索引, 计数 定义 返回计数( 输入, 排序=True, 返回反向=False, 返回计数=False, 维度=, ): (Tensor, bool, bool, bool, Optional[int]) -> tuple[Tensor, Tensor] 如果 has_torch_function_unary(输入): 返回 _唯一实现(输入, 排序, 返回反向, 返回计数, 维度) 输出, _, 计数 = _唯一实现(输入, 排序, 返回反向, 返回计数, 维度) 返回 输出, 计数 定义 _返回输出( 输入, 排序=True, 返回反向=False, 返回计数=False, 维度=, ): # 类型: (张量, 布尔值, 布尔值, 布尔值, 可选[int]) -> 张量 如果 has_torch_function_unary(输入): 返回 _唯一实现(输入, 排序, 返回反向, 返回计数, 维度) 输出, _, _ = _唯一实现(输入, 排序, 返回反向, 返回计数, 维度) 返回 输出 定义 返回逆序( 输入, 排序=True, 返回反向=False, 返回计数=False, 维度=, ): (Tensor, bool, bool, bool, Optional[int]) -> tuple[Tensor, Tensor] 如果 has_torch_function_unary(输入): 返回 _唯一实现(输入, 排序, 返回反向, 返回计数, 维度) 输出, 反向索引, _ = _唯一实现( 输入, 排序, 返回反向, 返回计数, 维度 ) 返回 输出, 反向索引 _返回逆序为假 = 布尔分发( 参数名称="返回计数", 索引参数=3, 默认=False, 如果为真=返回计数, 如果为假=_返回输出, 模块名称=__name__, 函数名="唯一", ) 返回逆序真 = 布尔分发( 参数名称="返回计数", 索引参数=3, 默认=False, 如果为真=_唯一实现, 如果为假=返回逆序, 模块名称=__name__, 函数名="唯一", ) # unique 的返回类型取决于`return_inverse`和`return_counts`,因此为了 # 在 TorchScript 中解决输出类型,我们需要静态地知道这两个参数的值 唯一的 = 布尔分发( 参数名称=返回逆序, 索引参数=2, 默认=False, 如果为真=_返回逆序为真, 如果为假=_return_inverse_false, 模块名称=__name__, 函数名="唯一", ) 独特.__文档__ = _唯一实现.__文档__ 定义 _连续返回计数( 输入, 返回反向=False, 返回计数=False, 维度=, ): # 类型: (Tensor, bool, bool, Optional[int]) -> tuple[Tensor, Tensor] 如果 has_torch_function_unary(输入): 返回 _唯一连续实现(输入, 返回反向, 返回计数, 维度) 输出, _, 计数 = _唯一连续实现( 输入, 返回反向, 返回计数, 维度 ) 返回 输出, 计数 定义 连续返回输出( 输入, 返回反向=False, 返回计数=False, 维度=, ): (张量,布尔值,布尔值,可选[int]) -> 张量 如果 has_torch_function_unary(输入): 返回 _唯一连续实现(输入, 返回反向, 返回计数, 维度) 输出, _, _ = _唯一连续实现(输入, 返回反向, 返回计数, 维度) 返回 输出 定义 _连续返回倒数( 输入, 返回反向=False, 返回计数=False, 维度=, ): # 类型: (Tensor, bool, bool, Optional[int]) -> tuple[Tensor, Tensor] 如果 has_torch_function_unary(输入): 返回 _唯一连续实现(输入, 返回反向, 返回计数, 维度) 输出, 反向索引, _ = _唯一连续实现( 输入, 返回反向, 返回计数, 维度 ) 返回 输出, 反向索引 连续返回逆序为假 = 布尔分发( 参数名称="返回计数", 索引参数=1, 默认=False, 如果为真=_连续返回计数, 如果为假=连续返回输出, 模块名称=__name__, 函数名=独特连续, ) _连续返回逆真 = 布尔分发( 参数名称="返回计数", 索引参数=1, 默认=False, 如果为真=_唯一连续实现, 如果为假=_连续返回倒数, 模块名称=__name__, 函数名=独特连续, ) # unique 的返回类型取决于`return_inverse`和`return_counts`,因此为了 # 在 TorchScript 中解决输出类型,我们需要静态地知道这两个参数的值 独一无二连续 = 布尔分发( 参数名称=返回逆序, 索引参数=2, 默认=False, 如果为真=_连续返回逆真, 如果为假=_连续返回逆序为假, 模块名称=__name__, 函数名=独特连续, ) 唯一连续.__文档__ = _唯一连续实现.__文档__ 如果 类型检查: 通过 没有好的方法使用这种类型注解而不破坏即时编译(JIT) 因此,为了 mypy 现在留为未类型化 否则: @overload 定义 tensordot( a, b, 维数: 整型 = 2, : 可选[火炬.张量] = , ): 通过 @overload 定义 tensordot( # noqa: F811 a, b, 维数: 元组[列表[int] 列表[int]], : 可选[火炬.张量] = , ): 通过 @overload 定义 tensordot( # noqa: F811 a, b, 维数: 列表[列表[int]], : 可选[火炬.张量] = , ): 通过 @overload 定义 tensordot( # noqa: F811 a, b, 维数: 火炬.张量, : 可选[火炬.张量] = , ): 通过
[文档]定义 tensordot( # noqa: F811 a, b, 维数=2, : 可选[火炬.张量] = , ): r在多个维度上返回 a 和 b 的收缩 attr:`tensordot` 实现了广义矩阵乘法。 参数: a (张量): 要收缩的左张量 b (张量): 要收缩的右张量 dims(int 或包含两个列表或列表的元组或列表列表的 Tensor):维度数 合约或显式列表维度用于:attr:`a`和 attr:`b`分别 当使用非负整数参数:attr:`dims` = :math:`d`时, a 和 b 的维度数分别为 m 和 n, 分别,:func:`~torch.tensordot` 函数计算 .. math:: r_{i_0,...,i_{m-d}, i_d,...,i_n} = \sum_{k_0,...,k_{d-1}} a_{i_0,...,i_{m-d},k_0,...,k_{d-1}} \times b_{k_0,...,k_{d-1}, i_d,...,i_n}. 当以列表形式的 :attr:`dims` 调用时,将给出的大小将替代 :attr:`a` 的最后 :math:`d` 个和 :attr:`b` 的前 :math:`d` 个。 在这些维度中大小必须匹配,但 :func:`~torch.tensordot` 将处理广播。 这些维度中大小必须匹配,但 :func:`~torch.tensordot` 将处理广播。 尺寸。 示例: >>> a = torch.arange(60.).reshape(3, 4, 5) >>> b = torch.arange(24.).reshape(4, 3, 2) >>> torch.tensordot(a, b, dims=([1, 0], [0, 1])) tensor([[4400., 4730.], [4532., 4874.], [4664., 5018.], [4796., 5162.] [4928., 5306.] >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_CUDA) >>> a = torch.randn(3, 4, 5, device='cuda') >>> b = torch.randn(4, 5, 6, device='cuda') >>> c = torch.tensordot(a, b, dims=2).cpu() tensor([[ 8.3504, -2.5436, 6.2922, 2.7556, -1.0732, 3.2741], [ 3.3161, 0.0704, 5.0187, -0.4079, -4.3126, 4.8744], [0.8223, 3.9445, 3.2168, -0.2400, 3.4117, 1.7780]] >>> a = torch.randn(3, 5, 4, 6) >>> b = torch.randn(6, 4, 5, 3) >>> torch.tensordot(a, b, dims=([2, 1, 3], [1, 2, 0])) tensor([[ 7.7193, -2.4867, -10.3204], [ 1.5513, -14.4737, -6.5113], [ -0.2850, 4.2573, -3.5997]]) """ 如果 has_torch_function_variadic(a, b): 返回 handle_torch_function(tensordot, (a, b), a, b, 维数=维数, =) 如果 isinstance(维数, (元组, 列表, 火炬.张量, int, 火炬.SymInt)): 抛出 RuntimeError( "tensordot 期望维度为 int 或" + "tuple[列表[int], 列表[int]]或" + "包含两个列表的 list[list[int]],但得到" + f"dims="{维数}" ) 次元_a: 列表[int] = 输入文本为空,请提供需要翻译的文本 次元_b: 列表[int] = 输入文本为空,请提供需要翻译的文本 如果 isinstance(维数, (元组, 列表)): 次元_a, 模块_b = dims 如果 isinstance(维数, 火炬.张量): 元素数量 = 维数.元素数量() 如果 元素数量 > 1: 断言 维数.尺寸()[0] == 2 dims_a = 火炬.算子.标注(列表[int] 维数[0].转列表()) 模块_b = 火炬.算子.标注(列表[int] 维数[1].转列表()) 否则: dims_val = int(维数.项目()) 如果 dims_val < 0: 抛出 RuntimeError(f"tensordot 期望 dims >= 0,但得到 dims="{维数}") dims_a = 列表(范围(-dims_val, 0)) dims_b = 列表(范围(dims_val)) 如果 isinstance(维数, (int, 火炬.SymInt)): 如果 dims < 0: 抛出 RuntimeError(f"tensordot 期望 dims >= 0,但得到 dims="{维数}") 如果 dims > 最小值(a.维度(), b.维度()): 抛出 运行时错误( ftensordot 期望维度小于 ndim_a 或 ndim_b,但得到了维度={维数}" ) dims_a = 列表(范围(-维数, 0)) 模块_b = 列表(范围(维数)) 如果 外部 : 返回 _VF.tensordot(a, b, 次元_a, 次元_b) # 类型:忽略[已定义] 否则: 返回 _VF.tensordot(a, b, 次元_a, 次元_b, 输出=) # type: ignore[attr-defined]
[docs]def 笛卡尔积(*tensors: Tensor) -> Tensor: """对给定的张量序列进行笛卡尔积。其行为类似于 Python 的`itertools.product`。 Args: *张量:任意数量的 1 维张量。 返回: 张量:将所有输入张量转换为列表的等价张量, 然后对这些列表执行 `itertools.product`,最后将结果列表转换为 转换为张量。 示例:: >>> 导入 itertools >>> a = [1, 2, 3] >>> b = [4, 5] >>> list(itertools.product(a, b)) [(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)] >>> tensor_a = torch.tensor(a) >>> tensor_b = torch.tensor(b) >>> torch.cartesian_prod(tensor_a, tensor_b) tensor([[1, 4], [1, 5], [2, 4] [2, 5] [3, 4] [3, 5] """ # 此包装器存在以支持可变参数。 if has_torch_function(tensors): return handle_torch_function(cartesian_prod, tensors, *tensors) return _VF.cartesian_prod(tensors) # 忽略未定义的属性
[文档]def block_diag(*tensors): 创建由提供的张量组成的分块对角矩阵。 Args: 张量:一个或多个具有 0、1 或 2 维度的张量。 返回: 张量:一个二维张量,其中所有输入张量按顺序排列 按顺序排列,使它们的左上角和右下角 对角相邻。其他所有元素设置为 0。 示例:: >>> 导入 torch >>> A = torch.tensor([[0, 1], [1, 0]]) >>> B = torch.tensor([[3, 4, 5], [6, 7, 8]]) >>> C = torch.tensor(7) >>> D = torch.tensor([1, 2, 3]) >>> E = torch.tensor([[4], [5], [6]]) >>> torch.block_diag(A, B, C, D, E) tensor([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 3, 4, 5, 0, 0, 0, 0, 0], [0, 0, 6, 7, 8, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 7, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1, 2, 3, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 4] [0, 0, 0, 0, 0, 0, 0, 0, 0, 5] [0, 0, 0, 0, 0, 0, 0, 0, 0, 6] "" # This wrapper exists to support variadic args. if has_torch_function(tensors): return handle_torch_function(block_diag, tensors, *tensors) return torch._C._VariableFunctions.block_diag(tensors) # type: ignore[attr-defined]
[文档]定义 cdist(x1, x2, p=2.0, 计算模式="如有必要,使用 mm 计算欧几里得距离"): # 类型:(Tensor, Tensor, float, str) -> (Tensor) r"计算两个行向量集合中每对之间的 p 范数距离。" 参数: x1 (Tensor):形状为 :math:`B \times P \times M` 的输入张量。 x2 (Tensor):输入张量,形状为 :math:`B \times R \times M`。 p:计算每个向量对之间的 p-范数距离的 p 值 math:`\in [0, \infty]`。 compute_mode: '当需要时使用矩阵乘法计算欧几里得距离(p = 2)如果 P > 25 或 R > 25' 欧几里得距离(p = 2) '始终使用矩阵乘法计算欧几里得距离(p = 2)' 欧几里得距离(p = 2) 不使用 mm 计算欧几里得距离 欧几里得距离(p = 2) 默认:如果需要,则使用毫米计算欧几里得距离。 如果 x1 的形状为 :math:`B \times P \times M`,而 x2 的形状为 :math:`B \times R \times M`,那么: 输出将具有形状:`B × P × R`。 此函数等价于 `scipy.spatial.distance.cdist(input,'minkowski', p=p)`。 当 :math:`p ∈ (0, ∞)` 时。当 :math:`p = 0` 时,它等价于 `scipy.spatial.distance.cdist(input, 'hamming') * M`。当 :math:`p = ∞` 时,最近的 scipy 函数是`scipy.spatial.distance.cdist(xn, lambda x, y: np.abs(x - y).max())`。 示例: >>> a = torch.tensor([[0.9041, 0.0196], [-0.3108, -2.4423], [-0.4821, 1.059]]) >>> a tensor([[ 0.9041, 0.0196], [-0.3108, -2.4423] [-0.4821, 1.0590] >>> b = torch.tensor([[-2.1763, -0.4713], [-0.6986, 1.3702]]) >>> b tensor([[-2.1763, -0.4713], [-0.6986, 1.3702]]) >>> torch.cdist(a, b, p=2) tensor([[3.1193, 2.0959], [2.7138, 3.8322] [2.2830, 0.3791] """ 如果 has_torch_function_variadic(x1, x2): 返回 handle_torch_function( cdist, (x1, x2), x1, x2, p=p, 计算模式=计算模式 ) 如果 计算模式 == "如有必要,使用 mm 计算欧几里得距离": 返回 _VF.cdist(x1, x2, p, ) # 类型:忽略[已定义] elif 计算模式 == 使用 mm 计算欧几里得距离: 返回 _VF.cdist(x1, x2, p, 1) # 类型:忽略[已定义] elif 计算模式 == 不使用 mm 计算欧几里得距离: 返回 _VF.cdist(x1, x2, p, 2) # 类型:忽略[已定义] 否则: 抛出 值错误(f"{计算模式}"compute_mode"不是一个有效的值)
[文档]def 至少_1d(*tensors): r""" 返回每个输入张量的 1 维视图,其中零维为 0。 输入张量如果有一维或多维,则按原样返回。 Args: 输入 (Tensor 或 Tensor 列表) 返回: 输出 (Tensor 或 Tensor 元组) 示例:: >>> x = torch.arange(2) >>> x tensor([0, 1]) >>> torch.atleast_1d(x) tensor([0, 1]) >>> x = torch.tensor(1.) >>> x tensor(1.) >>> torch.atleast_1d(x) tensor([1.]) >>> x = torch.tensor(0.5) >>> y = torch.tensor(1.) >>> torch.atleast_1d((x, y)) (tensor([0.5000]), tensor([1.])) """ # This wrapper exists to support variadic args. 如果有 torch_function(tensors): 返回 handle_torch_function(atleast_1d, tensors, *tensors) 如果 tensors 的长度等于 1: tensors = tensors[0] return _VF.atleast_1d(tensors) # type: ignore[attr-defined]
[文档]def 至少_2d(*tensors): r""" 返回每个输入张量的二维视图,零维度的张量保持不变。 输入张量如果有两个或更多维度,则直接返回。 Args: 输入 (Tensor 或 Tensor 列表) 返回: 输出 (Tensor 或 Tensor 元组) 示例:: >>> x = torch.tensor(1.) >>> x tensor(1.) >>> torch.atleast_2d(x) >>> tensor([[1.]]) >>> x = torch.arange(4).view(2, 2) >>> x tensor([[0, 1], [2, 3]]) >>> torch.atleast_2d(x) tensor([[0, 1], [2, 3]] >>> x = torch.tensor(0.5) >>> y = torch.tensor(1.) >>> torch.atleast_2d((x, y)) (tensor([[0.5000]]), tensor([[1.]])) """ # 此包装器存在以支持可变参数。 if has_torch_function(tensors): return handle_torch_function(atleast_2d, tensors, *tensors) if len(tensors) == 1: tensors = tensors[0] return _VF.atleast_2d(tensors) # type: ignore[attr-defined]
[文档]def 至少_3d(*tensors): r""" 返回每个输入张量的 3 维视图,零维不变。 输入张量具有三个或更多维度时,将按原样返回。 Args: 输入 (Tensor 或 Tensor 列表) 返回: 输出 (Tensor 或 Tensor 元组) 示例: >>> x = torch.tensor(0.5) >>> x tensor(0.5000) >>> torch.atleast_3d(x) tensor([[[0.5000]]]) >>> y = torch.arange(4).view(2, 2) >>> y tensor([[0, 1], ]) [2, 3]]) >>> torch.atleast_3d(y) tensor([[[0], ]) [1]] 空白行 [2] [3]]]) >>> x = torch.tensor(1).view(1, 1, 1) >>> x tensor([[[1]]]) >>> torch.atleast_3d(x) tensor([[[1]]]) >>> x = torch.tensor(0.5) >>> y = torch.tensor(1.0) >>> torch.atleast_3d((x, y)) (tensor([[[0.5000]]]), tensor([[[1.]]])) """ # 此包装器存在以支持可变参数。 if has_torch_function(tensors): return handle_torch_function(atleast_3d, tensors, *tensors) if len(tensors) == 1: tensors = tensors[0] return _VF.atleast_3d(tensors) # type: ignore[attr-defined]
如果
类型检查: 通过 没有好的方法使用这个类型注解;无法将 norm()重命名为 # _norm_impl() 的实现方式不会破坏 JIT 重载。所以保持未类型化 # 目前用于 mypy。 # def norm(输入: Tensor, # p: 可选[Union[str, Number]] = "fro", # dim: 可选[Union[int, List[int]]] = None, # keepdim: bool = False, # out: 可选[Tensor] = None, # 数据类型:_dtype = None) -> 张量: # 返回 _norm_impl(input, p, dim, keepdim, out, dtype) 否则: # TODO:当 https://github.com/pytorch/pytorch/issues/33782 问题解决后,将 dim 类型更改为 BroadcastingList # https://github.com/pytorch/pytorch/issues/33782 修复后 @overload 定义 归一化( 输入, p=拉丁, 维度=, 保持维度=False, =, 数据类型=, ): (Tensor, str, Optional[List[int]], bool, Optional[Tensor], Optional[int]) -> Tensor 通过 @overload 定义 归一化( # noqa: F811 输入, p=拉丁, 维度=, 保持维度=False, =, 数据类型=, ): (Tensor, 可选[number], 可选[List[int]], bool, 可选[Tensor], 可选[int]) -> Tensor 通过 @overload 定义 归一化( # noqa: F811 输入, p=拉丁, 维度=, 保持维度=False, =, 数据类型=, ): (Tensor, 可选[number], 可选[int], bool, 可选[Tensor], 可选[int]) -> Tensor 通过 @overload 定义 归一化( # noqa: F811 输入, p=拉丁, 维度=, 保持维度=False, =, 数据类型=, ): (Tensor, str, 可选[int], bool, 可选[Tensor], 可选[int]) -> Tensor 通过
[文档]定义 归一化( # noqa: F811 输入, p: 可选[联合[float, str]] = 拉丁, 维度=, 保持维度=False, =, 数据类型=, ): r"返回给定张量的矩阵范数或向量范数。" ..警告:: torch.norm 已弃用,可能在未来的 PyTorch 版本中删除。 其文档和行为可能不正确,并且它已不再积极维护。 请使用 :func:`torch.linalg.vector_norm` 来计算向量范数,使用 :func:`torch.linalg.matrix_norm` 来计算矩阵范数。 当计算向量范数时使用 :func:`torch.linalg.vector_norm`,当计算矩阵范数时使用 :func:`torch.linalg.matrix_norm`。 请使用 :func:`torch.linalg.vector_norm` 来计算向量范数,使用 :func:`torch.linalg.matrix_norm` 来计算矩阵范数。 对于具有与此类似行为的函数,请参阅::func:`torch.linalg.norm`。 然而,这些函数的签名与 `torch.norm` 的签名略有不同。 输入(张量):输入张量。其数据类型必须是浮点型或复数类型。对于复数输入,范数计算使用的是 ... 参数: 输入(张量):输入张量。它的数据类型必须是浮点型或复数类型。对于复数输入,范数计算使用的是 ... 输入(张量):输入张量。它的数据类型必须是浮点型或复数类型。对于复数输入,范数计算使用的是 ... 每个元素的绝对值。如果输入是复数且既不是 :attr:`dtype` 或 :attr:`out` 未指定,结果的数据类型将 对应浮点类型(例如,如果 `:attr:`input` 是 复杂浮点数。 p (int, float, inf, -inf, 'fro', 'nuc', 可选): 范数的阶。默认:``'fro'`` 可以计算以下范数: ====== ============== ========================== ord 矩阵范数 向量范数 ====== ============== ========================== 'fro' Frobenius 范数 -- 核范数 -- 数量 -- sum(abs(x)**ord)**(1./ord) ====== ============== ========================== 向量范数可以在任意维度上计算。 对应的维度被展平为 :attr:`input` 的维度。 一维,范数是在展平后计算的 维度。 弗罗贝尼乌斯范数在所有情况下都产生与 ``p=2`` 相同的结果 除非 :attr:`dim` 是三个或更多维度的列表,在这种情况下 的情况下,弗罗贝尼乌斯范数会抛出错误。 核范数只能计算在恰好两个维度上。 dim (int, int 元组,int 列表,可选): 指定要计算范数的 :attr:`input` 的哪个维度或哪些维度。 如果 :attr:`dim` 为 ``None``,则范数将在 :attr:`input` 的所有维度上计算。如果范数 是在所有维度上计算的,则 ... 由 :attr:`p` 指示的类型不支持指定的维度数量,将发生错误。 维度,将发生错误。 keepdim(布尔值,可选):输出张量是否保留 :attr:`dim` 维度。如果 :attr:`dim` = ``None``,则忽略。 。如果 :attr:`dim` = ``None``,则忽略。 `out` = `None`. 默认:`False` out (Tensor, 可选):输出张量。如果忽略 `dim` = `None` 且 `out` = `None` dtype (:class:`torch.dtype`, 可选):期望的数据类型为 返回张量。如果指定,输入张量将被转换为 在执行操作时指定 `dtype`。默认:无。 .. 注意:: 尽管 `p='fro'` 支持任意数量的维度,但真正的 数学定义的 Frobenius 范数仅适用于张量 精确到两个维度。:func:`torch.linalg.matrix_norm` 使用 ``ord='fro'`` 与数学定义一致,因为它只能应用于 精确到两个维度。 示例:: >>> 导入 torch >>> a = torch.arange(9, dtype= torch.float) - 4 >>> b = a.reshape((3, 3)) >>> torch.norm(a) tensor(7.7460) >>> torch.norm(b) tensor(7.7460) >>> torch.norm(a, float('inf')) tensor(4.) >>> torch.norm(b, float('inf')) tensor(4.) >>> c = torch.tensor([[ 1, 2, 3], [-1, 1, 4]] , dtype=torch.float) >>> torch.norm(c, dim=0) tensor([1.4142, 2.2361, 5.0000]) >>> torch.norm(c, dim=1) tensor([3.7417, 4.2426]) >>> torch.norm(c, p=1, dim=1) tensor([6., 6.]) >>> d = torch.arange(8, dtype=torch.float).reshape(2, 2, 2) >>> torch.norm(d, dim=(1, 2)) tensor([ 3.7417, 11.2250]) >>> torch.norm(d[0, :, :]), torch.norm(d[1, :, :]) (张量(3.7417), 张量(11.2250)) """ 如果 has_torch_function_unary(输入): 返回 handle_torch_function( 归一化, (输入,), 输入, p=p, 维度=维度, 保持维度=保持维度, =, 数据类型=dtype ) # 注意。所有重复的代码和奇怪的 Python 都是为了取悦 TorchScript。 # 对于更紧凑的实现,请参阅 `_refs/__init__.py` 中的相关函数 # 我们不对 MPS 或稀疏张量这样做 如果 输入.布局 == 火炬.稀疏的 输入.设备.类型 ( "cpu", cuda, 元数据, 火炬.工具.后端注册._私有用途 1 后端名称, ): 如果 维度 : 如果 isinstance(维度, (int, 火炬.SymInt)): _dim = [维度] 否则: _dim = 维度 否则: _dim = # 类型:忽略[赋值] 如果 isinstance(p, str): 如果 p == fro ( 维度 或者 isinstance(维度, (int, 火炬.SymInt)) 或者 长度(维度) <= 2 ): 如果 外部 : 返回 火炬.线性代数.向量范数( 输入, 2, 模糊, 保持维度, 数据类型=dtype ) 否则: 返回 火炬.线性代数.向量范数( 输入, 2, 模糊, 保持维度, 数据类型=数据类型, =外部 ) # 我们可以称之为核范数,或者带有某些参数的矩阵范数 # 这将引发错误 如果 _dim : _dim = 列表(范围(输入.维数)) 如果 外部 : 返回 火炬.线性代数.矩阵范数(输入, p, 模糊, 保持维度, 数据类型=数据类型) 否则: 返回 火炬.线性代数.矩阵范数( 输入, p, 模糊, 保持维度, 数据类型=数据类型, =外部 ) 否则: # 注意:p 应该是 Union[str, number] 类型,而不是 Optional! _p = 2.0 如果 p 否则 p 如果 外部 : 返回 火炬.线性代数.向量范数(输入, _p, 模糊, 保持维度, 数据类型=数据类型) 否则: 返回 火炬.线性代数.向量范数( 输入, _p, 模糊, 保持维度, 数据类型=数据类型, =外部 ) 维数 = 输入.维度() # 捕获默认情况 如果 维度 外部 dtype p : 如果 isinstance(p, str): 如果 p == 拉丁: 返回 _VF.Frobenius 范数(输入, 维度=(), 保持维度=保持维度) 如果 isinstance(p, str): _dim = 列表(范围(维数)) 返回 _VF.归一化(输入, p, 维度=模糊, 保持维度=保持维度) # 类型:忽略[已定义] # TODO: 当 https://github.com/pytorch/pytorch/issues/33782 被修复时 # 将 dim 为整数的重载移除,替换为 BraodcastingList1 # 并删除下四行,将 _dim 替换为 dim 如果 维度 : 如果 isinstance(维度, (int, 火炬.SymInt)): _dim = [维度] 否则: _dim = 维度 否则: _dim = # 类型:忽略[赋值] 如果 isinstance(p, str): 如果 p == 拉丁: 如果 dtype : 抛出 值错误("dtype 参数不支持在 Frobenius 范数中") 如果 _dim : _dim = 列表(范围(维数)) 如果 外部 : 返回 _VF.Frobenius 范数(输入, 模糊, 保持维度=保持维度) # type: ignore[arg-type] 否则: 返回 _VF.Frobenius 范数(输入, 模糊, 保持维度=保持维度, =) # type: ignore[arg-type] elif p == : 如果 dtype : 抛出 值错误("核范数中不支持 dtype 参数") 如果 _dim : 如果 外部 : 返回 _VF.核范数(输入, 保持维度=保持维度) # type: ignore[arg-type] 否则: 返回 _VF.核范数(输入, 保持维度=保持维度, =) # type: ignore[arg-type] 否则: 如果 外部 : 返回 _VF.核范数(输入, 模糊, 保持维度=保持维度) # type: ignore[arg-type] 否则: 返回 _VF.核范数(输入, 模糊, 保持维度=保持维度, =) # type: ignore[arg-type] 抛出 RuntimeError(f"仅有效的字符串值是 'fro' 和 'nuc'"{p}") 否则: 如果 _dim : _dim = 列表(范围(维数)) 如果 外部 : 如果 dtype : 返回 _VF.归一化(输入, p, 模糊, 保持维度=保持维度) # 类型:忽略[已定义] 否则: 返回 _VF.归一化(输入, p, 模糊, 保持维度=保持维度, 数据类型=数据类型) # 类型:忽略[已定义] 否则: 如果 dtype : 返回 _VF.归一化(输入, p, 模糊, 保持维度=保持维度, =) # 类型:忽略[已定义] 否则: 返回 _VF.归一化(输入, p, 模糊, 保持维度=保持维度, 数据类型=数据类型, =) # type: ignore[attr-defined]
[文档]定义 unravel_index( 索引: 张量, 形状: 联合[int, 序列[int] 火炬.尺寸] ) -> 元组[张量, ...] r将一个扁平索引的张量转换为坐标张量的元组 指定形状的任意张量的索引。 参数: 索引(Tensor):一个整数张量,包含对形状的索引。 任意形状为 :attr:`shape` 的张量的扁平版本。 所有元素必须在范围 ``[0, prod(shape) - 1]`` 内。 形状(int、int 序列或 torch.Size):任意张量的形状。所有元素必须为非负。 张量。所有元素必须为非负。 返回值: 张量元组的 Tensors:输出中的每个``i``-th 张量对应于:attr:`shape`的维度``i``。每个张量具有与形状相同的形状。 每个张量具有与形状相同的形状。 ``indices`` 包含每个维度 ``i`` 的一个索引。 由 ``indices`` 给出的平面索引。 示例:: >>> 导入 torch >>> torch.unravel_index(torch.tensor(4), (3, 2)) (tensor(2), tensor(0) >>> torch.unravel_index(torch.tensor([4, 1]), (3, 2)) (tensor([2, 0]), tensor([0, 1]) >>> torch.unravel_index(torch.tensor([0, 1, 2, 3, 4, 5]), (3, 2)) (tensor([0, 0, 1, 1, 2, 2]), tensor([0, 1, 0, 1, 0, 1])) >>> torch.unravel_index(torch.tensor([1234, 5678]), (10, 10, 10, 10)) (张量([1, 5]), 张量([2, 6]), tensor([3, 7]) tensor([4, 8]) >>> torch.unravel_index(torch.tensor([[1234], [5678]]), (10, 10, 10, 10)) (tensor([[1], [5]]), tensor([[2], [6]]) tensor([[3], [7]]) tensor([[4], [8]]) >>> torch.unravel_index(torch.tensor([[1234], [5678]]), (100, 100)) (tensor([[12], [56]])) tensor([[34], [78]])) """ 如果 has_torch_function_unary(索引): 返回 handle_torch_function(unravel_index, (索引,), 索引, 形状=形状) 累积张量 = _unravel_index(索引, 形状) 返回 累积张量.解绑(-1)
定义 _unravel_index(索引: 张量, 形状: 联合[int, 序列[int]]) -> 张量: 火炬._检查类型( 索引.是复杂的() 索引.is_floating_point() 索引.dtype == 火炬.bool, lambda: f"期望 'indices' 为整型数据类型,但得到{索引.数据类型}", ) 火炬._检查类型( isinstance(形状, (int, 火炬.SymInt, 序列)), lambda: f"预期 'shape' 是 int 或 int 序列,但得到了"{类型(形状)}", ) 如果 isinstance(形状, (int, 火炬.SymInt)): 形状 = 火炬.尺寸[形状]) 否则: 对于 维度 形状: 火炬._检查类型( isinstance(维度, (int, 火炬.SymInt)), lambda: f预期 'shape' 序列只应包含整数,但得到了{类型(维度)}", ) 形状 = 火炬.尺寸(形状) 火炬.检查值( 所有(维度 0 对于 维度 形状), lambda: f"形状不能有负值,但得到了"{元组(形状)}", ) 系数 = 列表( 反转( 列表( itertools.累加( 反转(形状[1] + 火炬.尺寸[1])), 函数=操作符. ) ) ) ) 返回 索引.展平(-1).向下取整除( 火炬.张量(系数, 设备=索引.设备, 数据类型=火炬.int64) ) % 火炬.张量(形状, 设备=索引.设备, 数据类型=火炬.int64)
[文档]def chain_matmul(*matrices, out=None): 返回 `N` 个二维张量的矩阵乘积。此乘积计算效率高。 使用矩阵链序算法,该算法选择最低成本的顺序 算术运算(`[CLRS]`_)的函数,注意由于这是一个计算乘积的函数,:math:`N` 需要大于等于 2;如果等于 2,则返回一个平凡的矩阵-矩阵乘积。 如果:math:`N`是 1,则这是一个无操作 - 原始矩阵按原样返回。 .. 警告:: `torch.chain_matmul` 已弃用,将在未来的 PyTorch 版本中删除。 请使用 :func:`torch.linalg.multi_dot` 代替,它接受一个包含两个或更多张量的列表 而不是多个参数。 参数: 矩阵(张量...):要确定乘积的 2 个或更多 2-D 张量序列。 out(张量,可选):输出张量。如果:attr:`out` = ``None``,则忽略。 返回: 张量:如果第:math:`i^{th}` 张量的维度为:math:`p_{i} \times p_{i + 1}`,则乘积 将会是维度为 :math:`p_{1} \times p_{N + 1}` 的。 示例:: >>> # xdoctest: +SKIP >>> # xdoctest: +IGNORE_WANT("非确定性的") >>> a = torch.randn(3, 4) >>> b = torch.randn(4, 5) >>> c = torch.randn(5, 6) >>> d = torch.randn(6, 7) # 将引发弃用警告 >>> torch.chain_matmul(a, b, c, d) tensor([[ -2.3375, -3.9790, -4.1119, -6.6577, 9.5609, -11.5095, -3.2614], [ 21.4038, 3.3378, -8.4982, -5.2457, -10.2561, -2.4684, 2.7163], [[-0.9647, -5.8917, -2.3213, -5.2284, 12.8615, -12.2816, -2.5095]]) .. 参考文献请见[CLRS](https://mitpress.mit.edu/books/introduction-algorithms-third-edition) """ # 此包装器存在是为了支持可变参数。 如果有 torch_function(matrices): 返回 handle_torch_function(chain_matmul, matrices, *matrices) 如果 out 为 None: 返回_VF.chain_matmul(matrices) # type: ignore[attr-defined] else: 返回 _VF.chain_matmul(matrices, out=out) # 忽略属性定义错误
定义
_lu_impl(A, 轴心=True, 获取信息=False, =): # 类型: (Tensor, bool, bool, Any) -> tuple[Tensor, Tensor, Tensor] r计算矩阵或矩阵批次的 LU 分解 返回包含矩阵 :attr:`A` 的 LU 分解和 交换因子的元组。如果 :attr:`pivot` 设置为 ``True``,则进行交换。 ..警告:: `:func:`torch.lu` 已弃用,推荐使用 :func:`torch.linalg.lu_factor`。 and :func:`torch.linalg.lu_factor_ex`。:func:`torch.lu` 将在下一个版本中删除。 未来 PyTorch 版本。 `LU, 旋转,信息 = torch.lu(A, 计算旋转)` .. 代码块 :: python LU, pivots = torch.linalg.lu_factor(A, compute_pivots) ``LU, pivots, info = torch.lu(A, compute_pivots, get_infos=True)`` 应该替换为 .. 代码块 :: python LU 分解,pivot,信息 = torch.linalg.lu_factor_ex(A, compute_pivots) .. 注意:: * 每个矩阵返回的置换矩阵表示为一个大小为 ``min(A.shape[-2], A.shape[-1])`` 的 1 索引向量。 ``pivots[i] == j`` 表示在算法的第 i 步中, 算法中第 i 步的 pivot[i]等于 j。 第 i 行与第 j-1 行进行了置换。 当 :attr:`pivot` = ``False`` 时,不可用 LU 分解,尝试这样做将引发错误。 对于 CPU,并且尝试这样做将会抛出错误。然而, 当 :attr:`pivot` = ``False`` 时,LU 分解是可用的。 CUDA. 此函数不检查分解是否成功 或如果不:attr:`get_infos` 是 ``True``,则状态为 分解存在于返回元组的第三个元素中。 在大小小于或等于的平方矩阵批次的情况下 将 32 个在 CUDA 设备上,LU 分解被重复进行 由于 MAGMA 库中的错误,导致单矩阵 (参见熔岩问题 13)。 使用 :func:`torch.lu_unpack` 可以导出 ``L``、``U`` 和 ``P``。 ..警告:: 当 :attr:`A` 是满秩时,该函数的梯度才会是有限的。 这是因为 LU 分解仅在满秩矩阵处可微。 此外,如果 :attr:`A` 接近非满秩,则 梯度将数值不稳定,因为它依赖于 :math:`L^{-1}` 和 :math:`U^{-1}` 的计算。 参数: A(张量):要分解的尺寸为 :math:`(*, m, n)` 的张量。 pivot(布尔值,可选):控制是否进行置换。默认:``True``。 get_infos(布尔值,可选):如果设置为 ``True``,则返回一个信息 IntTensor。 默认:``False`` 输出(元组,可选):可选输出元组。如果 :attr:`get_infos` 是 ``True``, 则元组中的元素是 Tensor,IntTensor, 和 IntTensor。如果 :attr:`get_infos` 是 ``False``,则 元组中的元素为 Tensor,IntTensor。默认值:``None`` 返回值: (Tensor, IntTensor, IntTensor(可选)):包含张量的元组 - **分解** (*Tensor*):大小为 :math:`(*, m, n)` 的分解 - **主元** (*IntTensor*):大小为 :math:`(*, \text{min}(m, n))` 的主元 ``pivots`` 存储所有行的中间转置。 最终排列 ``perm`` 可以通过 应用 ``swap(perm[i], perm[pivots[i] - 1])`` 对于 ``i = 0, ..., pivots.size(-1) - 1`` 来重建, 其中 ``perm`` 初始为 :math:`m` 个元素的恒等排列 这实际上就是 :func:`torch.lu_unpack` 函数所做的事情。 - **infos** (*IntTensor*, *可选*): 如果 :attr:`get_infos` 是 ``True``,则这是一个张量, 大小为 :math:`(*)`,其中非零值表示矩阵或每个小批量因式分解是否成功。 失败。 示例:: >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_LAPACK) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> A = torch.randn(2, 3, 3) >>> A_LU, pivots = torch.lu(A) >>> A_LU tensor([[[ 1.3506, 2.5558, -0.0816], [ 0.1684, 1.1551, 0.1940], [ 0.1193, 0.6189, -0.5497]], [[0.4526, 1.2526, -0.3285]] [[-0.7988, 0.7175, -0.9701]] [[0.2634, -0.9255, -0.3459]] >>> 旋转轴 tensor([[ 3, 3, 3], [ 3, 3, 3]], dtype=torch.int32) >>> A_LU, pivots, info = torch.lu(A, get_infos=True) >>> 如果 info.nonzero().size(0)等于 0: ... 打印('所有样本的 LU 分解成功!') 所有样本的 LU 分解成功! """ # 如果 get_infos 为 True,则不需要检查错误,反之亦然 返回 火炬._lu_with_info(A, 轴心=轴心, 检查错误=( 获取信息)) 如果 类型检查: _列表或序列 = 序列[张量] 否则: _列表或序列 = 列表[张量] 定义 _检查列表大小(out_len: int, 获取信息: bool, : _ListOrSeq) -> : 获取信息_int = 1 如果 获取信息 否则 0 如果 输出长度 - 获取信息_int != 2: 抛出 类型错误( f"预期的元组,但得到的是"{2 + int(获取信息)}元素的数量,但得到了"{out_len}" ) 如果 isinstance(, (元组, 列表)): 抛出 类型错误( f"参数 'out' 必须是 Tensors 的元组,不是"{类型().__name__}" ) 定义 _lu_with_infos(A, 轴心=True, 获取信息=False, =): # 类型: (Tensor, bool, bool, Optional[tuple[Tensor, Tensor, Tensor]]) -> tuple[Tensor, Tensor, Tensor] 如果 has_torch_function_unary(A): 返回 handle_torch_function( lu, (A,), A, 轴心=轴心, 获取信息=获取信息, =外部 ) 结果 = _lu_impl(A, 轴心, 获取信息, ) 如果 外部 : _检查列表大小(长度(), 获取信息, ) 对于 i 范围(长度()): [i].调整大小为_(结果[i]).复制_(结果[i]) 返回 外部 否则: 返回 结果 # A_LU, 旋转轴,信息 定义 _lu_no_infos(A, 轴心=True, 获取信息=False, =): # type: (张量, 布尔值, 布尔值, 可选[tuple[张量, 张量]]) -> tuple[张量, 张量] # 需要在这里检查 torch_function,以便在退出时 如果 has_torch_function_unary(A): 返回 handle_torch_function( lu, (A,), A, 轴心=轴心, 获取信息=获取信息, =外部 ) 结果 = _lu_impl(A, 轴心, 获取信息, ) 如果 外部 : _检查列表大小(长度(), 获取信息, ) 对于 i 范围(长度()): [i].调整大小为_(结果[i]).复制_(结果[i]) 返回 外部 否则: 返回 结果[0] 结果[1] # A_LU,枢轴 lu 的返回类型取决于`get_infos`,因此为了解决在 TorchScript 中 lu 的输出类型,我们需要静态地知道`get_infos`的值 lu 在 TorchScript 中的输出类型需要静态地知道`get_infos`的值 lu = 布尔分发( 参数名称=get_infos, 索引参数=2, 默认=False, 如果为真=_lu_with_infos, 如果为假=_lu_no_infos, 模块名称=__name__, 函数名="lu", ) lu.__文档__ = _lu_impl.__文档__ 定义 对齐张量(*张量): 抛出 RuntimeError("对齐张量尚未实现。")

© 版权所有 PyTorch 贡献者。

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

文档

PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源