torch.masked¶
简介¶
动机¶
警告
masked 张量的 PyTorch API 仍处于原型阶段,未来可能会或可能不会更改。
MaskedTensor 作为 torch.Tensor
的扩展,为用户提供以下能力:
使用任何 masked 语义(例如,可变长度张量、nan* 算子等)
区分 0 和 NaN 梯度
各种稀疏应用(见下面的教程)
“已指定”和“未指定”在 PyTorch 中有很长的历史,但没有正式的语义,当然也没有一致性;实际上,MaskedTensor 的诞生源于 vanilla torch.Tensor
类无法妥善解决的诸多问题的积累。因此,MaskedTensor 的主要目标是成为 PyTorch 中“已指定”和“未指定”值的真理来源,在 PyTorch 中,它们是头等公民,而不是事后才考虑的。反过来,这应该进一步释放 稀疏性 的潜力,实现更安全、更一致的算子,并为用户和开发者提供更流畅、更直观的体验。
什么是 MaskedTensor?¶
MaskedTensor 是张量子类,由 1) 输入(数据)和 2) 掩码组成。掩码告诉我们应该包含或忽略来自输入的哪些条目。
举例来说,假设我们想要掩盖所有等于 0 的值(以灰色表示)并取最大值

顶部是 vanilla 张量示例,底部是 MaskedTensor,其中所有的 0 都被掩盖。这清楚地表明,我们是否有掩码会产生不同的结果,但这种灵活的结构允许用户系统地忽略他们在计算过程中想要忽略的任何元素。
我们已经编写了许多现有的教程来帮助用户入门,例如:
支持的算子¶
一元算子¶
一元算子是只包含单个输入的算子。将它们应用于 MaskedTensor 相对简单:如果在给定索引处的数据被掩盖,我们应用该算子,否则我们将继续掩盖数据。
可用的一元算子有
计算 |
|
|
|
计算 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
计算给定 |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
计算给定输入张量的按位 NOT。 |
|
返回一个新张量,其中包含 |
|
|
|
计算给定 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
|
|
|
|
返回一个新张量,其中包含输入张量 |
|
|
|
|
|
返回一个新张量,其中包含 |
|
计算 |
|
计算 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 (1 + |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含布尔元素,表示 |
|
将 |
|
返回一个新张量,其中包含 |
|
|
|
返回 |
|
使用 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
将 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
此函数是 torch.sign() 到复数张量的扩展。 |
|
测试 |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
可用的一元原位算子与上述所有算子相同,除了
计算给定 |
|
返回 |
|
测试 |
|
返回一个新张量,其中包含布尔元素,表示 |
二元算子¶
正如您在教程中可能看到的那样,MaskedTensor
也实现了二元运算,但需要注意的是,两个 MaskedTensor 中的掩码必须匹配,否则会引发错误。正如错误中指出的那样,如果您需要对特定算子的支持,或者对它们应该如何表现有建议的语义,请在 GitHub 上打开一个 issue。目前,我们已决定采用最保守的实现,以确保用户确切地知道发生了什么,并且有意识地做出关于 masked 语义的决策。
可用的二元算子有
将按 |
|
逐元素计算 的反正切,并考虑象限。 |
|
|
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
将输入 |
|
|
|
逐元素应用 C++ 的 std::fmod。 |
|
输入指数之和的对数。 |
|
以 2 为底的输入指数之和的对数。 |
|
将 |
|
|
|
逐元素返回 |
|
逐元素计算 Python 的模运算。 |
|
从 |
|
|
|
|
|
逐元素计算相等性 |
|
逐元素计算 。 |
|
计算 逐元素比较。 |
|
计算 逐元素比较。 |
|
别名: |
|
别名: |
|
计算 逐元素比较。 |
|
别名: |
|
计算 逐元素比较。 |
|
别名: |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
别名: |
可用的就地二元运算符是以上所有运算符,除了
输入指数之和的对数。 |
|
以 2 为底的输入指数之和的对数。 |
|
如果两个张量具有相同的大小和元素,则为 |
|
计算 |
|
计算 |
|
计算 |
归约¶
以下归约可用(具有自动微分支持)。 更多信息,概述 教程详细介绍了一些归约示例,而 高级语义 教程更深入地讨论了我们如何决定某些归约语义。
返回 |
|
返回给定维度 |
|
返回给定维度 |
|
返回扁平化张量或沿维度最小值的索引 |
|
返回 |
|
返回 |
|
测试 |
|
返回给定张量的矩阵范数或向量范数。 |
|
计算由 |
|
计算由 |
视图和选择函数¶
我们还包括了许多视图和选择函数; 直观地,这些运算符将应用于数据和掩码,然后将结果包装在 MaskedTensor
中。 例如,考虑 select()
>>> data = torch.arange(12, dtype=torch.float).reshape(3, 4)
>>> data
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
>>> mask = torch.tensor([[True, False, False, True], [False, True, False, False], [True, True, True, True]])
>>> mt = masked_tensor(data, mask)
>>> data.select(0, 1)
tensor([4., 5., 6., 7.])
>>> mask.select(0, 1)
tensor([False, True, False, False])
>>> mt.select(0, 1)
MaskedTensor(
[ --, 5.0000, --, --]
)
目前支持以下操作
返回每个零维输入张量的一维视图。 |
|
根据 广播语义 广播给定的张量。 |
|
将 |
|
在给定维度中连接 |
|
尝试将张量拆分为指定数量的块。 |
|
通过水平堆叠 |
|
根据 |
|
通过将 |
|
根据 |
|
按水平顺序 (列方向) 堆叠张量。 |
|
计算 Kronecker 积,表示为 ,即 |
|
创建由 attr:tensors 中 1D 输入指定的坐标网格。 |
|
返回一个新的张量,它是 |
|
从批量输入张量中提取滑动局部块。 |
|
返回连续的扁平化张量。 |
|
沿给定索引处的选定维度切片 |
|
将张量拆分为块。 |
|
沿新维度连接张量序列。 |
|
期望 |
|
返回作为 |
|
根据 |
|
按垂直顺序 (行方向) 堆叠张量。 |
|
返回 |
|
将此张量扩展为与 |
|
返回一个张量,该张量与 |
|
返回与 |
|
返回原始张量的视图,其中包含维度 |
|
返回与 |