TensorFlow:如何定制收集/分割张量?

时间:2017-02-25 13:22:24

标签: python machine-learning tensorflow nlp deep-learning

请允许我简要介绍一下背景知识。我正在研究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.gathertf.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()

有人能给我一个提示吗?我怎么能解决问题,还是使用内置函数更容易?提前谢谢。

0 个答案:

没有答案