Deep learning 如何在Keras中使用返回序列选项和时间分布层?

Deep learning 如何在Keras中使用返回序列选项和时间分布层?,deep-learning,keras,lstm,recurrent-neural-network,Deep Learning,Keras,Lstm,Recurrent Neural Network,我有一个如下的对话语料库。我想实现一个预测系统行为的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模型。系统动作被描述为位向量。将用户输入计算为字嵌入,字嵌入也是位向量

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后的
返回\u序列
选项和
时间分布
层。要实现“多对多(2)”,
返回\u序列==True
并在LSTMs之后添加
TimeDistributed
?如果你能多描述一下,我将不胜感激

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

TimeDistributed:此包装器允许对输入的每个时间片段应用一个层

更新日期2017/03/13 17:40 我想我可以理解
返回\u序列
选项。但我仍然不能确定
时间分布的情况。如果在LSTMs之后添加
TimeDistributed
,模型是否与下面的“我的多对多(2)”相同?所以我认为每个输出都应用了密集层。

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

  • LSTM将一个接一个地吃掉你句子中的单词,你可以选择通过“返回顺序”在每一步(每个单词处理后)输出一些东西(状态),或者只在最后一个单词被吃掉后输出一些东西。因此,当return\u sequence=TRUE时,输出将是相同长度的序列,当return\u sequence=FALSE时,输出将只是一个向量
  • 时间分配。此包装器允许您对序列中的每个元素独立地应用一层(例如密集层)。该层对每个元素都有完全相同的权重,应用于每个单词的权重相同,当然,它将返回独立处理的单词序列 如您所见,两者之间的区别在于LSTM通过序列传播信息,它将吃掉一个单词,更新其状态并返回或不返回。然后它将继续下一个单词,同时仍然携带来自前一个单词的信息。。。。正如在时间分布中一样,单词将以相同的方式自行处理,就像它们在筒仓中一样,并且相同的层适用于它们中的每一个

    因此,您不必连续使用LSTM和时间分布,您可以做任何您想做的事情,只需记住它们各自的功能

    我希望更清楚

    编辑:

    在您的例子中,时间分布将对LSTM输出的每个元素应用密集层

    让我们举一个例子:

    您有一个嵌入emb_大小维度的n_单词序列。因此,您的输入是一个二维形状张量
    (n\u单词,emb\u大小)

    首先应用一个输出维度为
    LSTM\u output
    return\u sequence=True的LSTM。输出仍然是一个squence,因此它将是一个二维形状张量
    (n_单词,lstm_输出)
    。 因此,您有长度为lstm_输出的n_单词向量

    现在应用一个时间分布的稠密层,输出3维作为稠密层的参数。所以时间分布(稠密(3))。 这将对序列中大小为lstm_的每个向量分别应用密集(3)个n_字的时间。。。它们都将成为长度为3的向量。您的输出仍然是一个序列,因此是一个二维张量,现在的形状是
    (n_words,3)

    更清楚吗?:-)

    如果我们想要有一个输出序列,而不是像普通神经网络那样只有一个向量,那么我们有必要将返回序列设置为真。具体来说,假设我们有一个shape输入(num_seq,seq_len,num_feature)。如果我们没有设置return\u sequences=True,我们的输出将具有形状(num\u seq,num\u feature),但是如果我们这样做,我们将获得具有形状(num\u seq,seq\u len,num\u feature)的输出


    因为我们在LSTM层中设置了return_sequences=True,所以输出现在是一个三维向量。如果我们将其输入到稠密层,它将产生一个错误,因为稠密层只接受二维输入。为了输入三维向量,我们需要使用一个称为TimeDistributed的包装层。这一层将帮助我们保持输出的形状,以便我们最终可以实现一个序列作为输出。

    时间分布是否应该用在“一对多”中?如果我使用TimeDistributed,return\u序列必须为True。我说的对吗?我可以知道这些操作是否是有限的和预定义的吗?您的系统响应是否取决于以前用户的输入?谢谢。我想我能理解返回顺序。但我不清楚时间分配。你能查一下我最新的问题吗?谢谢。如果我只是使用稠密(3)而不是时间分布(稠密(3)),有什么区别?在这种情况下,这是一种特殊情况,但您将得到相同的…^^我知道这很令人困惑。。如果你只需要3个输出,你必须像这样重塑LSTM的输出:重塑(output_shape=(n_wordslstm_output,)),然后使用Dense(3),你的输出形状将从(n_words,LSTM_output)变为(n_wordslstm_output,)到(3,)OK。我得到了它。非常感谢。如果我返回_sequence=True并应用一个没有时间分布的简单稠密函数,这与使用时间分布的函数相同吗?
        return_sequences=True parameter:
    
        TimeDistributed wrapper layer: