torch.masked¶
介绍¶
动机¶
警告
PyTorch 中掩码张量的 API 处于原型阶段,未来可能会或不会发生变化。
MaskedTensor 作为 torch.Tensor 的扩展,为用户提供了以下能力:
使用任何掩码语义(例如,可变长度张量、nan* 运算符等)
区分 0 和 NaN 梯度
各种稀疏应用(请参见下面的教程)
“指定”和“未指定”在PyTorch中有着悠久的历史,但从未有正式的语义,更不用说一致性了;实际上,MaskedTensor 的诞生源于普通 torch.Tensor
类无法妥善解决的一系列问题。因此,MaskedTensor 的主要目标是成为 PyTorch 中所述“指定”和“未指定”值的权威来源,使其成为首要考虑因素而非事后补救。
反过来,这应该进一步释放 稀疏性 的潜力,
实现更安全、更一致的操作,并为用户和开发者提供更顺畅、更直观的体验。
什么是 MaskedTensor?¶
一个 MaskedTensor 是一个张量的子类,它由以下两部分组成:1) 输入(数据),以及 2) 一个掩码。该掩码告诉我们输入中的哪些条目应该被包含或忽略。
举个例子,假设我们想要屏蔽所有等于 0(用灰色表示)的值,并取最大值:
上方是普通张量示例,而下方是 MaskedTensor,其中所有的 0 都被屏蔽掉了。 这显然会根据我们是否拥有掩码产生不同的结果,但这种灵活的结构允许用户在计算过程中系统地忽略任何他们想要忽略的元素。
我们已经编写了若干教程,以帮助用户快速上手,例如:
支持的操作符¶
一元运算符¶
一元运算符是仅包含单个输入的运算符。 将其应用于 MaskedTensors 相对简单:如果在给定索引处数据被屏蔽,则应用该运算符;否则,我们继续屏蔽这些数据。
可用的单目运算符有:
计算 |
|
别名为 |
|
计算 |
|
别名为 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
计算给定 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
计算给定输入张量的按位NOT。 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
计算给定 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中 |
|
别名为 |
|
别名为 |
|
返回一个新的张量,其中包含输入张量 |
|
别名为 |
|
别名为 |
|
返回一个新的张量,其中包含 |
|
计算 |
|
计算伽玛函数绝对值的自然对数在 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 (1 + |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
返回一个新的张量,其中的布尔元素表示 |
|
将 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
返回 |
|
对 |
|
返回一个新的张量,其中 |
|
返回一个新的张量,其元素是 |
|
将 |
|
返回一个新的张量,其中每个元素是 |
|
返回一个新的张量,其中元素的符号与 |
|
此函数是torch.sign()对复数张量的扩展。 |
|
测试 |
|
返回一个新的张量,其中包含 |
|
别名为 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含 |
|
返回一个新的张量,其中包含元素 |
可用的原地一元运算符包括以上所有除外:
计算给定 |
|
返回 |
|
测试 |
|
返回一个新的张量,其中的布尔元素表示 |
二元运算符¶
如您在教程中所见,MaskedTensor 也实现了二进制操作,但需要注意的是两个 MaskedTensors 中的掩码必须匹配,否则将引发错误。如错误信息所述,如果您需要特定运算符的支持或提出了它们应该如何行为的语义,请在 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, --, --]
)
目前支持以下操作:
返回每个输入张量的零维视图的一维表示。 |
|
根据广播语义广播给定的张量。 |
|
将 |
|
在给定的维度上连接给定的 |
|
尝试将张量分割成指定数量的块。 |
|
通过水平堆叠 |
|
将 |
|
将 |
|
将 |
|
按序列水平(列方向)堆叠张量。 |
|
计算克罗内克积,记作, |
|
创建由1D输入在attr:张量指定的坐标网格。 |
|
返回一个新的张量,它是 |
|
返回一个连续的展平张量。 |
|
沿选定维度在给定索引处切片 |
|
将张量分割成块。 |
|
期望 |
|
返回一个张量,它是 |
|
将 |
|
按垂直顺序(逐行)堆叠张量。 |
|
返回一个新视图的 |
|
将此张量扩展为与 |
|
返回一个与 |
|
返回与此张量形状相同的 |
|
返回一个与 |