torch.masked¶
简介
动机 ¶
警告
PyTorch 的掩码张量 API 处于原型阶段,未来可能会也可能不会发生变化。
MaskedTensor 作为对 torch.Tensor
的扩展,为用户提供以下功能:
使用任何掩码语义(例如可变长度张量、nan*运算符等)
区分 0 和 NaN 梯度
不同的稀疏应用(请参阅下面的教程)
“指定”和“未指定”在 PyTorch 中有着悠久的历史,但没有正式的语义,当然也没有一致性;事实上,MaskedTensor 的诞生源于一系列问题,原始的 torch.Tensor
类无法正确解决。因此,MaskedTensor 的主要目标是成为 PyTorch 中“指定”和“未指定”值的真相来源,在这些值中,它们是第一公民而不是事后考虑。反过来,这应该进一步释放稀疏性的潜力,使操作更安全、更一致,并为用户和开发者提供更流畅、更直观的体验。
什么是 MaskedTensor?
MaskedTensor 是一个张量子类,由以下两部分组成:1)输入(数据),2)掩码。掩码告诉我们哪些输入条目应该被包含或忽略。
例如,假设我们想要屏蔽所有等于 0 的值(用灰色表示)并取最大值:

顶部是普通的张量示例,底部是屏蔽张量,其中所有 0 都被屏蔽。这清楚地表明,根据是否有屏蔽,结果会有所不同。这种灵活的结构允许用户在计算过程中系统地忽略他们想要的任何元素。
我们已经编写了大量的教程来帮助用户入门,例如:
支持的操作 §
一元运算符 ¶
一元运算符是只包含单个输入的运算符。将它们应用于掩码张量相对简单:如果数据在给定索引处被掩码,则应用运算符,否则我们将继续掩码数据。
可用的单运算符有:
计算每个元素在 |
|
|
|
计算每个元素在 |
|
|
|
返回一个新张量,包含 |
|
|
|
计算给定 |
|
返回一个新张量,包含 |
|
|
|
返回一个新张量,包含 |
|
|
|
返回一个新张量,包含 |
|
|
|
返回一个新张量,包含 |
|
|
|
计算给定输入张量的按位非。 |
|
返回一个新张量,其中包含 |
|
将 |
|
|
|
计算给定 |
|
返回一个新张量,其中包含 |
|
返回一个新张量,其中包含 |
|
将 |
|
|
|
|
|
|
|
|
|
返回一个新张量,其元素为输入张量 |
|
|
|
|
|
|
|
返回一个新张量,包含 |
|
计算每个元素的分数部分。 |
|
计算伽玛函数在 |
|
返回一个新张量,包含 |
|
返回一个新张量,其元素为 |
|
返回一个新张量,其元素为(1 + |
|
返回一个新张量,其元素为 |
|
|
|
|
|
返回一个新张量,其中的布尔元素表示 |
|
将 |
|
返回一个新张量,其元素为 |
|
|
|
返回 |
|
将 |
|
将 |
|
返回 |
|
将 |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其中包含 |
|
这个函数是 torch.sign()对复数张量的扩展。 |
|
测试 |
|
返回一个新张量,其中包含 |
|
|
|
返回一个新张量,其元素为 |
|
返回一个新张量,其元素为 |
|
返回一个新张量,其元素为 |
|
返回一个新张量,其元素为 |
|
返回一个新张量,其元素为 |
|
返回一个新张量,其元素为 |
可用的就地一元运算符都是上述所有,除了:
计算给定 |
|
返回 |
|
测试 |
|
返回一个新张量,其中的布尔元素表示 |
二元运算符 §
如您在教程中看到的, MaskedTensor
还实现了二进制运算,但前提是两个 MaskedTensors 中的掩码必须匹配,否则会引发错误。正如错误信息中提到的,如果您需要支持特定的运算符或已提出关于它们应该如何行为的语义,请打开 GitHub 上的问题。目前,我们已决定采用最保守的实现方式,以确保用户确切了解正在发生的情况,并且在使用掩码语义时做出有意的决策。
可用的二进制运算符有:
将 |
|
考虑象限的 的逐元素反正切。 |
|
|
|
计算 |
|
计算 |
|
计算 |
|
计算对 |
|
计算对 |
|
将输入 |
|
|
|
应用 C++的 std::fmod 逐元素操作。 |
|
输入指数幂之和的对数。 |
|
输入在 2 为底下的指数幂之和的对数。 |
|
将 |
|
|
|
按元素方式返回 |
|
计算 Python 的逐元素取模运算。 |
|
从 |
|
|
|
|
|
计算逐元素相等性。 |
|
计算逐元素 。 |
|
计算第 0#元素级。 |
|
计算第 0#元素级。 |
|
|
|
|
|
计算元素级 |
|
|
|
计算元素级 |
|
|
|
计算元素-wise |
|
计算元素-wise |
|
计算元素-wise |
|
计算元素-wise |
|
别名: |
可用的就地二进制运算符都是上述所有,除了:
输入指数和的对数的对数。 |
|
输入指数和的以 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, --, --]
)
当前支持以下操作:
返回每个输入张量的 1 维视图,其中没有零维。 |
|
根据广播语义广播给定的张量。 |
|
将 |
|
在指定维度上连接给定的张量序列 |
|
尝试将张量分割成指定的块数。 |
|
通过水平堆叠张量 |
|
将具有三个或更多维度的张量 |
|
将 |
|
将具有一个或多个维度的张量 |
|
水平(按列)顺序堆叠张量。 |
|
计算由 |
|
根据 attr:tensors 中的 1D 输入创建坐标网格。 |
|
返回一个新的张量,它是 |
|
从批处理的输入张量中提取滑动局部块。 |
|
返回一个连续的展平张量。 |
|
沿选定维度在给定索引处切割 |
|
将张量分割成块。 |
|
沿新维度连接一系列张量。 |
|
预期 |
|
返回一个张量,它是 |
|
将具有两个或更多维度的张量 |
|
将张量按顺序垂直堆叠(按行)。 |
|
返回 |
|
将此张量扩展到与 |
|
返回一个具有与 |
|
以与 |
|
返回原始张量的一个视图,该视图包含从 |
|
返回一个新张量,其数据与 |