torch.masked¶
介绍¶
动机¶
警告
PyTorch API 中的掩码张量处于原型阶段,未来可能会发生变化,也可能不会发生变化。
MaskedTensor 作为 torch.Tensor 的扩展,为用户提供了以下功能:
使用任何掩码语义(例如变长张量、nan* 运算符等)
区分0和NaN梯度
各种稀疏应用(见下面的教程)
“指定”和“未指定”在 PyTorch 中有着悠久的历史,但没有正式的语义,当然也没有一致性;事实上,MaskedTensor 的诞生源于普通 torch.Tensor
类无法妥善解决的一系列问题。因此,MaskedTensor 的主要目标之一是成为 PyTorch 中“指定”和“未指定”值的权威来源,使它们成为一流的公民,而不是事后的想法。
反过来,这应该进一步释放 稀疏性的潜力,
实现更安全、更一致的运算符,并为用户和开发者提供更流畅、更直观的体验。
什么是 MaskedTensor?¶
MaskedTensor 是一个张量子类,由 1) 一个输入(数据)和 2) 一个掩码组成。掩码告诉我们应该包含或忽略输入中的哪些条目。
举例来说,假设我们想要屏蔽所有等于0的值(用灰色表示)并取最大值:
上方是普通的张量示例,而下方是MaskedTensor,其中所有的0都被屏蔽了。 这显然会根据我们是否有掩码而产生不同的结果,但这种灵活的结构 允许用户在计算过程中系统性地忽略他们希望忽略的任何元素。
我们已经编写了许多现有的教程来帮助用户入门,例如:
支持的运算符¶
一元运算符¶
一元运算符是只包含单个输入的运算符。 将其应用于MaskedTensors相对简单:如果给定索引处的数据被屏蔽, 我们将应用该运算符,否则我们将继续屏蔽数据。
可用的单目运算符有:
绝对值 |
计算 |
绝对值 |
别名用于 |
acos |
计算 |
arccos |
别名用于 |
acosh |
返回一个新的张量,其中包含 |
arccosh |
别名用于 |
角度 |
计算给定 |
asin |
返回一个新的张量,其中包含 |
arcsin |
别名用于 |
asinh |
返回一个新的张量,其中包含 |
arcsinh |
别名 |
atan |
返回一个新的张量,包含 |
arctan |
别名用于 |
atanh |
返回一个新的张量,其中包含 |
arctanh |
别名 |
bitwise_not |
计算给定输入张量的按位取反。 |
ceil |
返回一个新的张量,其中包含 |
clamp |
|
clip |
别名用于 |
conj_physical |
计算给定 |
cos |
返回一个新的张量,其中包含 |
cosh |
返回一个新的张量,其中包含 |
deg2rad |
返回一个新的张量,其中包含将 |
digamma |
|
erf |
别名用于 |
erfc |
别名用于 |
erfinv |
|
exp |
返回一个新的张量,其中包含输入张量 |
exp2 |
别名用于 |
expm1 |
|
fix |
别名用于 |
floor |
返回一个新的张量,其中包含 |
frac |
计算 |
lgamma |
计算伽马函数在 |
log |
返回一个新的张量,其中包含 |
log10 |
返回一个新的张量,其中包含 |
log1p |
返回一个新的张量,包含(1 + |
log2 |
返回一个新的张量,其中包含 |
logit |
别名用于 |
i0 |
|
isnan |
返回一个包含布尔元素的新张量,表示 |
nan_to_num |
替换 |
neg |
返回一个新的张量,其中包含 |
negative |
别名用于 |
positive |
返回 |
pow |
将 |
rad2deg |
返回一个新的张量,其中包含将 |
倒数 |
返回一个新的张量,其中包含 |
round |
将 |
rsqrt |
返回一个新的张量,其中包含 |
sigmoid |
别名用于 |
符号 |
返回一个新的张量,其中包含 |
sgn |
此函数是 torch.sign() 对复数张量的扩展。 |
signbit |
测试 |
sin |
返回一个新的张量,其中包含 |
sinc |
|
sinh |
返回一个新的张量,其中包含 |
sqrt |
返回一个新的张量,其中包含 |
平方 |
返回一个新的张量,其中包含 |
tan |
返回一个新的张量,其中包含 |
tanh |
返回一个新的张量,其中包含 |
trunc |
返回一个新的张量,其中包含 |
可用的就地一元运算符包括上述所有除了:
角度 |
计算给定 |
positive |
返回 |
signbit |
测试 |
isnan |
返回一个包含布尔元素的新张量,表示 |
二元运算符¶
正如您在教程中可能已经看到的,MaskedTensor 也实现了二元操作,但需要注意的是,两个 MaskedTensor 的掩码必须匹配,否则将引发错误。正如错误中提到的,如果您需要对特定操作符的支持或提出了它们应如何表现的语义建议,请在 GitHub 上提出问题。目前,我们决定采用最保守的实现,以确保用户确切地知道发生了什么,并且对他们的掩码语义决策是有意的。
可用的二元运算符有:
add |
将 |
atan2 |
逐元素的反正切值 ,考虑了象限。 |
arctan2 |
别名 |
bitwise_and |
计算 |
bitwise_or |
计算 |
按位异或 |
计算 |
bitwise_left_shift |
计算 |
bitwise_right_shift |
计算 |
div |
将输入的每个元素 |
divide |
别名用于 |
floor_divide |
|
fmod |
逐元素应用 C++ 的 std::fmod。 |
logaddexp |
输入的指数和的对数。 |
logaddexp2 |
以2为底的输入的指数和的对数。 |
mul |
将 |
multiply |
别名用于 |
nextafter |
返回 |
余数 |
逐元素计算 Python 的取模运算。 |
sub |
从 |
subtract |
别名用于 |
true_divide |
别名,用于 |
eq |
计算元素逐个相等性 |
ne |
计算 逐元素。 |
le |
计算 逐元素。 |
ge |
计算 逐元素。 |
greater |
别名用于 |
greater_equal |
别名用于 |
gt |
计算 逐元素。 |
less_equal |
别名用于 |
lt |
计算 逐元素。 |
less |
别名用于 |
最大值 |
计算 |
最小值 |
计算 |
fmax |
计算 |
fmin |
计算 |
not_equal |
别名用于 |
可用的就地二元运算符包括上述所有除了:
logaddexp |
输入的指数和的对数。 |
logaddexp2 |
以2为底的输入的指数和的对数。 |
equal |
|
fmin |
计算 |
最小值 |
计算 |
fmax |
计算 |
归约¶
以下是可用的缩减操作(支持自动微分)。更多信息,请参阅 概述教程, 其中详细介绍了一些缩减操作的示例,而 高级语义教程 则进一步深入讨论了我们如何确定某些缩减语义。
sum |
返回 |
均值 |
返回 |
amin |
返回在给定维度 |
amax |
返回在给定维度 |
argmin |
返回展平张量或沿某个维度最小值的索引 |
argmax |
返回 |
prod |
返回 |
all |
测试 |
norm |
返回给定张量的矩阵范数或向量范数。 |
var |
计算由 |
std |
计算由 |
查看和选择函数¶
我们还包括了许多视图和选择函数;直观地说,这些操作符将同时应用于数据和掩码,然后将结果包装在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, --, --]
)
目前支持以下操作:
atleast_1d |
返回每个输入张量的零维度的1维视图。 |
broadcast_tensors |
根据广播语义广播给定的张量。 |
broadcast_to |
将 |
cat |
在给定的维度上连接给定的 |
chunk |
尝试将张量分割成指定数量的块。 |
column_stack |
通过水平堆叠 |
dsplit |
将 |
flatten |
将 |
hsplit |
将 |
hstack |
按顺序水平(列方向)堆叠张量。 |
kron |
计算克罗内克积,记为 ,由 |
meshgrid |
创建由attr:tensors中的一维输入指定的坐标网格。 |
narrow |
返回一个新的张量,它是 |
ravel |
返回一个连续的展平张量。 |
选择 |
沿着选定的维度在给定的索引处对 |
split |
将张量分割成多个块。 |
t |
期望 |
转置 |
返回一个张量的转置版本,该张量是 |
vsplit |
将 |
vstack |
按顺序垂直(行方向)堆叠张量。 |
返回一个新的视图,其中 |
|
将此张量扩展为与 |
|
返回一个与 |
|
返回此张量,其形状与 |
|
返回一个与 |