Keras LSTM TimeDistributed,有状态

Ale*_*rov 2 stateful lstm keras

是否有详细解释TimeDistributed,stateful和return_sequences如何工作?在这两种情况下我都要设置shuffle = False吗?它是否适用于窗户(1-11,2-12,3-13等)或是否应批量使用(1-11,12-22,13-33等)

我对LSTM图层特别感兴趣.

Dan*_*ler 15

TimeDistributed:

这不会影响图层的工作方式.这样做的目的是增加一个"时间"(也可能不是时间)维度.考虑到该时间维度,将包裹的层应用于输入张量的每个切片.

例如,如果一个图层期望具有3个维度的输入形状(batch, length, features),那么使用TimeDistributed包装器将使其期望4个维度:(batch, timeDimension, length, features)

然后,该层将被"复制"并同等地应用于时间维度中的每个元素.

使用LSTM层,它的工作原理相同.虽然LSTM层已经在其输入形状中预期了时间维度:(batch, timeSteps, features),您可以使用它TimeDistributed来添加另一个"时间"维度(这可能意味着任何事情,而不是确切时间),并使此LSTM层可以重新用于此新元素中的每个元素时间维度.

  • LSTM - 期待投入 (batch, timeSteps, features)
  • TimeDistributed(LSTM()) - 期待投入 (batch, superSteps, timeSteps, features)

在任何情况下,LSTM遗嘱实际上只会在timeSteps维度中执行其重复计算.另一个时间维度只是多次复制该图层.

TimeDistributed + Dense:

Dense层(可能还有其他一些)已经支持3D输入,尽管标准是2D : (batch, inputFeatures).

使用TimeDistributed或不使用Dense图层是可选的,结果是相同的:如果您的数据是3D,则将为第二维重复Dense图层.

返回序列:

这在文档中有很好的解释.

对于循环图层,keras将使用timeSteps维度来执行其重复执行的步骤.对于每个步骤,它自然会有一个输出.

您可以选择获取所有步骤(return_sequences=True)的输出或仅获取最后一个输出(return_sequences=False)

考虑输入形状(batch, timeSteps, inputFeatures)和带有outputFeatures单位的图层:

  • 何时return_sequences=True,输出形状为(batch, timeSteps, outputFeatures)
  • 何时return_sequences=False,输出形状为(batch, outputFeatures)

在任何情况下,如果使用TimeDistributed包装器,则superSteps维度将在输入和输出中保持不变.

有状态=真

通常,如果您可以将所有序列的所有步骤放在输入数组中,那么一切都很好,您不需要stateful=True图层.

Keras为批次中的每个序列创建"状态".批量维度等于序列数.当keras完成处理批处理时,它会自动重置状态,这意味着:我们到达序列的结尾(最后一步),从第一步开始带来新的序列.

使用时stateful=True,这些状态不会被重置.这意味着将另一批次发送到模型不会被解释为一组新的序列,而是之前处理的序列的附加步骤.然后,您必须model.reset_states()手动告诉模型您已到达序列的最后一步,或者您将开始新的序列.

唯一需要的shuffle=False是这种stateful=True情况.因为对于每个批次,输入许多序列.在每个批次中,这些序列必须保持相同的顺序,以便每个序列的状态不会混合.

有状态层适用于:

  • 太大的数据.如果您一次使用所有时间步骤,它就不适合您的记忆
  • 您希望连续生成时间步骤,并将这些新步骤作为输入添加到下一步,而不需要固定大小.(您自己在代码中创建这些循环)
  • (其他用户的评论??)

使用Windows

到目前为止,我可以使用Windows的唯一方法是复制数据.

输入数组应该在窗口中组织.每个窗口步骤一个序列.TimeDistributed如果要将所有窗口步骤保持为单个批处理条目,则可以选择利用包装器.但是你也可以将所有步骤都作为单独的序列.

stateful=True由于状态,该图层不能与窗口一起使用.如果您批量输入1到12的步骤,则下一批将期望步骤13作为保持连接的第一步.

  • 你好,如何在 TimeDistributed LSTM 中手动插入状态? (2认同)