LSTM层和TimeDistributed包装器是获得所需的“多对多”关系的两种不同方法。
- LSTM会逐个吃掉您的句子中的单词,您可以通过“ return_sequence”选择在每个步骤(处理完每个单词之后)输出某些内容(状态),或者仅在吃完最后一个单词之后输出某些内容。因此,在return_sequence = TRUE的情况下,输出将是相同长度的序列,在return_sequence = FALSE的情况下,输出将只是一个向量。
- 时间分布。这个包装器允许您将一层(例如说Dense) 独立地应用于序列的每个元素。该层的每个元素的权重完全相同,将应用于每个单词的权重相同,并且当然,它将返回独立处理的单词序列。
如您所见,两者之间的区别在于LSTM“通过序列传播信息,它将吃掉一个单词,更新其状态并返回或不返回它。然后它将继续下一个单词,同时仍携带信息与以前的版本相同。...与TimeDistributed中的单词一样,它们将以相同的方式自行处理,就像它们在筒仓中一样,并且每个单词都使用相同的层。
因此,您不必连续使用LSTM和TimeDistributed,您可以做任何您想做的事情,只需记住它们各自的作用即可。
我希望清楚吗?
编辑:
在您的情况下,分配的时间将密集层应用于LSTM输出的每个元素。
让我们举个例子:
您有嵌入nb_size维中的n_words个单词序列。所以你的输入是一个2D张量的形状(n_words, emb_size)
首先,应用输出尺寸= lstm_output
和return_sequence = True
的LSTM。输出仍然是一个(n_words, lstm_output)
因此它将是形状的2D张量(n_words, lstm_output)
。因此,您具有长度为lstm_output的n_words个向量。
现在,您应用一个TimeDistributed密集层,其中输出3维作为Dense参数。因此,TimeDistributed(Dense(3))。这会将Dense(3)n_words次应用于序列中每个大小为lstm_output的向量...它们将全部成为长度为3的向量。您的输出仍将是一个序列,因此现在的二维张量形状为(n_words, 3)
。
比较清楚吗? :-)
0
我有一个如下的对话语料库。我想实现一个LSTM模型,该模型可以预测系统动作。系统动作被描述为位向量。并且将用户输入计算为词嵌入,这也是位向量。
所以我想实现的是“多对多(2)”模型。当我的模型收到用户输入时,它必须输出系统操作。
但是我无法理解LSTM之后的
return_sequences
选项和TimeDistributed
层。要实现“多对多(2)”,return_sequences==True
并在需要TimeDistributed
之后添加TimeDistributed
?如果您能提供更多说明,我们将不胜感激。更新2017/03/13 17:40
我想我可以理解
return_sequence
选项。但是我仍然不确定TimeDistributed
。如果在TimeDistributed
之后添加TimeDistributed,该模型是否与下面的“我的多对多(2)”相同?因此,我认为密集层适用于每个输出。