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

Cntk 如何在两个序列之间执行匹配?,cntk,Cntk,我有两个小批量序列: a = C.sequence.input_variable((10)) b = C.sequence.input_variable((10)) a和b都有可变长度的序列。 我想在它们之间进行匹配,其中匹配定义为:在a的每个时间步匹配(例如点积)令牌,在b的每个时间步匹配令牌 我怎样才能做到这一点呢?我基本上已经回答了这个问题,但为了与SO规则保持一致,我在这里给出了一个回答。对于像点积这样简单的东西,您可以利用这样一个事实,即它可以很好地分解,因此下面的代码可以工作 a

我有两个小批量序列:

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


我怎样才能做到这一点呢?

我基本上已经回答了这个问题,但为了与SO规则保持一致,我在这里给出了一个回答。对于像点积这样简单的东西,您可以利用这样一个事实,即它可以很好地分解,因此下面的代码可以工作

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
多一个轴的静态张量。由于包装的原因,此张量的某些元素将无效,这些元素将由
掩码
指示。如果缺少数据,
中性值
将作为虚拟值放置在静态张量中。根据您的分数,您可以安排
中性值
不影响最终分数(例如,如果您的分数是点积,则0将是一个不错的选择,如果它涉及softmax-无穷大或接近该值的值,则0将是一个不错的选择)。第二行现在可以访问
a
的每个元素和
b
的所有元素,作为
static\u b
的第一个轴。对于点积
静态,b
是一个矩阵,
a
的一个元素是一个向量,因此矩阵向量乘法将产生一个序列,其元素都是a的对应元素和
b
的所有元素之间的内积