torch.masked¶
介绍¶
动机¶
警告
masked tensors 的 PyTorch API 处于原型阶段,未来可能会发生变化。
MaskedTensor 是 torch.Tensor
的扩展,它提供了以下能力:
使用任何 masked 语义(例如,变长张量、nan* 算子等)
区分 0 梯度和 NaN 梯度
各种稀疏应用(见下方教程)
“指定”(Specified)和“未指定”(unspecified)在 PyTorch 中有着悠久的历史,但缺乏正式的语义和一致性;事实上,MaskedTensor 的诞生是为了解决普通 torch.Tensor
类无法妥善处理的一系列问题。因此,MaskedTensor 的主要目标是成为 PyTorch 中这些“指定”和“未指定”值的唯一真理来源,让它们成为一等公民而非事后补丁。这反过来应该进一步释放稀疏性的潜力,实现更安全、更一致的算子,并为用户和开发者提供更流畅、更直观的体验。
什么是 MaskedTensor?¶
MaskedTensor 是一种张量子类,由 1) 输入(数据)和 2) 掩码(mask)组成。掩码告诉我们应包含或忽略输入中的哪些条目。
举个例子,假设我们想屏蔽掉所有等于 0 的值(用灰色表示)并取最大值

上方是普通张量的例子,下方是 MaskedTensor 的例子,其中所有的 0 都被屏蔽掉了。这显然会产生不同的结果,取决于我们是否有掩码,但这种灵活的结构允许用户在计算过程中系统地忽略他们希望忽略的任何元素。
我们已经编写了一些现有教程来帮助用户入门,例如
支持的算子¶
一元算子¶
一元算子是仅包含一个输入的算子。将其应用于 MaskedTensors 相对简单:如果在给定索引处数据被屏蔽,我们会应用该算子;否则,我们将继续屏蔽数据。
可用的一元算子有
计算 |
|
|
|
计算 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
计算给定 |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
|
|
计算给定输入张量的按位非。 |
|
返回一个新张量,其中包含 |
|
|
|
计算给定 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
|
|
|
|
返回一个新张量,其中包含输入张量 |
|
|
|
|
|
返回一个新张量,其中包含 |
|
计算 |
|
计算 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 (1 + |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含布尔元素,表示 |
|
将 |
|
返回一个新张量,其中包含 |
|
|
|
返回 |
|
计算 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
将 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
此函数是 torch.sign() 对于复数张量的扩展。 |
|
测试 |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
可用的就地(inplace)一元算子包括上述所有算子,**除了**
计算给定 |
|
返回 |
|
测试 |
|
返回一个新张量,其中包含布尔元素,表示 |
二元算子¶
如您在教程中可能看到的,MaskedTensor
也实现了二元操作,但需要注意的是,两个 MaskedTensors 中的掩码必须匹配,否则会引发错误。正如错误信息中指出的,如果您需要支持某个特定的算子,或者对它们应该如何表现有提议的语义,请在 GitHub 上开启一个 issue。目前,我们决定采用最保守的实现方式,以确保用户清楚地了解正在发生的事情,并慎重地对待 masked 语义相关的决策。
可用的二元算子有
将按 |
|
逐元素计算 的反正切,并考虑象限。 |
|
|
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
将输入 |
|
|
|
逐元素应用 C++ 的 std::fmod。 |
|
输入指数之和的对数。 |
|
输入指数之和以 2 为底的对数。 |
|
将 |
|
|
|
逐元素返回 |
|
逐元素计算 Python 的模运算。 |
|
从 |
|
|
|
|
|
计算逐元素相等性 |
|
逐元素计算 。 |
|
逐元素计算 。 |
|
逐元素计算 。 |
|
|
|
|
|
按元素计算 。 |
|
|
|
按元素计算 。 |
|
|
|
按元素计算 |
|
按元素计算 |
|
按元素计算 |
|
按元素计算 |
|
|
可用的原地二元运算符包含以上所有,**除了**
输入指数之和的对数。 |
|
输入指数之和以 2 为底的对数。 |
|
如果两个张量具有相同的大小和元素,则为 |
|
按元素计算 |
|
按元素计算 |
|
按元素计算 |
规约¶
以下规约可用(支持 autograd)。更多信息请参阅 概述 教程,其中详细介绍了一些规约示例;而 高级语义 教程则对某些规约语义的决定方式进行了深入探讨。
返回 |
|
返回 |
|
返回 |
|
返回展平张量或沿某个维度的最小值索引 |
|
返回 |
|
返回 |
|
测试 |
|
返回给定张量的矩阵范数或向量范数。 |
|
计算由 |
|
计算由 |
视图和选择函数¶
我们还包含了一些视图和选择函数;直观上,这些操作符将同时应用于数据和掩码,然后将结果包装在 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, --, --]
)
当前支持以下操作:
返回每个零维输入张量的一维视图。 |
|
根据 广播语义 广播给定张量。 |
|
将 |
|
在给定维度连接 |
|
尝试将张量分割成指定数量的块。 |
|
通过水平堆叠 |
|
根据 |
|
通过将其重塑为一维张量来展平 |
|
根据 |
|
按顺序水平堆叠张量(按列)。 |
|
计算 |
|
根据 |
|
返回一个新张量,它是 |
|
从批量输入张量中提取滑动局部块。 |
|
返回一个连续的展平张量。 |
|
在给定索引处沿选定维度对 |
|
将张量分割成块。 |
|
沿新维度连接张量序列。 |
|
要求 |
|
返回 |
|
根据 |
|
按顺序垂直堆叠张量(按行)。 |
|
返回 |
|
将此张量扩展到与 |
|
返回一个与 |
|
返回此张量,使其形状与 |
|
返回原始张量的一个视图,该视图包含 |
|
返回一个新张量,其数据与 |