我正在尝试为异常检测任务创建一个自动编码器,但我注意到即使它在训练集上表现得非常好,它也会开始停止重新创建一半的测试集。我尝试了 10 多个模型(LSTM、ConvAE、ConvLSTM),但它们都无法在同一点重建时间序列。
这些是在训练集上的表现。蓝色部分是原始时间序列,红色部分是 AE 重建的时间序列。
这些是在训练集上的表现。我不明白为什么所有模型从那时起停止执行。这是否意味着那部分有异常?
编辑:我正在用有关我的数据集和代码的一些详细信息来更新问题:我有一个包含 30 个设备的数据集,每个设备都有大约 9000 个值。数据集也是结构化的:
device1 device2 device3 .... device30
0.20 0.35 0.12 0.56
1.20 2.10 5.75 0.16
3.20 9.21 1.94 5.12
5.20 4.32 0.42 9.56
.... .... .... ....
7.20 6.21 0.20 -9.56
由于我遵循本指南,我开始创建一个序列方法来为 Conv1D 层准备数据:
TIME_STEPS = 10
# Generated training sequences for use in the model.
def create_sequences(values, time_steps=TIME_STEPS):
output = []
for i in range(len(values) - time_steps):
output.append(values[i: (i + time_steps)])
return np.stack(output)
这是我创建序列和规范化数据集的地方:
# split the train/val/test set
n_features = dataset_sequences.shape[1]
X_train = dataset_sequences[0:3000, :]
X_val = dataset_sequences[3000:6000, :]
X_test = dataset_sequences[6000:9000, :]
# normalize the data
train_mean = X_train.mean()
train_std = X_train.std()
X_train = (X_train - train_mean) / train_std
X_val = (X_val - train_mean) / train_std
X_test = (X_test - train_mean) / train_std
然后,我将形状为 (3000, 10, 30) 的 X_train 提供给我的 Conv1D 自动编码器:
model = tf.keras.Sequential(
[
tf.keras.layers.Input(shape=(X_train.shape[1], X_train.shape[2])),
tf.keras.layers.Conv1D(
filters=64, kernel_size=5, padding="same", strides=1, activation="relu"),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Conv1D(
filters=32, kernel_size=5, padding="same", strides=1, activation="relu"),
tf.keras.layers.MaxPooling1D(pool_size=2),
tf.keras.layers.Conv1DTranspose(
filters=32, kernel_size=5, padding="same", strides=1, activation="relu"),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Conv1DTranspose(
filters=64, kernel_size=5, padding="same", strides=1, activation="relu"),
tf.keras.layers.UpSampling1D(size=2),
tf.keras.layers.Conv1DTranspose(filters=30, kernel_size=5, padding="same"),
]
)

