介绍
.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会报错,必须转为布尔型才能正确识别“需要屏蔽的位置”。
总结
.bool()是 PyTorch 张量的类型转换方法,将数值张量转为布尔张量(0→False,非0→True);- 在注意力掩码场景中,
.bool()是连接“数值掩码(0/1)”和“可使用的布尔掩码”的关键步骤; masked_fill等掩码相关方法必须配合布尔掩码使用,.bool()是实现这一目标的核心操作。