LSTM 精度不变,损失减少

LSTM Accuracy unchanged while loss decrease

我们放置了一个传感器来检测加速度计中的异常情况。

只有一个传感器,所以我的数据是一维数组。

我尝试使用 LSTM 自动编码器进行异常检测。

但是我的模型没有工作,因为训练集和验证集的损失在减少,但准确性没有变化。

这是我的代码和训练日志:

dim = 1
timesteps = 32
data.shape = (-1,timesteps,dim)

model = Sequential()
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(Dense(dim))

lr = 0.00001
Nadam = 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 samples
Epoch 1/2000
 - 3s - loss: 0.3855 - acc: 7.2338e-06 - val_loss: 0.3760 - val_acc: 7.2338e-06
Epoch 2/2000
 - 2s - loss: 0.3666 - acc: 7.2338e-06 - val_loss: 0.3567 - val_acc: 7.2338e-06
Epoch 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-05
Epoch 747/2000
 - 2s - loss: 0.0021 - acc: 1.4468e-05 - val_loss: 0.0021 - val_acc: 1.4468e-05
Epoch 748/2000
 - 2s - loss: 0.0021 - acc: 1.4468e-05 - val_loss: 0.0021 - val_acc: 1.4468e-05
Restoring model weights from the end of the best epoch
Epoch 00748: early stopping

几件事

  • 正如评论区中的 Matias 所指出的,您正在进行回归,而不是分类。准确性不会给出回归的预期值。也就是说,您可以看到准确性 did 提高了(从 0.0000072 到 0.0000145)。检查模型的直接输出以检查它与原始时间序列的近似程度。
  • 当验证数据与训练数据相同时,您可以安全地省略验证数据
  • 对于自动编码器,您通常希望以某种方式压缩数据,以便能够在更易于分析的较低维度中表示相同的数据(对于异常或其他情况。在您的情况下,您正在扩展维度而不是减少它,这意味着您的自动编码器的最佳策略是传递它获得的相同值(您的时间序列的值被发送到 50 个 LSTM 单元,这些单元将它们的结果发送到 1 个密集单元)。您可能能够如果您将 return_sequence 设置为 False(即仅返回最后一个时间步的结果),最好设置为多个单元,然后您尝试从中重建时间序列。它可能会失败,但是仍然可能导致更好的模型

正如@MatiasValdenegro 所说,当您想要进行回归时,您不应该使用准确性。 你可以看到你的模型可能没问题,因为你的损失随着时间的推移而减少,并且在早期停止时非常低。 在回归问题中,通常使用这些指标:

  • 均方误差:mean_squared_error、MSE 或 mse

  • 平均绝对误差:mean_absolute_error、MAE、mae

  • 平均绝对百分比误差:mean_absolute_percentage_error,MAPE, 马普

  • 余弦近似值:cosine_proximity,余弦

Resource

要获得正确的指标,您应该更改此指标(例如“均方误差”):

model.compile(loss='mae', optimizer=Nadam ,metrics=['mse'])

如前所述,您的模型似乎没问题,您只是看错了指标。

希望对您有所帮助,欢迎随时提问。

当您遇到这个问题时,提前停止并不是正则化的最佳技术。至少,当您仍在努力修复它时,我宁愿将其取出或用其他正则化方法替换它。弄清楚会发生什么。

还有一个建议。您能否稍微更改验证集并查看行为是什么?您是如何构建验证集的?

您是否对数据进行了规范化/标准化?请注意标准化对于 LSTMs 更为重要

指标肯定有问题。以上建议都不错