pytorch api文档:张量的.bool()方法-将张量中的元素转换为布尔类型

介绍

.bool() 方法,这个方法是 PyTorch 张量的常用操作,主要用于将张量转换为布尔类型(True/False),在掩码处理等场景中非常关键。

作用

将原张量中的元素 转换为布尔值(bool 类型),返回一个新的布尔型张量,规则如下:

  • 数值 0 → False
  • 非 0 数值(正数/负数)→ True
  • 原张量的形状、设备(CPU/GPU)等属性与新张量保持一致。

语法

Tensor.bool() → Tensor

提示:torch.Tensor.to(torch.bool) 的简化写法,二者效果完全相同,.bool() 更简洁。

例子(结合掩码场景)

示例1:基础转换(理解数值→布尔的规则)

下面通过具体例子,尤其是结合你之前关注的注意力掩码场景,帮你理解 .bool() 的用法:

import torch


x = torch.tensor([0, 1, -2, 0.0, 3.5])
x_bool = x.bool()
print("基础数值转布尔:")
print(f"原张量:{x}")
print(f"布尔张量:{x_bool}")
# 输出:
# 原张量:tensor([ 0.0000,  1.0000, -2.0000,  0.0000,  3.5000])
# 布尔张量:tensor([False,  True,  True, False,  True])

示例2:结合torch.triu生成自回归掩码(重点!)

# 第一步:生成上三角为1、下三角为0的矩阵(seq_len=4)
mask_raw = torch.triu(torch.ones(4, 4), diagonal=1)
print("\n生成原始掩码矩阵:")
print(mask_raw)
# 输出:
# tensor([[0., 1., 1., 1.],
#         [0., 0., 1., 1.],
#         [0., 0., 0., 1.],
#         [0., 0., 0., 0.]])

# 第二步:转为布尔掩码(关键!1→True,0→False)
mask_bool = mask_raw.bool()
print("\n转为布尔掩码:")
print(mask_bool)
# 输出:
# tensor([[False,  True,  True,  True],
#         [False, False,  True,  True],
#         [False, False, False,  True],
#         [False, False, False, False]])

示例3:在masked_fill中使用布尔掩码(核心场景)

scores = torch.randn(1, 4, 4)  # 模拟注意力分数
print("\n原始注意力分数:")
print(scores)

# 用布尔掩码屏蔽位置(True的位置填充-1e9)
scores_masked = scores.masked_fill(mask_bool.unsqueeze(0), -1e9)
print("\n应用掩码后的注意力分数:")
print(scores_masked)

输出特征:

  • 布尔掩码中 True 对应需要屏蔽的“未来位置”,False 对应可关注的“当前/过去位置”;
  • masked_fill 方法会识别布尔张量的 True 位置,将这些位置的数值替换为指定值(如 -1e9)。

为什么必须用 .bool()?

在注意力掩码场景中,.bool() 是必要步骤,原因如下:

  • PyTorch 的 masked_fill 方法要求掩码必须是布尔型张量(或与输入同类型的数值张量,但布尔型更直观、高效);
  • 数值型掩码(如 0/1)直接传入 masked_fill 会报错,必须转为布尔型才能正确识别“需要屏蔽的位置”。

总结

  1. .bool() 是 PyTorch 张量的类型转换方法,将数值张量转为布尔张量(0→False,非0→True);
  2. 在注意力掩码场景中,.bool() 是连接“数值掩码(0/1)”和“可使用的布尔掩码”的关键步骤;
  3. masked_fill 等掩码相关方法必须配合布尔掩码使用,.bool() 是实现这一目标的核心操作。

原文出处:/show_1GW2cqDSt928.html