LSTM中的状态流

时间:2018-03-14 12:07:57

标签: keras lstm

我读到LSTM的内部状态如下:

  • 它总是在批处理中传递,所以从第i个样本的最后一个时间戳到第i + 1个的第一个
  • 如果LSTM是有状态的,则状态在批次之间传递,因此对于所有索引i,batch_k [i]的最后时间戳的存储器被传递到batch_ {k + 1} [i]的第一个时间戳。

对我来说,这提出了几个问题。 (如果我的理解错误,请纠正我)

  1. 这是否意味着(i + 1)st样本的第一个时间戳需要是样本i的最后一个时间步的超然? (对于所有我)
  2. 沿着相同的路线,批次k + 1中第i个样本的第一个时间戳是否必须是批次k中第i个样本的最后一个时间戳的成功?
  3. 如果前两个结论是正确的,那么对于有状态的LSTM,我们永远不会洗牌,对于非有状态的,我们最多可以对批次进行洗牌,但不是批次中的样本,对吗?
  4. 为什么我们将批次分成多个时间步的样本呢?如果以上是正确的,那么样本中的程序'与批次中的'相同,所以我们不妨使用每个时间步长的样本。

1 个答案:

答案 0 :(得分:0)

问题1

不正确。样本s与同一批次中的样本s+1无关。他们是独立的。

这意味着批处理s的样本b+1必须是批处理s的样本b的成功者。

样品将被并行处理,批次必须保持相同的顺序。 (这就是为什么文档说训练shuffle=False层时需要stateful=True)的原因。

问题2

这是真的:))

问题3

部分正确。使用stateful=True我们无法对批次进行洗牌(如果有多个批次)。

但是使用stateful=False这并不重要,因为没有一个样本会彼此相关。 (批次中的每个样本都是完全独立的)

问题4

自"样本"在一批中彼此独立,主要原因是批量生产许多样品:

  • 你有许多独立的序列,而不只是一个序列

但是你可能想要分成关于"长度/时间步长"的多个批次中的每个序列。你可以这样做:

  • 您的序列太长,无法满足您的记忆,因此您可以部分加载它们并部分处理它们
  • 您的模型无限期地预测未来,您需要它来预测步骤t(n+1)以将其作为输入传递,然后才能生成步骤t(n+2)

因此,您确实可以在stateful=True层中使用一个时间步长的样本。

这些答案也可能对您有所帮助: