LSTM精度保持不变,损失减少



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

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

我尝试使用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在评论字段中指出的那样,您正在进行回归,而不是分类。精度不会给出回归的预期值。也就是说,你可以看到的准确性确实有所提高(从0.0000072提高到0.0000145(。检查模型的直接输出,以检查它与原始时间序列的近似程度
  • 当验证数据与训练数据相同时,可以安全地省略验证数据
  • 利用自动编码器,通常,您希望以某种方式压缩数据,以便能够以较低的维度表示相同的数据,这样更容易分析(异常或其他情况(。在您的情况下,您是在扩展维度,而不是减少维度,这意味着自动编码器的最佳策略是通过它获得的相同值(时间序列的值被发送到50个LSTM单元,后者将结果发送到1个密集单元(。如果将return_sequence设置为False(即只返回上一个时间步长的结果(,最好是将其设置为多个单位,然后尝试从中重建时间序列,则可能能够解决此问题。它可能会失败,但仍有可能带来更好的模式

As@MatiasValdenegro说,当你想进行回归时,不应该使用准确性。你可以看到,你的模型可能很好,因为你的损失在各个时期都在减少,并且在提前停止时非常低。在回归问题中,通常使用这些度量:

  • 均方误差:均方误差、MSE或MSE

  • 平均绝对误差:Mean_Absolute_Error、MAE、MAE

  • 平均绝对百分比误差:Mean_Absolute_Percentage_Error,MAPE,mape

  • 余弦接近度:余弦_最大值,余弦

资源

为了获得正确的度量,你应该改变这一点(例如,对于"均方误差"(:

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

如前所述,您的模型似乎很好,您只是看到了错误的指标。

希望这能有所帮助,请随意询问。

当您面临这个问题时,提前停止并不是正则化的最佳技术。至少,当你还在努力修复它的时候,我宁愿把它去掉,或者用其他正则化方法代替它。弄清楚会发生什么。

还有另一个建议。你能稍微更改一下验证集,看看行为是什么吗?您是如何构建验证集的?

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

度量肯定是个问题。以上建议很好。

相关内容

  • 没有找到相关文章

最新更新