python - 双向 LSTM 合并模式解释
问题描述
在使用双向 LSTM 进行序列分类时,我想了解有关合并模式的更多详细信息,尤其是对于我仍然不清楚的“Concat”合并模式。
根据我对这个方案的理解:
将前向和后向层的合并结果传递给 sigmoid 函数后计算输出 y_t。“add”、“mul”和“average”合并模式似乎相当直观,但我不明白在选择“concat”合并模式时如何计算输出 y_t。事实上,通过这种合并模式,我们现在在 sidmoid 函数之前有一个向量而不是单个值。
解决方案
- 在 Bi-LSTM 中,您将有一个 LSTM 在输入(例如 X)上从左到右展开(例如 LSTM1),另一个 LSTM 从右到左展开(例如 LSTM2)。
- 假设您的输入大小(X.shape)
n X t X f
是n
:批量大小t
序列长度/时间步长/无:展开次数)f
:否:每个时间步的特征
- 假设我们有一个
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
- 现在,您可以选择如何在每个时间步组合 LSMT1 和 LSTM2 的输出,使用
merge_mode
sum:在每个时间步将 LSTM1 输出添加到 LSTM2。IE。n X t X 10
LSTM1 的 + n X t X 10
LSTM2 的 = 大小的输出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 中使用它。
推荐阅读
- amazon-web-services - Amazon Cost Explorer:Lightsail 中“无资源”的成本
- r - 计算 R 数据框列中出现的月份名称
- javascript - 字符串中的变量在javascript中不起作用
- ios - 矩形的动态高度来自 SwiftUI 中的文本内容
- networking - 在重新启动之间保留内核 IP 路由表
- graph - GNN 层如何知道批次中的哪个图具有给定的节点和节点特征?
- typescript - How to move .env file into build folder with tsconfig
- spring-boot - 提高 spring 批处理作业性能
- visual-studio-code - 有没有办法在 VSCode 中禁用 shift + enter ?
- python-docx - 将图像插入现有 word 文件时文件损坏