请允许我简要介绍一下背景知识。我正在研究Bi-LSTM-CRF架构来执行序列标记任务。我想收集属于同一段的特征向量,并对它们求平均值,然后将段特征发送到CRF,而不是将LSTM编码的各个步骤的特征馈送到CRF层。该方法在序列分块神经模型中提出。
现在我们有一个3D张量X
[batch_size,num_steps,num_features] 和一个2D张量Xl
[batch_size,num_steps] 指示序列的IOB标签。我如何收集属于同一段的特征向量并将其转换为4D输出张量 [batch_size,max_segment_num,max_segment_len,num_features] ?段边界由IOB标签确定,其中 B 表示开头, I 表示内部令牌。
X:
[[v11, v12, v13, v14, v15],
[v21, v22, v23, v24, v25],
...]
IOB labels:
[[B, I, B, I, I],
[B, B, I, I, B],
...]
and the expected output:
[[[v11, v12], [v13, v14, v15]],
[[v21], [v22, v23, v24], [v25]],
...]
with the output, we can compute segment features:
[[u11, u12, 0], # supposing max_segment_num = 3
[u21, u22, u23],
...]
我调查了一些内置函数,例如tf.gather
或tf.split
,但据我所知,它们都不支持自定义方式。我也研究了掩蔽函数,但没有弄清楚它们是如何帮助的。
我尝试手动操纵张量并分配给新创建的4D张量,但卡在那里。模型定义中的张量X是占位符,并在训练中提供数据。因此,以下声明失败,抱怨我们现在必须将数据提供给占位符。
for i in range(batch_size):
...
for j in range(max_segment_num):
...
seg_tensor = tf.gather(X[i,:], rng) # rng is the segment range
average_feature = tf.reduce_mean(seg_tensor, axis=0)
update_op = outputs[i, j, :].assign(average_feature)
update_op.run()
有人能给我一个提示吗?我怎么能解决问题,还是使用内置函数更容易?提前谢谢。