我有两个小批次的序列:
float rand() {
...
return random_number;
}
a = C.sequence.input_variable((10))
b = C.sequence.input_variable((10))
和a
都有可变长度序列。
我希望在匹配定义为匹配之间进行匹配:匹配(例如点积)令牌在b
的每个时间步,在a
的每个时间步都使用令牌。
我该怎么做?
答案 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
。