我有两个小批量序列:如何执行两个序列之间的匹配?
a = C.sequence.input_variable((10))
b = C.sequence.input_variable((10))
两个a
和b
具有可变长度的序列。 我想在它们之间进行匹配,其中匹配被定义为:在a
的每个时间步骤处的匹配(例如,点积)标记与在每个时间步b
处的标记。
我该怎么做?
我有两个小批量序列:如何执行两个序列之间的匹配?
a = C.sequence.input_variable((10))
b = C.sequence.input_variable((10))
两个a
和b
具有可变长度的序列。 我想在它们之间进行匹配,其中匹配被定义为:在a
的每个时间步骤处的匹配(例如,点积)标记与在每个时间步b
处的标记。
我该怎么做?
我主要回答这个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
。