keras何时重置LSTM状态?

时间:2017-05-10 02:46:42

标签: keras lstm keras-layer

我阅读了各种关于它的文章,似乎没有人回答这个非常基本的问题。它总是含糊不清:

stateful = False LSTM图层中,keras会在以下情况后重置状态:

  • 每个序列;或
  • 每批?

假设我的X_train形状为(1000,20,1),意味着单个值的20个步骤的1000个序列。如果我做:

model.fit(X_train, y_train, batch_size=200, nb_epoch=15)

是否会重置每个序列的状态(重置状态1000次)? 或者它会重置每个批次的状态(重置状态5次)?

5 个答案:

答案 0 :(得分:36)

通过一些测试,我得出以下结论,这是根据文档和Nassim的答案:

首先,图层中没有单个状态,但批次中每个样本只有一个状态。在这样的层中存在batch_size个并行状态。

有状态=假

stateful=False的情况下,所有状态在每个批次后一起重置。

  • 10 sequences批处理会创建10 states,所有10个状态在处理完毕后会自动重置。

  • 10 sequences的下一批将创建10 new states,此处理批次后也会重置

如果所有这些序列都有length (timesteps) = 7,则这两个批次的实际结果是:

  

20个单独的序列,每个序列长度为7

没有序列是相关的。但当然:权重(不是状态)对于图层来说是唯一的,并且将表示图层从所有序列中学到的内容。

  • 状态是:我现在在一个序列中的哪个位置?这是什么时间步骤?从开始到现在,这个特定的序列是如何表现的?
  • 权重是:我对目前所见的所有序列的一般行为了解多少?

有状态=真

在这种情况下,也有相同数量的并行状态,但根本不会重置

  • 10 sequences批处理将创建10 states,它将保留在批处理结束时的状态。

  • 下一批10 sequences(要求为10,因为第一批为10)将重用之前创建的10 states

实际结果是:第二批中的10个序列只是继续第一批的10个序列,就好像根本没有中断一样。

如果每个序列都有length (timesteps) = 7,那么实际含义是:

  

10个单独的序列,每个序列长度为14

当你看到你达到序列的总长度时,你会调用model.reset_states(),这意味着你不再继续前面的序列,现在你将开始提供新的序列。

答案 1 :(得分:6)

doc of the RNN code中,您可以阅读:

  

关于在RNN中使用有状态的注意事项:

     

您可以将RNN图层设置为有状态',这意味着状态       计算出的一批样品将作为初始状态重新使用       对于下一批中的样品。这假设是一对一映射       不同连续批次的样本之间。

我知道这并不能直接回答你的问题,但对我而言,它证实了我的想法:当LSTM不是有状态时,状态会在每个样本后重置。他们不是批量工作,批量生产的想法是每个样本彼此独立。

因此,您可以为您的示例重置1000状态。

答案 2 :(得分:2)

在Keras中,有两种维持状态的模式: 1)默认模式$ hdfs dfs -df -h Filesystem Size Used Available Use% hdfs://x.x.x.x:8020 138.9 G 3.9 G 14.2 G 3% $ hdfs dfs -du -h 2.5 G .sparkStaging 0 archive 477.3 M checkpoint ,其中每个批次之后重置状态。 AFAIK状态仍将在批次内的不同样品之间进行维护。因此,对于您的示例,状态将在每个时期重置5次。

2)状态永不重置的有状态模式。用户可以在新纪元之前重置状态,但Keras本身不会重置状态。在这种模式下,状态从样本中传播出来#i;#34;一批来样品"我"下一批的。通常建议在每个时期之后重置状态,因为状态可能会长得太长并变得不稳定。然而,根据我对小尺寸数据集(20,000到40,000个样本)的经验,在一个纪元之后重置或不重置状态对最终结果没有太大影响。对于更大的数据集,它可能会有所不同。

如果您的模式跨越100多个时间步,则有状态模型将非常有用。否则默认模式就足够了。根据我的经验设置批量大小大致相当于数据中模式的大小(时间步长)也有帮助。

一开始可能很难掌握有状态的设置。可以预期,状态将在一批的最后一个样本与下一批的第一个样本之间转移。但实际上,状态实际上是在相同编号的样本之间传播。作者有两种选择,他们选择后者。阅读此here。另请参阅有关状态RNN的相关Keras FAQ部分

答案 3 :(得分:0)

扩展@ Nassim_Ben的答案,确实每个序列对于批处理的每个实例都被认为是独立的。但是,您需要记住,RNN的隐藏状态和单元格内存会被传递到下一个单元格20步。对于20个单元中的第一个单元,隐藏状态和单元存储器通常设置为零。

在第20个单元格之后,并且在隐藏状态(仅,不是单元存储器)被传递到RNN上方的层之后,状态被重置。我将假设它们意味着细胞记忆和隐藏状态。

所以是的,它确实会被重置为所有1000个实例,但是,考虑到你的batch_size=200,它会被重置5次,每个批次在通过这20个步骤传递信息后重置。希望你能解决这个问题。

Here's我在同一个问题上做过的项目。特别注意单元格15及其在单元格11之后的blob 中的解释。我继续附加字母,因为状态正在被重置。

答案 4 :(得分:0)

每个人似乎都太困惑了。每批Keras LSTM都会重置状态。

这是一个不错的博客:https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/

阅读此博客中的LSTM State Within A BatchStateful LSTM for a One-Char to One-Char Mapping主题。它显示了为什么仅在批处理之后必须重置它。