Multivariate LSTM Forecast Loss 和评估
Multivariate LSTM Forecast Loss and evaluation
我有一个 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)
- 我尝试使用错误配对的 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
那么你的模型实际上能够学习一些东西。
那里有一些可能性:
- 你的输出数据不在最后一层激活的范围内
- 您的模型达到了当前学习率的极限(梯度更新步长太大,无法再改进模型)。
- 您的模型不足以完成这项任务。
- 您的数据具有一定程度的随机因素
案例一:
确保您的 Y
在您上次激活函数的范围内。
- 对于
tanh
(LSTM的默认值),所有Y数据应该在-1和+1之间
- 对于
sigmoid
,介于 0 和 1 之间
- 对于
softmax
,介于 0 和 1 之间,但请确保您的最后一个维度不是 1,否则所有结果将始终为 1。
- 对于
relu
,介于 0 和无穷大之间
- 对于
linear
,任意值
如果你有一个有限的激活而不是无限大的激活,收敛会更好。
第一种情况,你可以重新编译(训练后)学习率较低的模型,通常我们将其除以 10,其中默认为 0.0001
:
案例二:
如果数据没问题,请在模型停滞后尝试降低学习率。
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 那样增加模型,请注意过度拟合(保留一些测试数据以比较测试损失与训练损失)。
太好的模型只会记住你的数据,而不是学习关于它的重要见解。
我有一个 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)
- 我尝试使用错误配对的 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
那么你的模型实际上能够学习一些东西。
那里有一些可能性:
- 你的输出数据不在最后一层激活的范围内
- 您的模型达到了当前学习率的极限(梯度更新步长太大,无法再改进模型)。
- 您的模型不足以完成这项任务。
- 您的数据具有一定程度的随机因素
案例一:
确保您的 Y
在您上次激活函数的范围内。
- 对于
tanh
(LSTM的默认值),所有Y数据应该在-1和+1之间 - 对于
sigmoid
,介于 0 和 1 之间 - 对于
softmax
,介于 0 和 1 之间,但请确保您的最后一个维度不是 1,否则所有结果将始终为 1。 - 对于
relu
,介于 0 和无穷大之间 - 对于
linear
,任意值
如果你有一个有限的激活而不是无限大的激活,收敛会更好。
第一种情况,你可以重新编译(训练后)学习率较低的模型,通常我们将其除以 10,其中默认为 0.0001
:
案例二:
如果数据没问题,请在模型停滞后尝试降低学习率。
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 那样增加模型,请注意过度拟合(保留一些测试数据以比较测试损失与训练损失)。
太好的模型只会记住你的数据,而不是学习关于它的重要见解。