2017-08-14 36 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

相關問題