我有兩個小批量序列:如何執行兩個序列之間的匹配?
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
。