torch.masked¶
介绍¶
赋予动机¶
警告
掩码张量的 PyTorch API 处于原型阶段,将来可能会也可能不会更改。
使用任何掩码语义(例如可变长度张量、nan* 运算符等)
区分 0 和 NaN 梯度
各种稀疏应用程序(请参阅下面的教程)
“Specified” 和 “unspecified” 在 PyTorch 中有着悠久的历史,没有正式的语义,当然也没有
一致性;事实上,MaskedTensor 诞生于 vanilla 类无法正确解决的一系列问题。因此,MaskedTensor 的主要目标是成为
在 PyTorch 中表示“指定”和“未指定”值,它们是一等公民,而不是事后的想法。
反过来,这应该会进一步释放稀疏的潜力,
使操作员更安全、更一致,并提供更流畅、更直观的体验
对用户和开发人员来说都是如此。
什么是 MaskedTensor?¶
MaskedTensor 是一个张量子类,由 1) 一个输入(数据)和 2) 一个掩码组成。面具告诉我们 应包含或忽略 input 中的哪些条目。
举个例子,假设我们想屏蔽掉所有等于 0 的值(由灰色表示) 并取最大值:
![_images/tensor_comparison.jpg](https://pytorch.org/docs/2.5/_images/tensor_comparison.jpg)
顶部是 vanilla 张量示例,而底部是 MaskedTensor,其中所有 0 都被屏蔽掉了。 这显然会产生不同的结果,具体取决于我们是否有掩码,但这种灵活的结构 允许用户在计算过程中系统地忽略他们想要的任何元素。
我们已经编写了许多现有的教程来帮助用户入门,例如:
支持的运算符¶
一元运算符¶
一元运算符是仅包含单个输入的运算符。 将它们应用于 MaskedTensors 相对简单:如果数据在给定索引处被屏蔽,则 我们应用运算符,否则我们将继续屏蔽数据。
可用的一元运算符包括:
计算 中每个元素的绝对值。 |
|
计算 中每个元素的反余弦值。 |
|
返回一个具有 的元素的反双曲余弦的新张量。 |
|
计算给定张量的元素角度(以弧度为单位)。 |
|
返回一个新张量,其中包含 的元素的反正弦值。 |
|
返回一个新张量,其中包含 的元素的反双曲正弦值。 |
|
返回一个具有 元素的反正切值的新张量。 |
|
返回一个具有 的元素的反双曲正切的新张量。 |
|
计算给定输入张量的按位 NOT。 |
|
返回一个新的张量,其中元素的 ceil 为 ,大于或等于每个元素的最小整数。 |
|
计算给定张量的元素共轭。 |
|
返回一个新张量,其元素的余弦值为 。 |
|
返回一个具有 元素的双曲余弦值的新张量。 |
|
返回一个新的张量,其中包含从以度为单位的角度转换为弧度的每个元素。 |
|
返回一个新张量,其 input tensor 的元素是指数。 |
|
返回一个新张量,其中元素的下限为 ,是小于或等于每个元素的最大整数。 |
|
计算 中每个元素的小数部分。 |
|
计算 上 的 gamma 函数绝对值的自然对数。 |
|
返回一个具有 元素的自然对数的新张量。 |
|
返回一个新的张量,其对数为 的 以 的 10 为底的元素。 |
|
返回自然对数为 (1 + ) 的新张量。 |
|
返回一个新的张量,其对数为 以 的 2 为底的元素。 |
|
返回一个新的张量,其中包含布尔元素,表示 的每个元素是否为 NaN。 |
|
将 、 中的正无穷大和负无穷大值分别替换为 、 和 中指定的值。 |
|
返回一个元素为 负数的新张量。 |
|
返回。 |
|
获取 with 中每个元素的幂,并返回包含结果的张量。 |
|
返回一个新的张量,其中每个元素都从以弧度为单位的角度转换为度数。 |
|
返回一个新张量,其中包含 的元素的倒数 |
|
将 的元素舍入到最接近的整数。 |
|
返回一个新的张量,其中包含 的每个元素的平方根的倒数。 |
|
返回一个带有 元素符号的新张量。 |
|
此函数是 torch.sign() 对复杂张量的扩展。 |
|
测试每个元素是否设置了其符号位。 |
|
返回一个新张量,其中包含 的元素的正弦值。 |
|
返回一个具有 元素的双曲正弦值的新张量。 |
|
返回一个具有 元素的平方根的新张量。 |
|
返回一个新张量,其元素为 的平方。 |
|
返回一个新张量,其元素的正切值为 。 |
|
返回一个具有 元素的双曲正切的新张量。 |
|
返回一个新的张量,其中包含 的元素的截断整数值。 |
可用的就地一元运算符是上述所有运算符,但以下情况除外:
计算给定张量的元素角度(以弧度为单位)。 |
|
返回。 |
|
测试每个元素是否设置了其符号位。 |
|
返回一个新的张量,其中包含布尔元素,表示 的每个元素是否为 NaN。 |
二元运算符¶
正如您可能在本教程中看到的那样,还实现了二进制运算,但需要注意
两个 MaskedTensor 中的掩码必须匹配,否则将引发错误。如错误中所述,如果您
需要对特定运算符的支持,或者已经提出了它们应该如何行为的语义,请打开
GitHub 上的问题。目前,我们决定采用最保守的实现方式,以确保用户
确切地知道发生了什么,并且有意识地使用掩码语义来做出决策。MaskedTensor
可用的二元运算符有:
将 、缩放比例为 的 添加到 。 |
|
元素反正切考虑到象限。 |
|
计算 和 的按位 AND 。 |
|
计算 和 的按位 OR 。 |
|
计算 和 的按位 XOR 。 |
|
计算 by bits 的左算术移位。 |
|
计算按位的正确算术移位。 |
|
将输入的每个元素除以 的相应元素。 |
|
逐个入口应用 C++ 的 std::fmod。 |
|
输入的幂和的对数。 |
|
以 2 为基数的输入的幂数之和的对数。 |
|
乘以 。 |
|
返回 towards 之后的下一个浮点值 , elementwise。 |
|
按入口计算 Python 的模运算。 |
|
从 中减去 、缩放 、 。 |
|
的别名 |
|
计算元素相等性 |
|
计算元素。 |
|
计算元素。 |
|
计算元素。 |
|
计算元素。 |
|
计算元素。 |
|
计算 和 的元素最大值。 |
|
计算 和 的元素最小值。 |
|
计算 和 的元素最大值。 |
|
计算 和 的元素最小值。 |
|
可用的就地二进制运算符是上述所有运算符,除了:
输入的幂和的对数。 |
|
以 2 为基数的输入的幂数之和的对数。 |
|
|
|
计算 和 的元素最小值。 |
|
计算 和 的元素最小值。 |
|
计算 和 的元素最大值。 |
减少¶
以下缩减可用(支持 autograd)。有关更多信息,请参阅概述教程 详细介绍了一些 Reduction 的示例,而 Advanced semantics 教程 对我们如何决定某些归约语义进行了一些进一步的深入讨论。
返回张量中所有元素的总和。 |
|
返回张量中所有元素的平均值。 |
|
返回给定 dimension(s) 中张量的每个切片的最小值。 |
|
返回给定 dimension(s) 中张量的每个切片的最大值。 |
|
返回展平张量的最小值或沿维度的索引 |
|
返回张量中所有元素的最大值的索引。 |
|
返回张量中所有元素的乘积。 |
|
测试 中的所有元素是否计算结果都为 True。 |
|
返回给定张量的矩阵范数或向量范数。 |
|
计算 指定的维度的差异。 |
|
计算 指定的维度的标准差。 |
View 和选择函数¶
我们还包含了许多 view 和 select 函数;直观地,这些运算符将应用于
数据和掩码,然后将结果包装在 .举个简单的例子,
考虑一下 :
MaskedTensor
>>> 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, --, --]
)
目前支持以下操作:
返回每个输入张量的一维视图,维度为零。 |
|
根据 Broadcasting 语义广播给定的 Tensor。 |
|
广播到形状 。 |
|
连接给定维度中的给定张量序列。 |
|
尝试将张量拆分为指定数量的块。 |
|
通过在 中水平堆叠张量来创建新的张量。 |
|
根据 ,将具有三个或更多维度的张量 (Splits) 深度划分为多个张量。 |
|
通过将其重塑为一维张量来展平。 |
|
Splits ,根据 将具有一个或多个维度的张量水平拆分为多个张量。 |
|
水平顺序(逐列)堆叠张量。 |
|
计算 Kronecker 乘积,表示为、 的 和 。 |
|
创建由 attr:tensors 中的 1D 输入指定的坐标网格。 |
|
返回一个新的 Tensor,该 Tensor 是 Tensor 的缩小版本。 |
|
从批处理的输入张量中提取滑动局部块。 |
|
返回一个连续的扁平化张量。 |
|
在给定索引处沿所选维度对张量进行切片。 |
|
将张量拆分为块。 |
|
沿新维度连接一系列张量。 |
|
期望为 <= 2-D 张量并转置维度 0 和 1。 |
|
返回一个张量,该张量是 的转置版本。 |
|
根据 将具有两个或多个维度的张量垂直拆分为多个张量。 |
|
按顺序垂直(逐行)堆叠张量。 |
|
返回张量的新视图,其中单例维度扩展为更大的大小。 |
|
将此张量扩展为与 相同的大小。 |
|
返回一个张量,其数据和元素数与指定形状相同。 |
|
返回与 相同的形状的此张量。 |
|
返回原始张量的视图,其中包含维度中 tensor 的所有大小切片。 |
|
返回一个新张量,其数据与张量相同,但具有不同的 。 |