PyTorch中None的使用

在 PyTorch 中,None 用于在张量中插入一个新的维度。它可以被看作是通过增加一个轴来改变张量的形状。这是一种有效的方式来实现广播(broadcasting),让不同形状的张量在进行操作时能够匹配。

mask = torch.arange((maxlen), dtype=torch.float32,  
                    device=X.device)[None, :] < valid_len[:, None]

逐步解析

  1. torch.arange(maxlen)

这是一个创建从 0 到 maxlen-1 的一维张量。假设 maxlen 是 5,那么这个张量的输出是:

tensor([0, 1, 2, 3, 4])
  1. [None, :]

在这个部分,None 添加了一个新维度。通过使用 None,将原来的 1D 张量(形状为 (maxlen,))变为 2D 张量(形状为 (1, maxlen))。例如,在 maxlen 为 5 的情况下,变为:

tensor([[0, 1, 2, 3, 4]])
  1. valid_len[:, None]

假设 valid_len 是一个一维张量,形状为 (batch_size,)。使用 [:, None] 也会在这个张量的外侧添加一个新的维度,从而将其变为 2D 张量,形状为 (batch_size, 1)。例如,假如 valid_len 为 tensor([3, 4])(2个元素),则变为:

tensor([[3],  
        [4]])
  1. 进行比较
    现在mask的表达式部分是:
tensor([[0, 1, 2, 3, 4]]) < tensor([[3], [4]])

这个操作会利用广播规则来进行比较,生成一个布尔类型的 mask,其形状将会为 (batch_size, maxlen),表示每个元素是否小于 valid_len 对应的值。例如:

tensor([[ True,  True,  True,  True, False],  # 对应 valid_len 为 3  
        [ True,  True,  True, False, False]])  # 对应 valid_len 为 4

总结

None 的使用允许我们在进行比较时,确保每个张量的形状正确,以便利用广播功能进行逐元素的比较操作。通过插入新维度,我们可以很方便地处理不同形状的张量,而不需要手动扩展或改变它们的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值