多变量LSTM预测损失和评估

问题描述 投票:0回答:1

我有一个CNN-RNN模型架构,双向LSTMS用于时间序列回归问题。我的损失并没有超过50个时代。每个时代都有20k个样本。损失在0.001-0.01之间反弹。

batch_size=1
epochs = 50
model.compile(loss='mean_squared_error', optimizer='adam')   
trainingHistory=model.fit(trainX,trainY,epochs=epochs,batch_size=batch_size,shuffle=False)
  1. 我试图用不正确配对的X和Y数据来训练模型,其中损失保持在0.5左右,我的X和Y是否具有非线性关系是合理的结论,这可以通过我的模型在更多的时期学习?
  2. 我的模型的预测捕获模式,但有一个偏移,我使用动态时间扭曲距离手动检查预测的准确性,有更好的方法吗?

型号:

model = Sequential()
model.add(LSTM(units=128, dropout=0.05, recurrent_dropout=0.35, return_sequences=True, batch_input_shape=(batch_size,featureSteps,input_dim)))
model.add(LSTM(units=32, dropout=0.05, recurrent_dropout=0.35, return_sequences=False))
model.add(Dense(units=2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
keras regression lstm rnn
1个回答
3
投票

如果您测试过:

  • 错误的数据:损失~0.5
  • 正确的数据:损失~0.01

那么你的模型实际上能够学到一些东西。

那里有一些可能性:

  1. 您的输出数据不适合最后一层激活的范围
  2. 您的模型达到了当前学习速率的限制(渐变更新步骤太大,无法再改进模型)。
  3. 你的模型不足以完成任务。
  4. 您的数据有一定程度的随机因素

情况1:

确保您的Y在上次激活功能的范围内。

  • 对于tanh(LSTM的默认值),所有Y数据应该在-1和+ 1之间
  • 对于sigmoid,介于0和1之间
  • 对于softmax,介于0和1之间,但请确保您的最后一个维度不是1,否则所有结果将始终为1。
  • 对于relu,介于0和无穷大之间
  • 对于linear,任何价值

如果你有一个有限的激活而不是一个无限的激活,会聚会变得更好。 在第一种情况下,您可以使用较低的学习率重新编译(训练后)模型,通常我们将其除以10,其中默认值为0.0001

案例2:

如果数据正常,请在模型停滞后尝试降低学习率。

adam的默认学习率是0.0001,我们经常除以10:

from keras.optimizers import Adam

#after training enough with the default value: 
model.compile(loss='mse', optimizer=Adam(lr=0.00001)
trainingHistory2 = model.fit(.........)

#you can even do this again if you notice that the loss decreased and stopped again:
model.compile(loss='mse',optimizer=Adam(lr=0.000001)

如果问题是学习率,这将使你的模型比现在学习更多(开始时可能会有一些困难,直到优化器调整自己)。

案例3:

如果你没有成功,也许是时候增加模型的能力了。可能会在图层中添加更多单位,添加更多图层甚至更改模型。

案例4:

你可能无能为力......

但是,如果您像案例3那样增加模型,请小心过度拟合(保留一些测试数据以比较测试损失与训练损失)。

太好的模型可以简单地记住您的数据,而不是学习有关它的重要见解。

© www.soinside.com 2019 - 2024. All rights reserved.