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

torch.sparse 的源代码

# mypy: 允许未类型化定义
该模块通过 python_tensor.cpp 添加了 Tensor 类
为了同时支持 TorchScript 和 MyPy 的解决方案:
来自 打字 导入 任何, 可选, 类型检查, 联合

导入 火炬
来自 火炬 导入 张量
来自 torch._C 导入 _添加文档字符串, _sparse  # 类型:忽略[已定义]

半结构化稀疏度支持
来自 .半结构化 导入 (
    稀疏半结构化张量,
    稀疏半结构化张量 CUSPARSELT,
    稀疏半结构化张量 CUTLASS,
    转换为稀疏半结构化,
)


if 类型检查:
    来自 torch 的类型 导入 _dtype as 数据类型

    暗度 = 可选[联合[int, 元组[int, ...] 列表[int]]]
否则:
    # JIT 编译器不理解 Union,也不理解这里的 torch.dtype
    数据类型 = 整型
    暗度 = 可选[元组[int]]


全部 = [
    添加 mm,
    检查稀疏张量不变性,
    mm,
    "求和",
    "softmax",
    "求解",
    "log_softmax",
    稀疏半结构化张量,
    稀疏半结构化张量 CUTLASS,
    稀疏半结构化张量 CUSPARSELT,
    转换为稀疏半结构化,
    as_sparse_gradcheck,
]

addmm = _添加文档字符串(
    _sparse._sparse_addmm,
    r""
sparse.addmm(mat, mat1, mat2, *, beta=1., alpha=1.) -> Tensor

此函数与 :func:`torch.addmm` 在正向操作中执行完全相同的功能,
但它支持稀疏 COO 矩阵 :attr:`mat1` 的反向操作。
当 :attr:`mat1` 是 COO 张量时,它必须具有 `sparse_dim = 2`。
当输入为 COO 张量时,此函数也支持对两个输入的逆向传播。

支持 CSR 和 COO 存储格式。

.. 注意:
此函数不支持对 CSR 矩阵进行求导。

参数:
mat (Tensor):要添加的密集矩阵
mat1(张量):要相乘的稀疏矩阵
mat2(张量):要相乘的稠密矩阵
beta(数字,可选)::attr:`mat`(:math:`\beta`)的乘数
alpha(数字,可选)::math:`mat1 @ mat2`(:math:`\alpha`)的乘数
""",
)


mm = _添加文档字符串(
    _sparse.稀疏_mm,
    r""
执行稀疏矩阵 :attr:`mat1` 的矩阵乘法
与(稀疏或步进)矩阵 :attr:`mat2`。类似于 :func:`torch.mm`,如果 :attr:`mat1` 是
math:`(n \times m)` 张量,:attr:`mat2` 是 :math:`(m \times p)` 张量,输出将是
math:`(n \times p)` 张量。
当`:attr:`mat1`是一个 COO 张量时,它必须具有`sparse_dim = 2`。
当输入是 COO 张量时,此函数也支持对两个输入的反向传播。

支持 CSR 和 COO 存储格式。

.. 注意:
此函数不支持对 CSR 矩阵进行求导。

此函数还额外接受一个可选的:attr:`reduce` 参数,允许
规格说明一个可选的缩减操作,在数学上执行以下操作:

.. 数学表达式

    z_{ij} = \bigoplus_{k = 0}^{K - 1} x_{ik} y_{kj}

其中 :math:`\bigoplus` 定义了累加操作符。:attr:`reduce` 仅在 CPU 设备上的 CSR 存储格式中实现。
CSR 存储格式在 CPU 设备上。

参数:
mat1 (Tensor):要相乘的第一个稀疏矩阵
mat2 (Tensor):要相乘的第二个矩阵,可以是稀疏矩阵或稠密矩阵
reduce (str, 可选):应用于非唯一索引的降维操作
(:obj:`"sum"`, :obj:`"mean"`, :obj:`"amax"`, :obj:`"amin"`). 默认 :obj:`"sum"`.

形状:
此函数的输出张量格式如下:
- 稀疏 x 稀疏 -> 稀疏
- 稀疏 x 密集 -> 密集

示例::

    >>> a = torch.tensor([[1., 0, 2], [0, 3, 0]]).to_sparse().requires_grad_()
    >>> a
    tensor(indices=tensor([[0, 0, 1],
                           [0, 2, 1]]),
values=tensor([1., 2., 3.])
size=(2, 3), nnz=3, 布局=torch.sparse_coo, requires_grad=True)
    >>> b = torch.tensor([[0, 1.], [2, 0], [0, 0]], requires_grad=True)
    >>> b
    tensor([[0., 1.],
            [2., 0.],
            [0., 0.]], requires_grad=True)
    >>> y = torch.sparse.mm(a, b)
    >>> y
    tensor([[0., 1.],
            [6., 0.]], grad_fn=<SparseAddmmBackward0>)
    >>> y.sum().backward()
    >>> a.grad
    tensor(indices=tensor([[0, 0, 1],
                           [0, 2, 1]]),
           values=tensor([1., 0., 2.]),
size=(2, 3), nnz=3, 布局=torch.sparse_coo)
    >>> c = a.detach().to_sparse_csr()
    >>> c
    tensor(crow_indices=tensor([0, 2, 3]),
           col_indices=tensor([0, 2, 1]),
           values=tensor([1., 2., 3.]), size=(2, 3), nnz=3,
           layout=torch.sparse_csr)
    >>> y1 = torch.sparse.mm(c, b, 'sum')
    >>> y1
    tensor([[0., 1.],
[[6., 0.]], grad_fn=)
    >>> y2 = torch.sparse.mm(c, b, 'max')
    >>> y2
    tensor([[0., 1.],
[[6., 0.]], grad_fn=)
""",
)


sampled_addmm = _添加文档字符串(
    _sparse.稀疏采样加 MM,
    r""
sparse.sampled_addmm(input, mat1, mat2, *, beta=1., alpha=1., out=None) -> 张量

执行密集矩阵 :attr:`mat1` 和 :attr:`mat2` 在 :attr:`input` 的稀疏模式指定的位置的矩阵乘法。
矩阵 :attr:`input` 被添加到最终结果中。

从数学上讲,这执行以下操作:

.. 数学表达式

    \text{out} = \alpha\ (\text{mat1} \mathbin{@} \text{mat2})*\text{spy}(\text{input}) + \beta\ \text{input}

其中 :math:`\text{spy}(\text{input})` 是 :attr:`input` 的稀疏模式矩阵,:attr:`alpha`
和 :attr:`beta` 是缩放因子。
`spy(input)` 在 `input` 非零值的位置上取值为 1,其他位置取值为 0。

.. 注意:
`input` 必须是一个稀疏的 CSR 张量。`mat1` 和 `mat2` 必须是稠密张量。

参数:
输入 (Tensor):一个形状为 `(m, n)` 的稀疏 CSR 矩阵,用于相加并用于计算
样本矩阵乘法
mat1(张量):一个形状为(m,k)的密集矩阵,用于相乘
mat2(张量):一个形状为(k,n)的密集矩阵,用于相乘

关键字参数:
beta(数字,可选):用于:attr:`input`(:math:`\beta`)的乘数
alpha(数字,可选)::math:`mat1 @ mat2`(:math:`\alpha`)的乘数
out(张量,可选):输出张量。如果为`None`则忽略。默认:`None`。

示例::

    >>> input = torch.eye(3, device='cuda').to_sparse_csr()
    >>> mat1 = torch.randn(3, 5, device='cuda')
    >>> mat2 = torch.randn(5, 3, device='cuda')
    >>> torch.sparse.sampled_addmm(input, mat1, mat2)
    tensor(crow_indices=tensor([0, 1, 2, 3]),
        col_indices=tensor([0, 1, 2]),
        values=tensor([ 0.2847, -0.7805, -0.1900]), device='cuda:0',
size=(3, 3), nnz=3, 布局=torch.sparse_csr)
    >>> torch.sparse.sampled_addmm(input, mat1, mat2).to_dense()
    tensor([[ 0.2847,  0.0000,  0.0000],
        [ 0.0000, -0.7805,  0.0000],
[[0.0000, 0.0000, -0.1900]], 设备='cuda:0'
    >>> torch.sparse.sampled_addmm(input, mat1, mat2, beta=0.5, alpha=0.5)
    tensor(crow_indices=tensor([0, 1, 2, 3]),
        col_indices=tensor([0, 1, 2]),
        values=tensor([ 0.1423, -0.3903, -0.0950]), device='cuda:0',
        size=(3, 3), nnz=3, layout=torch.sparse_csr)
""",
)


[文档]def 总和(输入: 张量, 维度: 暗度 = , 数据类型: 可选[数据类型] = ) -> 张量: r返回给定稀疏张量每行的和。 返回给定稀疏张量 `input` 在指定维度 `dim` 上每行的和。 如果 `dim` 是维度的列表,则 对所有这些进行求和。当对所有 `sparse_dim` 求和时,此方法返回一个稠密张量而不是稀疏张量。 返回一个稠密张量而不是稀疏张量。 所有求和的 :attr:`dim` 都会被压缩(参见 :func:`torch.squeeze`),结果是一个维度比 :attr:`input` 少 :attr:`dim` 的输出张量。 输出张量的维度比输入张量少 :attr:`dim`。 在反向传播过程中,只有 `input` 的 ``nnz`` 位置处的梯度 将传播回。注意::attr:`input` 的梯度已合并。 参数: 输入(张量):输入稀疏张量 dim (int 或 int 的元组): 要降维的维度或维度列表。默认:reduce 总维度。 dtype (:class:`torch.dtype`, 可选): 返回 Tensor 的期望数据类型。 默认::attr:`input` 的数据类型。 示例:: >>> nnz = 3 >>> dims = [5, 5, 2, 3] >>> I = torch.cat([torch.randint(0, dims[0], size=(nnz,)), torch.randint(0, dims[1], size=(nnz,))], 0).reshape(2, nnz) >>> V = torch.randn(nnz, dims[2], dims[3]) >>> size = torch.Size(dims) >>> # xdoctest: +IGNORE_WANT("非确定性") >>> S = torch.sparse_coo_tensor(I, V, size) >>> S tensor(indices=tensor([[2, 0, 3], [[2, 4, 1]]) values=tensor([[[[-0.6438, -1.6467, 1.4004], [[ 0.3411, 0.0918, -0.2312]], [[ 0.5348, 0.0634, -2.0494], [[-0.7125, -1.0646, 2.1844]] [[0.1276, 0.1874, -0.6334]] [[-1.9682, -0.5340, 0.7483]] size=(5, 5, 2, 3), nnz=3, layout=torch.sparse_coo 当仅对 sparse_dims 的部分求和时,返回一个稀疏张量 >>> torch.sparse.sum(S, [1, 3]) tensor(indices=tensor([[0, 2, 3]]), values=tensor([[-1.4512, 0.4073], [-0.8901, 0.2017] [-0.3183, -1.7539] size=(5, 2), nnz=3, layout=torch.sparse_coo 当对所有稀疏维度求和时,返回一个稠密张量 # 压缩维度求和 >>> torch.sparse.sum(S, [0, 1, 3]) tensor([-2.6596, -1.1450]) """ if dtype : if 维度 : 返回 PyTorch._sparse_sum(输入, 维度) 否则: 返回 PyTorch._sparse_sum(输入) 否则: if 维度 : 返回 PyTorch._sparse_sum(输入, 维度, 数据类型=数据类型) 否则: 返回 PyTorch._sparse_sum(输入, 数据类型=数据类型)
softmax = _添加文档字符串( _sparse.稀疏 softmax, r"" sparse.softmax(input, dim, *, dtype=None) -> Tensor 应用 softmax 函数。 Softmax 定义为: \text{Softmax}(x_{i}) = \frac{exp(x_i)}{\sum_j exp(x_j)}\ where :math:`i, j` 在稀疏张量索引和未指定范围内运行 条目被忽略。这相当于定义未指定 条目设为负无穷大,使得 :math:`exp(x_k) = 0` 当 条目索引:`k` 未指定。 它应用于`dim`的所有切片,并将它们重新缩放,使得 元素位于范围 `[0, 1]` 内,并且总和为 1。 参数: input (Tensor): 输入 dim (int): softmax 将计算的维度 dtype (:class:`torch.dtype`, 可选): 想要的数据类型 返回张量的类型。如果指定,输入张量在操作执行前会被转换为 :attr:`dtype` 转换。这在防止数据类型 转换错误时很有用。 溢出。默认值:无 """, ) spsolve = _添加文档字符串( _sparse._spsolve, r"" sparse.spsolve(input, other, *, left=True) -> 张量 计算一个线性方程组的解 一个独特的解决方案。其目的是类似于:func:`torch.linalg.solve` 除了系统由一个稀疏的 CSR 矩阵定义外 `稀疏_csr`。 参数: 输入(张量):表示线性系统系数的形状为`(n, n)`的稀疏 CSR 矩阵 其他(Tensor):表示线性系统右侧的密集矩阵(n, ) 左侧(bool,可选):是否求解 `input @ out = other`(默认)或 `out @ input = other` 的系统。仅支持 `left=True`。 left(bool,可选):是否求解 `input @ out = other`(默认)或 `out @ input = other` 的系统。 仅支持 `left=True`。 """, ) log_softmax = _添加文档字符串( _sparse._sparse_log_softmax, r"" sparse.log_softmax(input, dim, *, dtype=None) -> Tensor 应用 softmax 函数后跟对数。 更多详情请参阅 :class:`~torch.sparse.softmax`。 参数: input (Tensor): 输入 dim (int): softmax 将计算的维度 dtype (:class:`torch.dtype`, 可选): 想要的数据类型 返回张量的类型。如果指定,输入张量在操作执行前会被转换为 :attr:`dtype` 转换。这在防止数据类型 转换错误时很有用。 溢出。默认值:无 """, ) spdiags = _添加文档字符串( _sparse._spdiags, r"" sparse.spdiags(diagonals, offsets, shape, layout=None) -> Tensor 通过将 :attr:`diagonals` 的值放置在输出矩阵的指定对角线上创建一个稀疏二维张量 attr:`对角线` 沿着指定的对角线排列 attr:`offsets` 张量控制哪些对角线被设置。 - 如果 :attr:`offsets[i]` = 0,则是主对角线 - 如果 :attr:`offsets[i]` < 0,则位于主对角线下方 - 如果 :attr:`offsets[i]` > 0,则位于主对角线上方 对角线的行数必须与 :attr:`offsets` 的长度相匹配, 并且偏移量不能重复。 参数: 对角线(Tensor):按行存储对角线的矩阵 偏移量(Tensor):要设置的对角线,存储为向量 形状(整数二元组):结果期望的形状 关键字参数: 布局(:class:`torch.layout`,可选):返回张量的期望布局 支持的格式有 ``torch.sparse_coo``、``torch.sparse_csc`` 和 ``torch.sparse_csr`` 默认:``torch.sparse_coo`` 示例: 设置矩阵的主对角线和前两个下对角线 >>> diags = torch.arange(9).reshape(3, 3) >>> diags tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> s = torch.sparse.spdiags(diags, torch.tensor([0, -1, -2]), (3, 3)) >>> s tensor(indices=tensor([[0, 1, 2, 1, 2, 2], [0, 1, 2, 0, 1, 0]]), values=tensor([0, 1, 2, 3, 4, 6]), size=(3, 3), nnz=6, 布局=torch.sparse_coo) >>> s.to_dense() tensor([[0, 0, 0], [3, 1, 0], [6, 4, 2]]) 更改输出布局 >>> diags = torch.arange(9).reshape(3, 3) >>> diags tensor([[0, 1, 2],[3, 4, 5], [6, 7, 8]]) >>> s = torch.sparse.spdiags(diags, torch.tensor([0, -1, -2]), (3, 3), layout=torch.sparse_csr) >>> s tensor(crow_indices=tensor([0, 1, 3, 6])) col_indices=tensor([0, 0, 1, 0, 1, 2]) values=tensor([0, 3, 1, 6, 4, 2]), size=(3, 3), nnz=6, layout=torch.sparse_csr) >>> s.to_dense() tensor([[0, 0, 0], [3, 1, 0], [6, 4, 2]]) 设置大输出部分的偏对角线:: >>> diags = torch.tensor([[1, 2], [3, 4]]) >>> offsets = torch.tensor([0, -1]) >>> torch.sparse.spdiags(diags, offsets, (5, 5)).to_dense() tensor([[1, 0, 0, 0, 0], [3, 2, 0, 0, 0] [0, 4, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] .. 注意: 当设置给定对角线上的值时,对角线中的索引 并且将`:attr:`diagonals`中的行索引作为 输出列索引。这会导致当设置对角线时 使用正偏移量 `k`,该对角线上的第一个值将是 对角线行 :attr:`diagonals` 中位置 `k` 的值 指定正偏移量:: >>> diags = torch.tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) >>> torch.sparse.spdiags(diags, torch.tensor([0, 1, 2]), (5, 5)).to_dense() tensor([[1, 2, 3, 0, 0], [0, 2, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] """, )
[文档] 检查稀疏张量不变性: 一个用于控制检查稀疏张量不变性的工具。 管理稀疏张量不变量的以下选项存在 在稀疏张量构建中进行检查: 1. 使用上下文管理器: .. 代码块 :: python with torch.sparse.check_sparse_tensor_invariants(): run_my_model() 2. 采用程序化方法: .. 代码块 :: python prev_checks_enabled = torch.sparse.check_sparse_tensor_invariants.is_enabled() torch.sparse.check_sparse_tensor_invariants.enable() run_my_model() 如果没有 prev_checks_enabled: torch.sparse.check_sparse_tensor_invariants.disable() 3. 使用函数装饰: .. 代码块 :: python @torch.sparse.check_sparse_tensor_invariants() def run_my_model(): ... run_my_model() 在稀疏张量构造函数调用中使用 ``check_invariants`` 关键字参数。 例如: >>> torch.sparse_csr_tensor([0, 1, 3], [0, 1], [1, 2], check_invariants=True) Traceback (most recent call last): 文件 "", 行 1,在 中 运行时错误:`crow_indices[..., -1] == nnz` 不满足条件。 """
[文档] @staticmethod def is_enabled(): r"""返回 True 如果稀疏张量不变性检查已启用。 .. 注意:: 使用 :func:`torch.sparse.check_sparse_tensor_invariants.enable` 或 func:`torch.sparse.check_sparse_tensor_invariants.disable` 来 管理稀疏张量不变性检查的状态。 """ 返回 torch._C._check_sparse_tensor_invariants()
[文档] @staticmethod def 启用(): 启用稀疏张量构造函数中的稀疏张量不变性检查。 .. 注意:: 默认情况下,稀疏张量不变性检查是禁用的。使用 func:`torch.sparse.check_sparse_tensor_invariants.is_enabled` 来 检索稀疏张量不变性检查的当前状态。 .. 注意:: 稀疏张量不变性检查标志对所有稀疏张量构造函数有效,包括 Python 和 ATen。 稀疏张量构造函数,无论是 Python 还是 ATen,稀疏张量不变性检查标志都有效。 标志可以被本地覆盖为 `check_invariants` 可选参数为稀疏张量构造函数的参数。 ```python # 输入文本 input_text = '"""' # 翻译函数(此处为示例,实际翻译功能需调用真实的翻译 API) def translate_to_simplified_chinese(text): # 假设的翻译结果 return text # 输出翻译结果 translated_text = translate_to_simplified_chinese(input_text) print(translated_text) ``` torch._C._set_check_sparse_tensor_invariants(True) 翻译为:torch._C._set_check_sparse_tensor_invariants(True)
[文档] @staticmethod def 禁用(): r"""在稀疏张量构造函数中禁用稀疏张量不变性检查。 更多信息请参阅 :func:`torch.sparse.check_sparse_tensor_invariants.enable`。 """ torch._C._set_check_sparse_tensor_invariants(False)
# 管道管理器支持 def __init__(self, 启用=True): self.状态
= 启用 self.保存状态: 可选[bool] = def __进入__(self): if self.保存状态 : 抛出 运行时错误( "此上下文管理器实例已激活。" "请使用不同的上下文管理器实例进行上下文嵌套。" ) self.保存状态 = self.启用() PyTorch._C.设置检查稀疏张量不变性(self.状态) def __退出__(self, 类型, value, 跟踪回溯): 断言 self.保存状态 PyTorch._C.设置检查稀疏张量不变性(self.保存状态) self.保存状态 = 装饰器支持 def __调用__(self, ): def 测试_mth(*参数, **kwargs): 替换为 类型(self)(self.状态): 返回 (*参数, **kwargs) 返回 测试_mth
[文档]def as_sparse_gradcheck(gradcheck): 装饰函数,用于扩展稀疏张量的 gradcheck。 torch.autograd.gradcheck 或其 functools.partial 的装饰器 扩展 gradcheck 函数以支持输入变体的方法 操作或返回稀疏张量的函数 确保指定的 gradcheck 函数本身仅操作 带有步长的张量 例如: >>> gradcheck = torch.sparse.as_sparse_gradcheck(torch.autograd.gradcheck) >>> x = torch.tensor([[0, 1], [2, 3]], dtype=torch.float64).to_sparse_coo().requires_grad_(True) >>> gradcheck(lambda x: x.to_sparse_csr(), x) True """ def gradcheck_with_sparse_support(函数, 输入, **kwargs): "" 创建支持稀疏张量的 gradcheck。 与:func:`torch.autograd.gradcheck`相同,但支持稀疏张量的输入和输出。 """ 隐藏 = kwargs.流行("掩码", False) 稀疏布局 = { PyTorch.稀疏 COO, PyTorch.稀疏压缩存储格式, PyTorch.稀疏压缩存储格式, PyTorch.稀疏_bsr, PyTorch.稀疏矩阵, } 稀疏压缩布局 = { PyTorch.稀疏压缩存储格式, PyTorch.稀疏压缩存储格式, PyTorch.稀疏_bsr, PyTorch.稀疏矩阵, } 稀疏块布局 = {PyTorch.稀疏_bsr, PyTorch.稀疏矩阵} STRIDED_REPRESENTATION = "__STRIDED_REPRESENTATION__" def 转换为步长表示形式(参数): 将可微的非分步张量转换为包含可微分步张量的表示形式。 if isinstance(参数, (列表, 元组)): args = (参数,) 新参数: 列表[任何] = 输入文本为空,请提供需要翻译的文本 对象 参数: if ( isinstance(对象, PyTorch.张量) 对象.需要梯度 对象.布局 稀疏布局 ): d = 字典(布局=对象.布局, 形状=对象.形状) if 遮蔽: # 使用零值材料化未指定的元素 批处理维度 = 对象.维数 - 对象.稠密维度() - 对象.稀疏维度() 块大小 = ( 对象.().形状[批处理维度 + 1 : 批处理维度 + 3] if 对象.布局 稀疏块布局 否则 ) 完整掩码 = PyTorch.( 对象.形状, 设备=对象.设备, 数据类型=PyTorch.布尔值 ).转换为稀疏格式( 布局=对象.布局, 块大小=块大小, 稠密维度=对象.稠密维度(), ) 对象 = 对象.转换为稠密格式().sparse_mask(full_mask) if 对象.布局 PyTorch.稀疏 COO: d.更新( 索引=对象.索引(), 是否合并=对象.是否合并() ) values = 对象.() 如果...否则 对象.布局 {PyTorch.稀疏压缩存储格式, PyTorch.稀疏_bsr}: d.更新( 压缩索引=对象.鸡索引(), 平凡索引=对象.列索引(), ) values = 对象.() 否则: d.更新( 压缩索引=对象.c 列索引(), 平凡索引=对象.行索引(), ) values = 对象.() 新参数.扩展( (分步表示, d, .需要梯度_(True)) ) 否则: 新参数.添加(对象) 返回 元组(新参数) def 从分块表示恢复(参数): "从它们的步长表示中恢复非步长可微张量。" new_args = 输入文本为空,请提供需要翻译的文本 args = 列表(参数) 参数: a = 参数.流行(0) if a == 分步表示: d, values = 参数.流行(0), 参数.流行(0) if d[布局] PyTorch.稀疏 COO: a = PyTorch.稀疏 Coo 张量( d[索引] , 尺寸=d["形状"] 是否合并=d[是否合并] ) 如果...否则 d[布局] 稀疏压缩布局: a = PyTorch.稀疏压缩张量( d[压缩索引] d["普通索引"] , 尺寸=d["形状"] 布局=d[布局] ) 否则: 抛出 不支持的操作异常( f转换{d[布局]}步长表示转换为张量' ) 新参数.添加(a) 返回 元组(新参数) def 函数包装器(*参数, **kwargs): 恢复参数 = 从分块表示恢复(参数) # 将可微输出稀疏张量转换为分块 # 张量: 输出 = 函数(*恢复参数, **kwargs) 步长输出 = ( 元组(输出) if isinstance(输出, (列表, 元组)) 否则 (输出,) ) 步长输出 = 元组( ( o.转换为稠密格式(掩码梯度=遮蔽) if isinstance(o, PyTorch.张量) o.需要梯度 o.布局 稀疏布局 否则 o ) o 步长输出 ) 返回 ( 步长输出 if isinstance(输出, (列表, 元组)) 否则 步长输出[0] ) args = (函数包装器, 转换为步长表示形式(输入)) 返回 gradcheck(*参数, **kwargs) 返回 gradcheck_with_sparse_support

© 版权所有 PyTorch 贡献者。

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

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源