Keras 多元LSTM预测损失及其评价

Keras 多元LSTM预测损失及其评价,keras,regression,lstm,rnn,Keras,Regression,Lstm,Rnn,我有一个CNN-RNN模型架构,用于时间序列回归问题的双向LSTM。我的损失不会超过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

我有一个CNN-RNN模型架构,用于时间序列回归问题的双向LSTM。我的损失不会超过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)
  • 我试图用不正确配对的X和Y数据训练模型,其中 损失保持在0.5左右,我的X和Y是否合理 有一个非线性关系,可以通过我的模型学习 更多的时代
  • 我的模型的预测捕获了模式,但有一个偏移量,我使用动态时间扭曲距离手动检查预测的准确性,有更好的方法吗
  • 型号:

    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'])
    
    如果您使用以下工具进行测试:

    • 错误数据:损失~0.5
    • 正确数据:损失~0.01
    那么你的模型实际上可以学到一些东西

    有一些可能性:

  • 您的输出数据不符合最后一层的激活范围
  • 您的模型达到了当前学习速率的限制(梯度更新步骤太大,无法再改进模型)
  • 你的模型不能胜任这项任务
  • 你的数据有一定程度的随机因素
  • 案例1:

    确保您的
    Y
    处于上次激活功能的范围内

    • 对于
      tanh
      (LSTM的默认值),所有Y数据应介于-1和+1之间
    • 对于
      sigmoid
      ,介于0和1之间
    • 对于
      softmax
      ,介于0和1之间,但请确保最后一个维度不是1,否则所有结果将始终为1
    • 对于
      relu
      ,介于0和无穷大之间
    • 对于
      线性
      ,任何值
    如果你有一个有限的激活,而不是一个无限的激活,那么收敛会更好。
    在第一种情况下,您可以以较低的学习率重新编译(训练后)模型,通常我们将其除以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那样增加了模型,请小心过度拟合(保留一些测试数据以比较测试损失和训练损失)


    太好的模型只会记住你的数据,而不是学习关于它的重要见解

    你能评论一下这段训练史吗?{'acc':[0.54,0.62,0.70,0.77,0.81,0.84,0.85,0.86,0.88,0.89],'loss':[0.69,0.64,0.56,0.47,0.40,0.35,0.32,0.29,0.27,0.24],'val_acc':[0.52,0.52,0.51,0.50,0.52,0.53,0.51,0.49],'val_'[0.69,0.75,0.81,0.99,1.03,1.09,1.04,1.16,1.13,1.35]}听起来像是过度拟合。当训练数据变得更好而测试数据变得更差时。这意味着你的模型正在学习记忆训练数据。(它有太多的参数,可能太多的层,或者太多的单元)。人们经常使用“退出”层以减少过度拟合。您也可以尝试更小的模型。(这是假设您的验证数据和培训数据是正确的,选择时没有偏差,等等。)我在问题中添加了我的模型。请看一看。因为我只是想证明我的X和Y中存在一种可学习的关系,而且我的准确性稍微提高了一些(53%时提高了2%)根据我正确匹配的数据,我能得出结论吗?我不确定的原因是我的损失曲线看起来不像流行的L形曲线。正如我所说,你的曲线是过度拟合的曲线。你需要制作一个更小的模型。模型的能力更低。不幸的是,最佳尺寸没有确切的答案。你必须测试直到你的曲线变小鞑靼人的行为不同。你的模型目前正在记忆训练结果(因为你的模型太好了)。它没有学习任何关于测试数据的东西。