首页 > 解决方案 > 双向 LSTM 合并模式解释

问题描述

在使用双向 LSTM 进行序列分类时,我想了解有关合并模式的更多详细信息,尤其是对于我仍然不清楚的“Concat”合并模式。

根据我对这个方案的理解:

在此处输入图像描述

将前向和后向层的合并结果传递给 sigmoid 函数后计算输出 y_t。“add”、“mul”和“average”合并模式似乎相当直观,但我不明白在选择“concat”合并模式时如何计算输出 y_t。事实上,通过这种合并模式,我们现在在 sidmoid 函数之前有一个向量而不是单个值。

标签: pythonkeraslstmrecurrent-neural-network

解决方案


  1. 在 Bi-LSTM 中,您将有一个 LSTM 在输入(例如 X)上从左到右展开(例如 LSTM1),另一个 LSTM 从右到左展开(例如 LSTM2)。
  2. 假设您的输入大小(X.shape)n X t X f
    • n:批量大小
    • t序列长度/时间步长/无:展开次数)
    • f:否:每个时间步的特征
  3. 假设我们有一个Bi-LSTM定义如下的模型
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(t, f)))
  1. 在这种情况下,LSTM1 将返回大小的输出,n X t X 10LSTM2 将返回大小的输出n X t X 10
  2. 现在,您可以选择如何在每个时间步组合 LSMT1 和 LSTM2 的输出,使用merge_mode

sum:在每个时间步将 LSTM1 输出添加到 LSTM2。IE。n X t X 10LSTM1 的 + n X t X 10LSTM2 的 = 大小的输出n X t X 10

mul:在每个时间步将 LSTM1 输出到 LSTM2 的元素乘法,这将导致输出大小n X t X 10

concat:在每个时间步将 LSTM1 输出按元素连接到 LSTM2,这将导致输出大小n X t X 10*2

ave:每个时间步长 LSTM1 输出到 LSTM2 的元素平均,这将导致输出大小n X t X 10

无:将 LSTM1 和 LSTM2 输出作为列表返回

组合基于 的输出后不应用激活函数merge_mode。如果要应用激活,则必须在模型中将其明确定义为层。

测试代码

model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 15), merge_mode='concat'))
assert model.layers[-1].output_shape == (None, 5, 20)

model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 15), merge_mode='sum'))
assert model.layers[-1].output_shape == (None, 5, 10)

model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 15), merge_mode='mul'))
assert model.layers[-1].output_shape == (None, 5, 10)

笔记:

您不能merge_mode=None在序列模型中使用,因为每一层都应该返回一个张量,但None返回一个列表,因此您不能将其堆叠在模型中。但是,您可以在 keras 的功能 API 中使用它。


推荐阅读