keras 双向LSTM合并模式解释

8cdiaqws  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(89)

我想知道更多关于使用双向LSTM进行序列分类时的合并模式的细节,特别是对于我仍然不清楚的“Concat”合并模式。
从我对这个计划的理解来看:


的数据
输出y_t是在向前层和向后层的合并结果传递到sigmoid函数之后计算的。对于“add”,“穆尔”和“average”合并模式,这似乎很直观,但我不明白当选择“concat”合并模式时,输出y_t是如何计算的。实际上,在这种合并模式下,我们现在在sigmoid函数之前有一个向量而不是一个值。

jw5wzhpr

jw5wzhpr1#

1.在Bi-LSTM中,一个LSTM从左到右展开(比如LSTM 1),另一个LSTM从右到左展开(比如LSTM 2)。

  • 假设你的输入尺寸(X.shape)是n X t X f,其中
  • n:批量大小
  • t序列长度/时间步长/展开数)
  • f:否:每个时间步的特征
  • 假设我们有一个具有单个Bi-LSTM的模型,定义如下
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(t, f)))

字符串
1.在这种情况下,LSTM 1将返回大小为n X t X 10的输出,LSTM 2将返回大小为n X t X 10的输出
1.现在,您可以在下面选择如何使用merge_mode在每个时间步组合LSMT 1和LSTM 2的合并输出

**sum:**在每个时间步将LSTM 1输出加到LSTM 2。即LSTM 1的n X t X 10 + LSTM 2的n X t X 10 =输出大小n X t X 10
**穆尔:**LSTM 1输出到LSTM 2在每个时间步的元素乘,这将导致大小为n X t X 10的输出
**concat:**在每个时间步将LSTM 1输出按元素连接到LSTM 2,这将导致大小为n X t X 10*2的输出
**ave:**在每个时间步,LSTM 1输出到LSTM 2的元素平均值,这将导致大小为n X t X 10的输出
**无:**返回LSTM 1和LSTM 2输出列表

在基于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,因为每一层都应该返回一个Tensor,但是None返回一个列表,所以你不能在模型中堆叠它。但是你可以在keras的函数API中使用它。

t2a7ltrp

t2a7ltrp2#

这很简单。想象一下,你的前向LSTM层返回了一个像[0.1, 0.2, 0.3]这样的状态,而后向LSTM层返回了[0.4, 0.5, 0.6]。然后连接(简称为concat)是[0.1, 0.2, 0.3, 0.4, 0.5, 0.6],它被进一步传递给激活层。

q43xntqr

q43xntqr3#

merge_mode:前向和后向RNN的输出将被组合的模式。{'sum', 'mul', 'concat', 'ave', None}之一。如果None,输出将不会被组合,它们将作为列表返回。默认值为'concat'。来自https://keras.io/api/layers/recurrent_layers/bidirectional/

相关问题