Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在某个指数后用零填充火炬张量_Python_Nlp_Pytorch - Fatal编程技术网

Python 在某个指数后用零填充火炬张量

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 : , : ] =

给定一个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 : , : ]  = 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