LSTM精度不变,损耗减少

时间:2019-11-20 06:39:47

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

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

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

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

3 个答案:

答案 0 :(得分:2)

几件事

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

答案 1 :(得分:2)

正如@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'])

正如已经说过的那样,您的模型似乎很好,您只是在查看错误的指标。

希望这会有所帮助,随时问。

答案 2 :(得分:0)

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

还有另一个建议。您能否稍微更改一下验证集并查看其行为?您是如何建立验证集的?

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

指标绝对是一个问题。以上建议是好的。