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
的所有元素之间的内积