2017-08-14 32 views
0

我有两个小批量序列:如何执行两个序列之间的匹配?

a = C.sequence.input_variable((10)) 
b = C.sequence.input_variable((10)) 

两个ab具有可变长度的序列。 我想在它们之间进行匹配,其中匹配被定义为:在a的每个时间步骤处的匹配(例如,点积)标记与在每个时间步b处的标记。

我该怎么做?

回答

1

我主要回答这个on github,但要符合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。由于包装,张量的某些元素将无效,那些将由mask表示。在数据丢失的地方,neutral_value将作为虚拟值放置在static_b张量中。根据你的分数,你可能可以安排neutral_value不影响最终分数(例如,如果你的分数是一个点积,0将是一个好的选择,如果它涉及softmax -infinity或接近它的东西将是一个不错的选择)。第二行现在可以访问a的每个元素以及b的所有元素作为static_b的第一个轴。对于点积static_b是一个矩阵,a的一个元素是一个向量,因此矩阵向量乘法将产生一个序列,其元素都是元素的相应元素和所有元素之间的所有内积b

相关问题