- 在 Bi-LSTM 中,您将有一个 LSTM 从左到右展开(例如 LSTM1)
输入(比如 X)和另一个从右到左展开的 LSTM(比如 LSTM2)。
- 假设您的输入大小 (X.shape) 是
n X t X f 其中
-
n:批量大小
-
tsequence length/time-steps/no:of unrollings)
-
f:No:Of 每个时间步的特征
- 假设我们有一个带有单个
Bi-LSTM 定义如下的模型
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(t, f)))
- 在这种情况下,LSTM1 将返回大小为
n X t X 10 的输出,LSTM2 将返回大小为 n X t X 10 的输出
- 现在您可以选择如何使用
merge_mode 在每个时间步组合 LSMT1 和 LSTM2 的输出
sum: 在每个时间步将 LSTM1 输出添加到 LSTM2。 IE。 LSTM1 的n X t X 10 + LSTM2 的n X t X 10 = 输出大小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 中使用它。