Tho*_*che 4 python lstm keras recurrent-neural-network
我想了解有关使用双向 LSTM 进行序列分类时合并模式的更多详细信息,尤其是对于我还不清楚的“Concat”合并模式。
根据我对这个方案的理解:
在将前向和后向层的合并结果传递到 sigmoid 函数后计算输出 y_t。“add”、“mul”和“average”合并模式似乎相当直观,但我不明白选择“concat”合并模式时输出 y_t 是如何计算的。实际上,使用这种合并模式,我们现在在 sidmoid 函数之前有一个向量而不是单个值。
n X t X f其中
n:批量大小t序列长度/时间步长/没有:展开)f:No:Of 每个时间步长的特征Bi-LSTM定义如下的单一模型model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(t, f)))
Run Code Online (Sandbox Code Playgroud)
n X t X 10LSTM2 将返回 size 的输出n X t X 10merge_modesum:在每个时间步将 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)
Run Code Online (Sandbox Code Playgroud)
您不能merge_mode=None在序列模型中使用,因为每一层都应返回一个张量但None返回一个列表,因此您无法将其堆叠在模型中。但是,您可以在 keras 的功能 API 中使用它。
这很简单。想象一下,您的前向 LSTM 层返回了类似的状态[0.1, 0.2, 0.3],而后向 LSTM 层产生了[0.4, 0.5, 0.6]。然后连接(为了简洁而连接)是[0.1, 0.2, 0.3, 0.4, 0.5, 0.6],它被进一步传递到激活层。