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 为底的对数。 | |
| 如果两个张量大小和元素相同,则为  | |
| 计算  | |
| 计算  | |
| 计算  | 
归约¶
以下归约可用(支持自动微分)。有关更多信息,概述 教程详细介绍了一些归约示例,而 高级语义 教程对我们如何决定某些归约语义进行了更深入的讨论。
| 返回  | |
| 返回  | |
| 返回  | |
| 返回给定维度  | |
| 返回扁平化张量或沿某个维度上的最小值索引。 | |
| 返回  | |
| 返回  | |
| 测试  | |
| 返回给定张量的矩阵范数或向量范数。 | |
| 计算由  | |
| 计算由  | 
视图和选择函数¶
我们还包含了一些视图和选择函数;直观地说,这些运算符将同时应用于数据和掩码,然后将结果包装在 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 输入指定的坐标网格。 | |
| 返回一个新的张量,它是  | |
| 返回一个连续的扁平张量。 | |
| 在给定索引处沿选定维度对  | |
| 将张量拆分为块。 | |
| 期望  | |
| 返回一个张量,它是  | |
| 根据  | |
| 将张量按垂直方向(按行)依次堆叠。 | |
| 返回一个新的  | |
| 将此张量扩展到与  | |
| 返回一个与  | |
| 返回此张量,其形状与  | |
| 返回一个新的张量,其数据与  |