我们放置了一个传感器来检测加速度计中的异常情况。
只有一个传感器,所以我的数据是一个一维数组。
我尝试使用LSTM自编码器进行异常检测。
但我的模型没有正常工作,因为训练集和验证集的损失都在减少,但准确率未变。
这是我的代码和训练日志:
dim = 1timesteps = 32data.shape = (-1,timesteps,dim)model = Sequential()model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))model.add(Dense(dim))lr = 0.00001Nadam = optimizers.Nadam(lr=lr)model.compile(loss='mae', optimizer=Nadam ,metrics=['accuracy'])EStop = EarlyStopping(monitor='val_loss', min_delta=0.001,patience=150, verbose=2, mode='auto',restore_best_weights=True)history = model.fit(data,data,validation_data=(data,data),epochs=2000,batch_size=64,verbose=2,shuffle=False,callbacks=[EStop]).history
训练日志
Train on 4320 samples, validate on 4320 samplesEpoch 1/2000 - 3s - loss: 0.3855 - acc: 7.2338e-06 - val_loss: 0.3760 - val_acc: 7.2338e-06Epoch 2/2000 - 2s - loss: 0.3666 - acc: 7.2338e-06 - val_loss: 0.3567 - val_acc: 7.2338e-06Epoch 3/2000 - 2s - loss: 0.3470 - acc: 7.2338e-06 - val_loss: 0.3367 - val_acc: 7.2338e-06...Epoch 746/2000 - 2s - loss: 0.0021 - acc: 1.4468e-05 - val_loss: 0.0021 - val_acc: 1.4468e-05Epoch 747/2000 - 2s - loss: 0.0021 - acc: 1.4468e-05 - val_loss: 0.0021 - val_acc: 1.4468e-05Epoch 748/2000 - 2s - loss: 0.0021 - acc: 1.4468e-05 - val_loss: 0.0021 - val_acc: 1.4468e-05Restoring model weights from the end of the best epochEpoch 00748: early stopping
回答:
几点建议
- 正如评论区的Matias所指出的,你在做回归而不是分类。准确率对于回归不会给出预期的值。也就是说,你可以看到准确率实际上是提高了(从0.0000072提高到0.0000145)。检查模型的直接输出,以了解它对原始时间序列的近似程度如何。
- 当你的验证数据与训练数据相同时,你可以安全地省略验证数据。
- 对于自编码器,通常希望以某种方式压缩数据,以便能够以更低的维度来表示相同的数据,这样更容易分析(无论是用于异常检测还是其他目的)。在你的案例中,你是在增加维度而不是减少维度,这意味着你的自编码器的最佳策略将是直接传递它接收到的相同值(你的时间序列的值被发送到50个LSTM单元,这些单元将其结果发送到1个Dense单元)。如果你将return_sequence设置为False(即只返回最后一个时间步的结果),最好是返回到多个单元,然后你尝试从中重建时间序列。这样做可能会失败,但仍然可能导致更好的模型。