可以在Keras的CNN之前添加双向LSTM吗?

时间:2018-10-10 22:51:28

标签: python tensorflow keras deep-learning lstm

我目前正在使用一个系统来对两个句子是否共享相同的内容进行分类。为此,我使用了预训练的单词向量,因此有一个数组包含句子1的单词向量(s1)和一个数组包含句子2的单词向量(s2)。为了对它们是否相似进行分类,我通过将s1中的所有向量与s2中的向量成对比较来创建矩阵。然后将此矩阵输入到CNN分类器中,并对数据进行训练。这一切都非常简单。

现在,我想通过在s1和s2上使用双向LSTM来增强此系统。应该使用双向LSTM来获取s1和s2中每个向量的隐藏状态,然后应像以前比较s1和s2的向量一样,通过成对余弦相似性对这些隐藏状态进行比较。这是为了捕获s1和s2中每个单词的句子上下文信息。

现在的问题是如何在Keras中执行此操作。目前,我正在使用numpy / sklearn创建矩阵,然后将这些矩阵作为训练数据馈入Keras。 我在普通张量流(https://github.com/LiuHuiwen/Pairwise-Word-Interaction-Modeling-by-Tensorflow-1.0/blob/master/model.py)中找到了要执行的操作的一种实现。

我假设我将不得不更改输入数据,使其仅包含s1和s2向量的两个数组。然后,我必须先运行biLSTM,获取隐藏状态,将所有内容转换为矩阵,然后将其输入到CNN中。普通tensorflow中的示例对我来说似乎很清楚,但是我无法想到在Keras中如何执行此操作的想法。在Keras中是否有可能,或者为了对biLSTM的输出进行必要的计算而必须直接使用张量流吗?

1 个答案:

答案 0 :(得分:2)

使用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,例如以下代码:

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)