【问题标题】:Possible to add a bidirectional LSTM before a CNN in Keras?可以在 Keras 的 CNN 之前添加双向 LSTM 吗?
【发布时间】:2018-10-10 22:51:28
【问题描述】:

我目前正在开发一个系统,该系统可以对两个句子是否共享相同的内容进行分类。为此,我使用预训练的词向量,因此有一个包含句子 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 中是否有可能,还是必须直接求助于 tensorflow 才能对 biLSTM 的输出进行必要的计算?

【问题讨论】:

    标签: python tensorflow keras deep-learning lstm


    【解决方案1】:

    包括 LSTM 在内的 Keras RNN 层不仅可以返回输出序列中的最后一个输出,还可以使用 return_sequences=True 选项返回来自所有隐藏层的完整序列。

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

    当你想在CNN层之前连接Bi-Directional 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)
    

    请注意:如果要在 Bi-Directional 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)
    

    【讨论】:

    • 我明白这一点,非常感谢您的回答和澄清。我目前使用的 CNN 将 s1 和 s2 的输入向量的成对余弦相似度的值作为输入。这些都是提前生成的。我想要做的也是为 s1 和 s2 中向量的隐藏状态成对生成余弦相似度。我认为这与您所描述的情况略有不同(这似乎只是 biLSTM 之上的 CNN,它也非常好,但我猜其用途略有不同)。还是我搞错了?
    • 很抱歉我的理解不够。我猜 Keras Lambda 层可能会对您有所帮助。 keras.io/layers/core/#lambda 您可以使用此Lambda 层进行任何计算。我在 Stack Overflow 中找到了类似的主题:stackoverflow.com/questions/51003027/…
    猜你喜欢
    • 2020-10-28
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2023-03-25
    • 2021-10-29
    • 2023-03-05
    • 2019-10-22
    相关资源
    最近更新 更多