Keras LSTM TimeDistributed,有状态

Keras LSTM TimeDistributed, stateful

是否有任何详细说明 TimeDistributed、stateful 和 return_sequences 是如何工作的?在这两种情况下我都必须设置 shuffle=False 吗?它适用于 windows(1-11、2-12、3-13 等)还是应该分批使用(1-11、12-22、13-33 等)

我对 LSTM 层特别感兴趣。

时间分布:

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

例如,如果一个图层需要 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 维度中实际执行其循环计算。另一个时间维度只是多次复制这一层。

时间分布+密集:

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

是否对 Dense 层使用 TimeDistributed 是可选的,结果是相同的:如果您的数据是 3D,Dense 层将在第二个维度上重复。

Return 序列:

这在 documentation 中有很好的解释。

对于循环层,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 的唯一方法是复制数据。

输入数组应按 windows 组织。每 window 步一个序列。如果您想将所有 window 步骤保留为单个批处理条目,则可以选择利用 TimeDistributed 包装器。但是您也可以将所有步骤都设为单独的序列。

由于状态的原因,stateful=True 图层无法与 windows 一起使用。如果您批量输入从 1 到 12 的步骤,下一批将期望步骤 13 作为保持连接的第一步。