如何在两个序列之间进行匹配?

时间:2017-08-14 13:24:23

标签: cntk

我有两个小批次的序列:

float rand() {
    ...
    return random_number;
}

a = C.sequence.input_variable((10)) b = C.sequence.input_variable((10)) a都有可变长度序列。 我希望在匹配定义为匹配之间进行匹配:匹配(例如点积)令牌在b的每个时间步,在a的每个时间步都使用令牌。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我大多回答了这个问题on github,但为了与SO规则保持一致,我在此处提供了回复。如果像dot产品一样简单,你可以利用它很好地考虑因素,所以下面的代码可以工作

axisa = C.Axis.new_unique_dynamic_axis('a')
axisb = C.Axis.new_unique_dynamic_axis('b')
a = C.sequence.input_variable(1, sequence_axis=axisa)
b = C.sequence.input_variable(1, sequence_axis=axisb)
c = C.sequence.broadcast_as(C.sequence.reduce_sum(a), b) * b
c.eval({a: [[1, 2, 3],[4, 5]], b: [[6, 7], [8]]})
[array([[ 36.],
       [ 42.]], dtype=float32), array([[ 72.]], dtype=float32)]

在一般情况下,您需要执行以下步骤

static_b, mask = C.sequence.unpack(b, neutral_value).outputs
scores = your_score(a, static_b)

第一行将b序列转换为静态张量,其轴多于b。由于打包,此张量的某些元素将无效,并且mask将指示这些元素。 neutral_value将作为虚拟值放在static_b张量中,只要数据丢失。根据您的分数,您可以安排neutral_value不影响最终分数(例如,如果您的分数是点积,0将是一个不错的选择,如果它涉及softmax-inffinity或某些接近的那将是一个很好的选择)。第二行现在可以访问a的每个元素以及b的所有元素作为static_b的第一个轴。对于点积static_b是一个矩阵,a的一个元素是一个向量,因此矩阵向量乘法将产生一个序列,其元素是a的相应元素和所有元素之间的所有内积。 b