2017-07-14 41 views
1

下面是代碼:這是怎麼功能編程構建LSTM

def lstm(o, i, state): 
    #these are all calculated seperately, no overlap until.... 
    #(input * input weights) + (output * weights for previous output) + bias 
    input_gate = tf.sigmoid(tf.matmul(i, w_ii) + tf.matmul(o,w_io) + b_i) 

    #(input * forget weights) + (output * weights for previous output) + bias 
    output_gate = tf.sigmoid(tf.matmul(i, w_oi) + tf.matmul(o,w_oo) + b_o) 

    #(input * forget weights) + (output * weights for previous output) + bias   
    forget_gate = tf.sigmoid(tf.matmul(i, w_fi) + tf.matmul(o,w_fo) + b_f) 

    memory_cell = tf.sigmoid(tf.matmul(i, w_ci) + tf.matmul(o,w_co) + b_c) 

    state = forget_gate * state + input_gate * memory_cell 

    output = output_gate * tf.tanh(state) 

    return output, state 

這裏是LSTM的繪圖:

LSTM

我無法理解如何在兩個配對。任何幫助將非常感激。

+0

什麼特別是你需要幫助解釋? –

+0

@JonasAdler所以,我不知道爲什麼每個門有兩個權重。此外,'c_t'似乎與輸入,輸出和忘記門都有相互作用,但我在代碼中看不到。 – madsthaks

回答

0

This是一個關於LSTM的優秀博文。這段代碼直接實現了LSTM;這裏的代碼等價於Wikipedia列出的等式:

enter image description here

輸入&輸出權反映網絡的狀態。在一個簡單的完全連接(FC)層,我們就只有一個權重矩陣,這是我們會使用來計算該層的輸出:

enter image description here

一個LSTM的優點,但是它是否包含多個信息來源或狀態;當我們說LSTM有記憶時,這就是我們所說的。我們有輸出門,就像FC層一樣,但我們也有忘記門,輸入門,單元狀態和隱藏狀態。這些全部結合起來提供多種不同的信息來源。這些方程式顯示了它們如何一起產生輸出。

在等式中,x是輸入,而f_t是輸入門。我會推薦閱讀鏈接的博客文章和維基百科文章,以瞭解等式如何實現LSTM。

該圖描繪了基於來自先前單元的值以及輸入門的先前值向單元提供輸出的輸入門。該單元還包含忘記門;輸入然後被饋送到輸出門,其也將輸出門的先前值作爲輸入。

+0

有趣的是,這是我開始學習LSTM時閱讀的第一篇文章之一。它確實給出了結構的良好背景,但它沒有解釋的一點是爲什麼有輸入和輸出權重。這使我困惑了一下。 – madsthaks

+0

我編輯了我的答案,試圖解釋更多。基本上,它們是不同的信息來源,具有不同的更新規則。 – finbarr

+0

如果您對答案感到滿意,您是否可以點擊「接受」? – finbarr