torch.masked#
创建于: 2022年8月15日 | 最后更新于: 2025年6月17日
引言#
动机#
警告
Masked tensors 的 PyTorch API 处于原型阶段,未来可能会更改。
MaskedTensor 作为 torch.Tensor
的扩展,赋予用户能够
使用任何掩码语义(例如,可变长度张量、NaN* 运算符等)
区分 0 和 NaN 梯度
各种稀疏应用(请参阅下面的教程)
“指定”和“未指定”在 PyTorch 中有着悠久的历史,但没有正式的语义,当然也没有一致性;事实上,MaskedTensor 的诞生源于 vanilla torch.Tensor
类无法妥善解决的一系列问题。因此,MaskedTensor 的主要目标是成为 PyTorch 中所述“指定”和“未指定”值的真实来源,其中它们是一等公民,而不是事后才考虑。反过来,这应该进一步释放稀疏性的潜力,实现更安全、更一致的运算符,并为用户和开发人员提供更顺畅、更直观的体验。
什么是 MaskedTensor?#
MaskedTensor 是一个张量子类,它包含 1) 一个输入(数据)和 2) 一个掩码。掩码指示应包含或忽略输入中的哪些条目。
举个例子,假设我们想掩盖所有等于 0 的值(用灰色表示)并取最大值

上面是 vanilla 张量示例,下面是 MaskedTensor,其中所有 0 都被掩盖了。这显然会产生不同的结果,具体取决于我们是否有掩码,但这种灵活的结构允许用户在计算过程中系统地忽略任何他们想要的元素。
我们已经编写了许多现有教程来帮助用户上手,例如
支持的运算符#
一元运算符#
一元运算符是仅包含单个输入的运算符。将它们应用于 MaskedTensor 相对简单:如果给定索引的数据被掩盖,我们将应用运算符,否则将继续掩盖数据。
可用的 unary operators 是
计算 |
|
torch.abs() 的别名 |
|
计算 |
|
torch.acos() 的别名 |
|
返回一个新张量,其中包含 |
|
torch.acosh() 的别名 |
|
计算给定 |
|
返回一个新张量,其中包含 |
|
torch.asin() 的别名 |
|
返回一个新张量,其中包含 |
|
torch.asinh() 的别名 |
|
返回一个新张量,其中包含 |
|
torch.atan() 的别名 |
|
返回一个新张量,其中包含 |
|
torch.atanh() 的别名 |
|
计算给定输入张量的按位 NOT。 |
|
返回一个新张量,其中包含 |
|
torch.clamp() 的别名 |
|
计算给定 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中 |
|
torch.special.digamma() 的别名 |
|
torch.special.erf() 的别名 |
|
torch.special.erfc() 的别名 |
|
torch.special.erfinv() 的别名 |
|
返回一个新张量,其元素是输入张量 |
|
torch.special.exp2() 的别名 |
|
torch.special.expm1() 的别名 |
|
torch.trunc() 的别名 |
|
返回一个新张量,其中包含 |
|
计算 |
|
计算 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含(1 + |
|
返回一个新张量,其中包含 |
|
torch.special.logit() 的别名 |
|
torch.special.i0() 的别名 |
|
返回一个新张量,其中包含布尔元素,表示 |
|
用 |
|
返回一个新张量,其中包含 |
|
torch.neg() 的别名 |
|
返回 |
|
计算 |
|
返回一个新张量,其中 |
|
返回一个新张量,其中包含 |
|
将 |
|
返回一个新张量,其中包含 |
|
torch.special.expit() 的别名 |
|
返回一个新张量,其中包含 |
|
此函数是 torch.sign() 对复数张量的扩展。 |
|
测试 |
|
返回一个新张量,其中包含 |
|
torch.special.sinc() 的别名 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其元素是 |
|
返回一个新张量,其中包含 |
可用的 inplace unary operators 是上面所有运算符,**但**
二元运算符#
正如您可能在教程中看到的,MaskedTensor
还实现了二元运算符,但有一个条件:两个 MaskedTensor 的掩码必须匹配,否则将引发错误。如错误中所述,如果您需要特定运算符的支持或对如何处理它们有建议的语义,请在 GitHub 上开一个 issue。目前,我们已决定采用最保守的实现方式,以确保用户确切地知道正在发生什么,并对他们使用掩码语义的决定保持谨慎。
可用的 binary operators 是
将 |
|
考虑象限的 的逐元素反正切。 |
|
torch.atan2() 的别名 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
将输入 |
|
torch.div() 的别名 |
|
逐元素应用 C++ 的 std::fmod。 |
|
输入指数和的对数。 |
|
以2为底的输入指数和的对数。 |
|
将 |
|
torch.mul() 的别名 |
|
返回 |
|
逐元素计算Python 的模运算。 |
|
从 |
|
torch.sub() 的别名 |
|
torch.div() 带有 |
|
计算逐元素相等 |
|
逐元素计算 。 |
|
逐元素计算 。 |
|
逐元素计算 。 |
|
torch.gt() 的别名 |
|
torch.ge() 的别名 |
|
逐元素计算 。 |
|
torch.le() 的别名 |
|
逐元素计算 。 |
|
torch.lt() 的别名 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
torch.ne() 的别名 |
可用的 inplace binary operators 是上面所有运算符,**但**
视图和选择函数#
我们也包含了一些视图和选择函数;直观地说,这些运算符将同时应用于数据和掩码,然后将结果包装在 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, --, --]
)
当前支持以下 ops
返回每个输入张量的一维视图,其中零维度。 |
|
根据 广播语义 广播给定的张量。 |
|
将 |
|
将给定的张量序列 |
|
尝试将张量分割成指定的块数。 |
|
通过水平堆叠 |
|
根据 |
|
通过将 |
|
根据 |
|
按水平(列方向)顺序堆叠张量。 |
|
计算 |
|
创建由 attr:tensors 中一维输入指定的坐标网格。 |
|
返回一个新张量,它是 |
|
从批量输入张量中提取滑动局部块。 |
|
返回一个连续的展平张量。 |
|
沿选定维度在给定索引处对 |
|
将张量分割成块。 |
|
沿新维度连接一系列张量。 |
|
期望 |
|
返回一个转置版本的 |
|
根据 |
|
按垂直(行方向)顺序堆叠张量。 |
|
返回 |
|
将此张量扩展到与 |
|
返回一个具有与 |
|
将此张量返回为与 |
|
返回原始张量的视图,该视图包含 |
|
返回一个新张量,它具有与 |