如何在Keras中使用return_sequences选项和TimeDistributed层?
deep-learning
keras
lstm
recurrent-neural-network
5
0

我有一个如下的对话语料库。我想实现一个LSTM模型,该模型可以预测系统动作。系统动作被描述为位向量。并且将用户输入计算为词嵌入,这也是位向量。

t1: user: "Do you know an apple?", system: "no"(action=2)
t2: user: "xxxxxx", system: "yyyy" (action=0)
t3: user: "aaaaaa", system: "bbbb" (action=5)

所以我想实现的是“多对多(2)”模型。当我的模型收到用户输入时,它必须输出系统操作。 在此处输入图片说明但是我无法理解LSTM之后的return_sequences选项和TimeDistributed层。要实现“多对多(2)”, return_sequences==True并在需要TimeDistributed之后添加TimeDistributed ?如果您能提供更多说明,我们将不胜感激。

return_sequences :布尔值。是返回输出序列中的最后一个输出还是完整序列。

TimeDistributed :此包装器允许将层应用于输入的每个时间片。

更新2017/03/13 17:40

我想我可以理解return_sequence选项。但是我仍然不确定TimeDistributed 。如果在TimeDistributed之后添加TimeDistributed,该模型是否与下面的“我的多对多(2)”相同?因此,我认为密集层适用于每个输出。 在此处输入图片说明

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

LSTM层和TimeDistributed包装器是获得所需的“多对多”关系的两种不同方法。

  1. LSTM会逐个吃掉您的句子中的单词,您可以通过“ return_sequence”选择在每个步骤(处理完每个单词之后)输出某些内容(状态),或者仅在吃完最后一个单词之后输出某些内容。因此,在return_sequence = TRUE的情况下,输出将是相同长度的序列,在return_sequence = FALSE的情况下,输出将只是一个向量。
  2. 时间分布。这个包装器允许您将一层(例如说Dense) 独立地应用于序列的每个元素。该层的每个元素的权重完全相同,将应用于每个单词的权重相同,并且当然,它将返回独立处理的单词序列。

如您所见,两者之间的区别在于LSTM“通过序列传播信息,它将吃掉一个单词,更新其状态并返回或不返回它。然后它将继续下一个单词,同时仍携带信息与以前的版本相同。...与TimeDistributed中的单词一样,它们将以相同的方式自行处理,就像它们在筒仓中一样,并且每个单词都使用相同的层。

因此,您不必连续使用LSTM和TimeDistributed,您可以做任何您想做的事情,只需记住它们各自的作用即可。

我希望清楚吗?

编辑:

在您的情况下,分配的时间将密集层应用于LSTM输出的每个元素。

让我们举个例子:

您有嵌入nb_size维中的n_words个单词序列。所以你的输入是一个2D张量的形状(n_words, emb_size)

首先,应用输出尺寸= lstm_outputreturn_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)

比较清楚吗? :-)

收藏
评论
    return_sequences=True parameter:

如果我们要有一个输出序列,而不仅仅是像普通神经网络那样有一个向量,那么有必要将return_sequences设置为True。具体来说,假设我们有一个形状为(num_seq,seq_len,num_feature)的输入。如果不设置return_sequences = True,则输出将具有形状(num_seq,num_feature),但如果这样做,则将获得具有形状(num_seq,seq_len,num_feature)的输出。

    TimeDistributed wrapper layer:

由于我们在LSTM层中设置了return_sequences = True,因此输出现在是三维矢量。如果我们将其输入到Dense层,则将引发错误,因为Dense层仅接受二维输入。为了输入三维矢量,我们需要使用一个称为TimeDistributed的包装层。该层将帮助我们保持输出的形状,以便最终获得输出序列。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号