簡體   English   中英

可能在Keras的CNN之前添加雙向LSTM嗎?

[英]Possible to add a bidirectional LSTM before a CNN in Keras?

我目前正在使用一種系統,該系統可以對兩個句子是否共享相同的內容進行分類。 為此,我使用了預訓練的單詞向量,因此有一個數組包含句子1的單詞向量(s1)和一個數組包含句子2的單詞向量(s2)。 為了對它們是否相似進行分類,我通過將s1中的所有向量與s2中的向量成對比較來創建矩陣。 然后將此矩陣輸入到CNN分類器中,並對數據進行訓練。 這一切都非常簡單。

現在,我想通過在s1和s2上使用雙向LSTM來增強此系統。 應該使用雙向LSTM來獲取s1和s2中每個向量的隱藏狀態,然后應像以前比較s1和s2的向量一樣,通過成對余弦相似性對這些隱藏狀態進行比較。 這是為了捕獲s1和s2中每個單詞的句子上下文信息。

現在的問題是如何在Keras中執行此操作。 目前,我正在使用numpy / sklearn創建矩陣,然后將這些矩陣作為訓練數據饋入Keras。 我在普通的tensorflow中找到了我想做的一種實現( https://github.com/LiuHuiwen/Pairwise-Word-Interaction-Modeling-by-Tensorflow-1.0/blob/master/model.py )。

我假設我將不得不更改輸入數據,使其僅包含s1和s2向量的兩個數組。 然后,我必須先運行biLSTM,獲取隱藏狀態,將所有內容轉換為矩陣,然后將其輸入到CNN中。 普通tensorflow中的示例對我來說似乎很清楚,但是我無法想到在Keras中如何執行此操作的想法。 在Keras中是否有可能,或者為了對biLSTM的輸出進行必要的計算而必須直接使用張量流嗎?

使用return_sequences=True選項,包括LSTM的Keras RNN層不僅可以返回輸出序列中的最后一個輸出,還可以返回所有隱藏層中的完整序列。

https://keras.io/layers/recurrent/

當您要在CNN層之前連接雙向LSTM層時,以下代碼為示例:

from keras.layers import Input, LSTM, Bidirectional, Conv1D

input = Input(shape=(50, 200))
seq = Bidirectional(LSTM(16, return_sequences=True))(input)
cnn = Conv1D(32, 3, padding="same", activation="relu")(seq)

請注意:如果要在雙向LSTM層之后使用Conv2D層,則輸入Conv2D時需要將ndim=4重塑為ndim=4 ,例如以下代碼:

from keras.layers import Input, LSTM, Bidirectional, Conv2D, Reshape

input = Input(shape=(50, 200))
seq = Bidirectional(LSTM(16, return_sequences=True))(input)
seq = Reshape((50, 32, 1))(seq)
cnn = Conv2D(32, (3, 3), padding="same", activation="relu")(seq)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM