首页 文章

keras何时重置LSTM状态?

提问于
浏览
23

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

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

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

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

    有状态=错误

    stateful=False 案例中,所有 states are resetted together after each batch .

    • 包含 10 sequences 的批次将创建 10 states ,并且所有10个状态在处理后自动重置 .

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

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

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

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

    • 状态是:我现在在序列中的哪个位置?这是什么时间步骤?从开始到现在,这个特定的序列是如何表现的?

    • 权重是:我对目前所见的所有序列的一般行为了解多少?

    有状态=真

    在这种情况下,也有相同数量的并行状态,但它们将 simply not be resetted at all .

    • 包含 10 sequences 的批次将创建 10 states ,它将保留在批次结束时的状态 .

    • 下一批 10 sequences (它必须是10,因为第一批是10)将 reuse 与之前创建的 10 states 相同 .

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

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

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

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

  • 2

    doc of the RNN code中你可以读到这个:

    关于在RNN中使用有状态的注意事项:您可以将RNN层设置为“有状态”,这意味着在一个批次中为样本计算的状态将被重新用作下一批中样本的初始状态 . 这假设在不同连续批次中的样本之间进行一对一映射 .

    我知道这并没有直接回答你的问题,但对我来说它证实了我的想法:当LSTM不是有状态时,状态会在每个样本后重置 . 它们不按批次工作,批量 生产环境 的想法是每个样品彼此独立 .

    因此,您可以为示例重置1000次状态 .

  • 33

    在Keras中,有两种维持状态的模式:1)默认模式 (stateful = False) ,其中每个批次后状态被重置 . AFAIK状态仍将在批次内的不同样品之间进行维护 . 因此,对于您的示例,状态将在每个时期重置5次 .

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

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

    有状态的设置起初可能很难掌握 . 人们可以期望在一批的最后一个样本之间转移状态下一批的第一个样本 . 但实际上,状态实际上是在相同编号的样本之间传播 . 作者有两种选择,他们选择后者 . 了解这个here . 另请参阅有关状态RNN的相关Keras FAQ部分

  • 0

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

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

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

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

  • 6

    每个人似乎都把它弄得太混乱了 . 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 主题 . 它显示了为什么它必须在批次之后重置它 .

相关问题