expand和unsqueeze在一些情况使用的含义

本文详细介绍了PyTorch中的unsqueeze和expand两个张量操作,通过实例解析它们如何改变张量的维度和形状。情况一展示了如何使用unsqueeze和expand将一个[B,L,F]的张量转换为[B,L,F,F],用于一阶马尔可夫模型。而在情况二中,探讨了可能的应用,如嵌套NER任务,通过形成一个首尾矩阵来表示句子中不同位置之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情况一

input:

1
2
3
4
5
6
import torch

# a 模拟的是: batch_size: 2, sequence_length:3, feature: 4
a = torch.arange(24).reshape(2, 3, 4)
# b 代表的是: feature: 4 * 4
b = a.unsqueeze(2).expand(-1, -1, 4, -1) # shape: torch.Size([2, 3, 4, 4])

output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

a[0]
>>> tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])


b[0]

>>>tensor([[[ 0, 1, 2, 3],
[ 0, 1, 2, 3],
[ 0, 1, 2, 3],
[ 0, 1, 2, 3]],
[[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[ 8, 9, 10, 11],
[ 8, 9, 10, 11],
[ 8, 9, 10, 11]]])

换种说法就是:

a: [B, L, F]
b: [B, L, F, F]

每个字对应一个[F, F]的矩阵
这个矩阵的第i行第j列的元素的含义是:上一时刻tag为i, 这一时刻tag为j的分数。比如应用到一阶马尔可夫相关的模型中。

情况二(这种情况没真实测试过,需谨慎对待)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# b 代表的是: sequence length: 3 * 3
b = a.unsqueeze(1).expand(-1, 3, -1, -1) # shape: torch.Size([2, 3, 3, 4])


b[0]

tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])

即这个长度为3的句子形成一个首尾的矩阵,最后一维代表相关的概率。

比如在嵌套ner任务中,

0.030.020.050.9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ox180x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值