【发布时间】:2021-08-14 21:44:48
【问题描述】:
我正在尝试平均子词嵌入以形成词级表示。每个单词都有一个对应的开始和结束索引,表示该单词由哪些子词组成。
sequence_output 是 B * 3 * 2 的张量,其中 3 是最大序列长度,2 是特征数。
all_token_mapping 是一个 B * 3 * 2 的张量,其中包含一个开始和结束索引。
initial_reps 是 num_nodes * 2 的张量,num_nodes 是不同样本中所有词(不是子词)数的总和。
sequence_output = torch.arange(2*3*2).float().reshape(2, 3, 2)
tensor([[[ 0., 1.],
[ 2., 3.],
[ 4., 5.]],
[[ 6., 7.],
[ 8., 9.],
[10., 11.]]])
all_token_mapping = torch.tensor([[[0,0],[1,2],[-1,-1]], [[0,2],[-1,-1],[-1,-1]]])
tensor([[[ 0, 0],
[ 1, 2],
[-1, -1]],
[[ 0, 2],
[-1, -1],
[-1, -1]]])
num_nodes = 0
for sample in all_token_mapping:
for mapping in sample:
if mapping[0] != -1:
num_nodes += 1
3
initial_reps = torch.empty((num_nodes, 2), dtype=torch.float32)
current_idx = 0
for i, feature_tokens_mapping in enumerate(all_token_mapping):
for j, token_mapping in enumerate(feature_tokens_mapping):
if token_mapping[0] == -1: # reached the end for this particular sequence
break
initial_reps[current_idx] = torch.mean(sequence_output[i][token_mapping[0]:token_mapping[-1] + 1], 0, keepdim=True)
current_idx += 1
initial_reps
tensor([[0., 1.],
[3., 4.],
[8., 9.]])
在上面的例子中,initial_reps[0] 将是 sequence_output[0][0:1] 的均值,initial_reps[1] 将是 sequence_output[0][1:3] 的均值,initial_reps[2 ] 将是 sequence_output[1][0:3] 的平均值。
我当前的代码将创建一个长度为 num_nodes 的空张量,并且 for 循环将通过检查 token_mapping[0] 和 token_mapping[1] 来计算每个索引处的值,以获取要平均的 sequence_output 的正确切片。
有没有办法向量化这段代码?
此外,我有一个列表,其中包含每个样本的单词数。即列表中所有元素的总和 == num_nodes
【问题讨论】:
-
如果没有包含输入和预期输出示例的最小可重现示例,则很难帮助您:stackoverflow.com/help/minimal-reproducible-example。
-
嗨,很抱歉……我已经简化了示例并添加了输入和预期输出。你能再看看吗?谢谢!
标签: python numpy machine-learning pytorch vectorization