Python 在某个指数后用零填充火炬张量
给定一个3d tenzor,说:Python 在某个指数后用零填充火炬张量,python,nlp,pytorch,Python,Nlp,Pytorch,给定一个3d tenzor,说: batch x句子长度x嵌入dim a = torch.rand((10, 1000, 96)) 以及每个句子实际长度的数组(或张量) lengths = torch .randint(1000,(10,)) 输出张量([370,502,652,859,545,964,566,576,1000,803.]) 如何根据张量“长度”在维度1(句子长度)的某个索引后用零填充张量“a” 我想要这样的smth: a[ : , lengths : , : ] =
batch x句子长度x嵌入dim
a = torch.rand((10, 1000, 96))
以及每个句子实际长度的数组(或张量)
lengths = torch .randint(1000,(10,))
输出张量([370,502,652,859,545,964,566,576,1000,803.])
如何根据张量“长度”在维度1(句子长度)的某个索引后用零填充张量“a”
我想要这样的smth:
a[ : , lengths : , : ] = 0
一种方法(如果批量足够大,则速度较慢):
您可以使用二进制掩码执行此操作。
使用
length
作为mask
的列索引,我们指示每个序列的结束位置(注意,我们使mask
比a.size(1)
长,以允许序列具有完整长度)。我们使用将seq len后面的
掩码中的所有条目设置为1
mask=torch.zero(a.shape[0],a.shape[1]+1,dtype=a.dtype,device=a.device)
面具[(火炬形状[0]),长度]=1
mask=mask.cumsum(dim=1)[:,:-1]#删除多余的列
a=a*(1.-掩码[…,无]#在每列之后使用掩码归零
对于a.shape=(10,5,96)
,和长度=[1,2,1,1,3,0,4,4,1,3]
将1分配给每行相应的长度
,掩码
如下所示:
mask=
张量([[0,1,0,0,0,0,0.]),
[0., 0., 1., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.]])
在cumsum
之后
mask=
张量([[0,1,1,1,1,1.],
[0., 0., 1., 1., 1.],
[0., 1., 1., 1., 1.],
[0., 1., 1., 1., 1.],
[0., 0., 0., 1., 1.],
[1., 1., 1., 1., 1.],
[0., 0., 0., 0., 1.],
[0., 0., 0., 0., 1.],
[0., 1., 1., 1., 1.],
[0., 0., 0., 1., 1.]])
请注意,它在有效序列条目所在的位置正好有零,并且在序列长度之外有一个。拿着1-面具
就能得到你想要的东西
享受;)
for i_batch in range(10):
a[ i_batch , lengths[i_batch ] : , : ] = 0