2017-08-11 124 views
3

我想通過Yang et al.使用關注機制的實現。我發現了一個使用這種注意力機制的自定義層的工作實現here。而不是使用我的LSTM的輸出值:在keras的LSTM中使用隱藏狀態而不是輸出

my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True) 
my_lstm = AttentionWithContext()(my_lstm) 
out = Dense(2, activation='softmax')(my_lstm) 

我想用LSTM的隱藏狀態:

my_lstm = LSTM(128, input_shape=(a, b), return_state=True) 
my_lstm = AttentionWithContext()(my_lstm) 
out = Dense(2, activation='softmax')(my_lstm) 

但我得到的錯誤:

TypeError: can only concatenate tuple (not "int") to tuple

我嘗試了它與return_sequences組合,但我嘗試過的一切都失敗了。如何修改返回的張量以便像返回的輸出序列那樣使用它?

謝謝!

+1

'return_state = True'只返回最後一個隱藏狀態,不是所有的隱藏狀態。所以即使你編輯了AttentionWithContext來處理你在'return_state = True'時得到的張量列表,我不認爲它會是你想要的。 –

+0

@NicoleWhite好吧,那會是一個問題。我沒有看到它爲什麼只返回最後一個隱藏狀態的原因,但它是這樣。但我不得不懷疑:在大多數論文中他們都談論隱藏狀態。這真的是他們的意思嗎?或者他們只是使用錯誤的術語?我沒有看到使用隱藏狀態而不是輸出狀態的理由,但我想正確使用它們的方法。 – V1nc3nt

+0

當你說輸出狀態時,你指的是什麼? –

回答

1

我認爲你的困惑可能源於Keras文檔有點不清楚。

return_sequences: Boolean. Whether to return the last output in the output sequence, or the full sequence. 
return_state: Boolean. Whether to return the last state in addition to the output. 

return_state的文檔是特別令人困惑的,因爲它們意味着隱藏狀態是從所述輸出不同的,但它們是在同一個。對於LSTM,這會變得有點模糊,因爲除了隱藏(輸出)狀態之外,還有單元狀態。我們可以通過查看在Keras代碼LSTM階躍函數證實了這一點:

class LSTM(Recurrent): 
    def step(...): 
     ... 
     return h, [h, c] 

階梯函數的返回類型爲output, states。所以我們可以看到隱藏狀態h實際上是輸出,並且對於這些狀態,我們獲得隱藏狀態h和單元狀態c。這就是爲什麼你會看到Wiki article你互換使用術語「隱藏」和「輸出」。

看着你連接得更近一些的紙張,在我看來你的原始實現是你想要的。

my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True) 
my_lstm = AttentionWithContext()(my_lstm) 
out = Dense(2, activation='softmax')(my_lstm) 

這將在每個時間步將隱藏狀態傳遞給您的關注層。唯一一個你不走運的場景是你實際上想要從每個時間步將細胞狀態傳遞到關注層(這是我最初想的),但我不認爲這是你想要的。你鏈接的文件實際上使用了一個GRU層,它沒有單元狀態的概念,並且其步功能也將隱藏狀態作爲輸出返回。

class GRU(Recurrent): 
    def step(...): 
     ... 
     return h, [h] 

因此,本文幾乎肯定是指隱藏狀態(又名輸出)而不是單元狀態。

+0

我只是再次通讀論文,也注意到他們使用GRU。我不太瞭解他們知道他們不使用細胞狀態。因爲我認爲他們是指論文中GRU的細胞狀態,所以我實際上想要爲我的關注層獲得LSTM的細胞狀態。現在我知道GRU和Yang等人沒有細胞狀態。只能表示輸出(或隱藏的向量)。非常感謝您的時間和幫助! – V1nc3nt

+0

@Nicole White,謝謝你的解釋。在您的解決方案中,是否有任何方法可以將隱藏狀態(即輸出)存儲到文件中,而不是將它們饋送到關注層?感謝您的任何想法! – Mohammadreza