【问题标题】:LSTM Accuracy unchanged while loss decreaseLSTM 准确率不变而损失减少
【发布时间】:2020-03-15 19:23:48
【问题描述】:

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

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

我尝试使用 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

【问题讨论】:

  • 你在做回归,准确率是一个只对分类有效的指标。
  • 谢谢!!这个信息很有用!!

标签: machine-learning keras deep-learning lstm autoencoder


【解决方案1】:

几件事

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

【讨论】:

    【解决方案2】:

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

    • 均方误差:mean_squared_error、MSE 或 mse

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

    • 平均绝对百分比误差:mean_absolute_percentage_error, MAPE, 地图

    • 余弦接近度:cosine_proximity, cosine

    Resource

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      您是否对数据进行了标准化/标准化?请注意,归一化对于 LSTM 更为重要

      指标绝对是个问题。以上建议都不错。

      【讨论】:

      • 如果您确切知道 minMaxScaler 可能值的范围应该没问题。
      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多