问题描述
我正在开发一个使用 MLP 的自动编码器来检测多变量时间序列中的异常。为了简化问题,我开始只使用一个系列变量。
单变量案例
我应用它的方法是将时间序列分解成多个部分,然后将这些部分呈现给网络。例如,我的系列由 1000 个点组成,我将其分成 50 个长度为 20 的子系列。这些子系列中的每一个都成为学习网络的示例。
DAE input_shape
应该是什么?我看到 shape=(20,)
和 shape=(20,1)
之间存在差异。我把我一直在处理的 DAE 代码留在下面。而DAE最后一层的格式应该是怎样的呢?当我使用只有 1 个神经元的输出层时,模型正常工作,为什么?
model = keras.Sequential([
### ENCODING ###
layers.Input(shape=(df_train.shape[1],df_train.shape[2])),# or ?
#layers.Input(shape=(df_train.shape[1],)),layers.Dense(16,activation='sigmoid'),layers.Dropout(rate=0.1),layers.Dense(8,### LATENT SPACE
layers.Dense(4,### DECODING ###
layers.Dense(8,layers.Dense(1,activation='sigmoid')
])
多元案例
考虑多变量情况,其中我有 16 个时间序列。输入形状和输出层看起来如何?
解决方法
密集层,MPL 的构建块,只需要一个维度。因此,您必须将 2D 矢量展平为 1D。矢量的形状将(width*height,)
。
另一种方法是使用卷积或循环自动编码器 (LSTM/GRU)。使用卷积自动编码器,大多数层将是 Conv2d 或 Conv1d。然后您将使用单个 Dense 层作为压缩瓶颈。卷积层接受形状(宽度、高度、通道)的输入——如果没有第三维,通道可以是 1。