我阅读了各种关于它的文章,似乎没有人回答这个非常基本的问题。它总是含糊不清:
在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次)?
答案 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都会重置状态。
阅读此博客中的LSTM State Within A Batch
和Stateful LSTM for a One-Char to One-Char Mapping
主题。它显示了为什么仅在批处理之后必须重置它。