Keras实现中的LSTM体系结构?

时间:2018-12-29 03:27:44

标签: python keras deep-learning lstm rnn

我是Keras的新手,并在Keras documentation中详细介绍了LSTM及其实现细节。一切都很容易,但是突然间,我浏览了this SO帖子和评论。它使我对真正的LSTM体系结构感到困惑:

代码如下:

model = Sequential()
model.add(LSTM(32, input_shape=(10, 64)))
model.add(Dense(2))

据我的理解,10表示不。时间步长,每个时间步长都馈入各自的LSTM cell; 64表示编号。每个时间步的功能。

但是,以上文章中的评论和实际答案使我对32的含义感到困惑。

此外,LSTM的输出如何连接到Dense层。

手绘图解说明对于可视化体系结构很有帮助。

编辑

this another SO个帖子而言,则32代表{{1}的每个产生的输出矢量的长度,如果{{1} }。

如果是这样,那么我们如何将10个LSTM单元中的每一个所产生的32维输出分别连接到下一个密集层?

还请告诉我第一个SO帖子答案是否模糊

1 个答案:

答案 0 :(得分:2)

  

我们如何连接由每个产生的32维输出   10个LSTM单元到下一个致密层?

这取决于您要如何做。假设您有:

model.add(LSTM(32, input_shape=(10, 64), return_sequences=True))

然后,该层的输出具有形状(10, 32)。此时,您可以使用Flatten层来获取具有320个分量的单个向量,也可以使用TimeDistributed来独立处理每个10向量:

model.add(TimeDistributed(Dense(15))

该层的输出形状为(10, 15),并且相同权重应用于每个LSTM单元的输出。

  

很容易弄清楚编号。输入所需的LSTM单元数(按时间跨度指定)

     

如何弄清编号。输出中需要多少LSTM单位?

根据return_sequences的值,您可以获取 last LSTM单元的输出(最后一个时间步),也可以获取每个LSTM单元的输出。至于输出向量的维数,这只是您必须做出的选择,就像密集层的大小或转换层中的过滤器数量一样。

  

10个LSTM单元中的每个32维矢量如何连接到TimeDistributed层?

按照前面的示例,您将拥有一个(10, 32)张量,即10个LSTM单元中每个单元的size-32向量。 TimeDistributed(Dense(15))的作用是创建一个(15, 32)权重矩阵和大小为15的偏差矢量,然后执行以下操作:

for h_t in lstm_outputs:
    dense_outputs.append(
        activation(dense_weights.dot(h_t) + dense_bias)
    )

因此,dense_outputs的大小为(10, 15),并且对每个LSTM输出分别施加相同的权重,独立

请注意,当您不知道所需的时间步数(例如,用于机器翻译。在这种情况下,您将None用作时间步;我写的所有内容仍然适用,唯一的区别是时间步数不再固定。 Keras将根据需要重复LSTM,TimeDistributed等次数(取决于输入)。