torch.masked¶
简介¶
动机¶
警告
掩码张量的 PyTorch API 处于原型阶段,将来可能会更改。
MaskedTensor 是 torch.Tensor
的扩展,它允许用户
使用任何掩码语义(例如可变长度张量、nan* 运算符等)
区分 0 和 NaN 梯度
各种稀疏应用(见下面的教程)
“指定”和“未指定”在 PyTorch 中有着悠久的历史,但没有正式的语义,当然也不一致;事实上,MaskedTensor 是由于 vanilla torch.Tensor
类无法正确解决的一系列问题而诞生的。因此,MaskedTensor 的主要目标是成为 PyTorch 中上述“指定”和“未指定”值的真相来源,使它们成为一等公民,而不是事后才想到的。反过来,这将进一步释放 稀疏性 的潜力,使运算符更安全、更一致,并为用户和开发人员提供更流畅、更直观的体验。
什么是 MaskedTensor?¶
MaskedTensor 是一个张量子类,它包含 1) 输入(数据)和 2) 掩码。掩码告诉我们应该包含或忽略输入中的哪些条目。
例如,假设我们想要屏蔽所有等于 0 的值(用灰色表示)并取最大值
顶部是 vanilla 张量示例,底部是 MaskedTensor,其中所有 0 都被屏蔽。这清楚地表明,根据我们是否拥有掩码,结果会有所不同,但这种灵活的结构允许用户在计算过程中系统地忽略他们想要的任何元素。
我们已经编写了许多现有的教程来帮助用户入门,例如
支持的运算符¶
一元运算符¶
一元运算符是只包含单个输入的运算符。将它们应用于 MaskedTensor 相对简单:如果数据在给定索引处被屏蔽,我们将应用运算符,否则我们将继续屏蔽数据。
可用的 一元运算符 是
计算 |
|
|
|
计算 |
|
|
|
返回一个新张量,包含 |
|
|
|
计算给定 |
|
返回一个新张量,包含 |
|
|
|
返回一个新张量,包含 |
|
|
|
返回一个新的张量,包含 |
|
是 |
|
返回一个新的张量,包含 |
|
是 |
|
计算给定输入张量的按位非操作。 |
|
返回一个新的张量,包含 |
|
是 |
|
计算给定 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,将 |
|
是 |
|
是 |
|
是 |
|
是 |
|
返回一个新的张量,包含输入张量 |
|
是 |
|
是 |
|
是 |
|
返回一个新的张量,包含 |
|
计算 |
|
计算 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 (1 + |
|
返回一个新的张量,包含 |
|
是 |
|
是 |
|
返回一个新的张量,包含布尔元素,表示 |
|
将 |
|
返回一个新的张量,包含 |
|
是 |
|
返回 |
|
将 |
|
返回一个新的张量,将 |
|
返回一个新的张量,包含 |
|
将 |
|
返回一个新的张量,包含 |
|
是 |
|
返回一个新的张量,包含 |
|
此函数是 torch.sign() 对复数张量的扩展。 |
|
测试 |
|
返回一个新的张量,包含 |
|
是 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
|
返回一个新的张量,包含 |
可用的就地一元运算符是以上所有运算符,**除外**
计算给定 |
|
返回 |
|
测试 |
|
返回一个新的张量,包含布尔元素,表示 |
二元运算符¶
正如您可能在教程中看到的那样,MaskedTensor
也实现了二元运算,但前提是两个 MaskedTensor 中的掩码必须匹配,否则会抛出错误。如错误中所述,如果您需要对特定运算符的支持,或者对它们应该如何行为提出了语义建议,请在 GitHub 上打开一个问题。目前,我们决定采用最保守的实现,以确保用户确切地知道发生了什么,并在使用掩码语义时做出明智的决定。
可用的二元运算符是
将 |
|
逐元素反正切值 ,考虑象限。 |
|
是 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
将输入 |
|
是 |
|
按元素应用 C++ 的 std::fmod。 |
|
输入指数和的对数。 |
|
输入指数和以 2 为底的对数。 |
|
将 |
|
是 |
|
返回 |
|
按元素计算 Python 的模运算。 |
|
从 |
|
是 |
|
是 |
|
计算按元素的相等性 |
|
计算 按元素进行。 |
|
计算 按元素进行。 |
|
计算 按元素进行。 |
|
是 |
|
是 |
|
计算 按元素进行。 |
|
是 |
|
计算 按元素进行。 |
|
是 |
|
计算 |
|
计算 |
|
计算 |
|
计算 |
|
是 |
可用的就地二元运算符是所有上述运算符,**除了**
输入指数和的对数。 |
|
输入指数和以 2 为底的对数。 |
|
如果两个张量大小和元素相同,则为 |
|
计算 |
|
计算 |
|
计算 |
缩减¶
以下缩减操作可用(支持自动梯度)。有关更多信息,概述 教程详细介绍了一些缩减操作示例,而 高级语义 教程更深入地讨论了我们如何决定某些缩减语义。
返回 |
|
返回 |
|
返回给定维度 |
|
返回给定维度 |
|
返回扁平化张量或沿某个维度最小值(s) 的索引 |
|
返回 |
|
返回 |
|
测试 |
|
返回给定张量的矩阵范数或向量范数。 |
|
计算由 |
|
计算由 |
视图和选择函数¶
我们还包含了一些视图和选择函数;直观地,这些运算符将同时应用于数据和掩码,然后将结果包装在 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 输入指定的坐标网格。 |
|
返回一个新的张量,它是 |
|
返回一个连续的扁平化张量。 |
|
沿着给定索引处的选定维度切片 |
|
将张量分成块。 |
|
期望 |
|
返回一个张量,它是 |
|
根据 |
|
将张量按顺序垂直(按行)堆叠。 |
|
返回一个新的 |
|
将此张量扩展到与 |
|
返回一个与 |
|
将此张量返回为与 |
|
返回一个新的张量,与 |