我是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帖子答案是否模糊?
答案 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等次数(取决于输入)。