如何为RNN的每个时间戳构建一个Dense层,并将每个Dense的输出反馈到RNN?

时间:2017-06-12 05:05:10

标签: keras lstm

enter image description here

如图所示,我需要获取每个Lstm时间戳的状态,并将它们应用于密集层以进行监督学习。然后使用该密集层的输出以及Lstm的下一个时间戳的状态。一般来说,我想对RNN的每一步应用监督学习,并将输出反馈到下一个时间戳。我怎样才能实现这个在Keras?

1 个答案:

答案 0 :(得分:1)

您可能希望在Dense图层上使用TimeDistributed包装器和LSTM图层中的stateful设置。但是,从您发布的图表中,您似乎没有将Dense图层的输出用于下一个LTSM。你确定是这样的吗?

编辑:

根据this discussion,似乎无法直接在Keras中实现这一点。这就是他们的建议:

  

基本上,除了使用类似@ nzw0301建议的解决方法之外,您在Keras中无法实现的目标。

     

原因是要使用当前时间步的输出作为下一个的输入,你基本上需要“深度优先”,即计算所有层的一个时间步,然后是下一个时间步,等等上。然而,Keras所做的是计算ONE层的所有时间步长,然后将输出提供给下一层。

     

我相信有三种方法可以解决这个问题:

     

输入一个不完整的序列,如@ nzw0301建议,只查看你感兴趣的输出的时间步。这不是计算效率,但应该有效。

     

制作自定义图层。该层将在一个时间步使用其输出作为下一个输入的输入。但请注意,这将仅限于此单层,即您无法应用多个图层,然后以这种方式获取输出。 https://github.com/farizrahman4u/seq2seq/blob/master/seq2seq/models.py#L93是旧版Keras版本的实现,可以执行类似的操作。

     

使用有状态RNN(stateful = True)并使它们一次只读取一次。有状态意味着它们在序列之间保持其隐藏状态,因此它应该像“普通”RNN / LSTM一样有效地工作,除了您只输入长度为1的序列。(然后您可以解释输出并计算下一个输入到目前为止,我从未尝试过这种方式。