目前我正在尝试构建一个自动编码器来检测时间序列数据中的异常情况。 我的方法基于本教程:https://keras.io/examples/timeseries/timeseries_anomaly_detection/
但通常,我的数据比这个简单的教程更复杂。
我有两个不同的时间序列,来自两个传感器和一些元数据,例如时间序列是从哪台机器记录的。
使用普通的 MLP 网络,您可以拥有一个用于时间序列的网络和一个用于元数据的网络,并将它们合并到更高的层中。但是如何使用这些数据作为自动编码器的输入呢? 你有什么想法、教程或论文的链接吗?
在本教程中,您可以看到 LSTM-VAE,其中输入时间序列以某种方式与分类数据连接:https://github.com/cerlymarco/MEDIUM_NoteBook/tree/master/VAE_TimeSeries
有一篇文章解释了代码(但没有详细说明)。在那里您可以找到该模型的以下说明:
“编码器由一个 LSTM 单元组成。它接收由原始流量数据和分类特征嵌入串联而成的 3D 序列作为输入。与 VAE 架构中的每个编码器一样,它会生成一个 2D 输出,用于使用解码器从 2D 潜在分布上采样中采样以形成 3D 序列,然后将生成的序列与通过 LSTM 单元传递的原始分类嵌入连接起来以重建原始流量。序列。”
但遗憾的是我不明白它们是如何连接输入数据的。如果你能理解的话,如果你能解释一下就好了 =)
我想我明白了。您必须查看 .fit() 函数的输入。它不是一个数组,而是有用于单独分类数据的单独数组。另外还有原始输入(在本例中是时间序列)。因为他的输入有这么多的数组,所以他需要有相应数量的输入层。因此,时间序列有一个输入层,同一时间序列有另一个输入层(它是一个自动编码器,因此 x_train 的工作方式类似于 y_train)以及一系列输入层,直接与分类数据的嵌入层堆叠在一起。当他拥有相应输入层中的所有数据后,他可以按照您所说的方式将它们连接起来。 顺便说一句,他使用相同的解码器列表来为他提供附加信息。我尝试了一下,结果发现在附加输入和解码器之间添加一个 dropout 层(高 dropout,例如 0.6)很有帮助。如果这样做,解码器必须从潜在 z 中学习,而不仅仅是从附加数据中学习!
希望我能帮助你=)
考虑到人工智能模型应该对输入进行泛化,在这种情况下,元数据是关于时间序列来自哪台机器的(假设您可能只是为每台机器使用一个 ID)模型如何在未知机器上泛化?