如图所示,我需要获取每个Lstm时间戳的状态,并将它们应用于密集层以进行监督学习。然后使用该密集层的输出以及Lstm的下一个时间戳的状态。一般来说,我想对RNN的每一步应用监督学习,并将输出反馈到下一个时间戳。我怎样才能实现这个在Keras?
答案 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的序列。(然后您可以解释输出并计算下一个输入到目前为止,我从未尝试过这种方式。