gpt4 book ai didi

keras - LSTM 预测模型 : the loss value doesn't change

转载 作者:行者123 更新时间:2023-12-04 15:55:22 24 4
gpt4 key购买 nike

我正在尝试在 keras 中为时间序列实现一个简单的 LSTM 预测模型。我有 10 个时间序列,lookback_window=28,特征数为 1。我需要预测下一个值(timesteps=28,n_features=1)。这是我的模型以及我尝试训练它的方式:

model = Sequential()
model.add(LSTM(28, batch_input_shape=(49,28,1), stateful=True, return_sequences=True))
model.add(LSTM(14, stateful=True))
model.add(Dense(1, activation='relu'))

earlyStopping = callbacks.EarlyStopping(monitor='val_loss', patience=100, verbose=1, mode='auto')

model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(train_data, train_y,
epochs=1000,
callbacks=[earlyStopping],
batch_size=49,
validation_data=(validation_data, validation_y),
verbose=1,
shuffle=False)
prediction_result = model.predict(test_data, batch_size=49)

我不会在一个纪元之后重置状态,也不会使用改组,因为时间序列中的顺序很重要,并且它们之间存在联系。问题是损失值有时仅在第一个 epoch 之后才会略有变化,然后它保持不变并且根本没有变化,大多数时候它根本没有变化。我尝试使用不同的优化,如 RMSprop ,改变它的学习率,移除earlystope让它训练更长时间,改变batch_size甚至不带batch进行训练,尝试相同的无状态模型,设置 shuffle=True ,添加更多层并使其更深,......但它们都没有任何区别!我想知道我做错了什么!有什么建议吗?!

附言我的数据由 10 个时间序列组成,每个时间序列有 567 个长度:
timeseries#1: 451, 318, 404, 199, 225, 158, 357, 298, 339, 155, 135, 239, 306, ....
timeseries#2: 304, 274, 150, 143, 391, 357, 278, 557, 98, 106, 305, 288, 325, ....
...
timeseries#10: 208, 138, 201, 342, 280, 282, 280, 140, 124, 261, 193, .....

我的回溯窗口是 28。所以我用 28 个时间步生成了以下序列:
[451, 318, 404, 199, 225, 158, 357, 298, 339, 155, 135, 239, 306, .... ]
[318, 404, 199, 225, 158, 357, 298, 339, 155, 135, 239, 306, 56, ....]
[404, 199, 225, 158, 357, 298, 339, 155, 135, 239, 306, 56, 890, ....]
...
[304, 274, 150, 143, 391, 357, 278, 557, 98, 106, 305, 288, 325, ....]
[274, 150, 143, 391, 357, 278, 557, 98, 106, 305, 288, 325, 127, ....]
[150, 143, 391, 357, 278, 557, 98, 106, 305, 288, 325, 127, 798, ....]
...
[208, 138, 201, 342, 280, 282, 280, 140, 124, 261, 193, .....]
[138, 201, 342, 280, 282, 280, 140, 124, 261, 193, 854, .....]

然后,我将我的数据拆分如下(data.shape=(5390,28,1) is 5390 for 10 timesesies):
num_training_ts = int(data.shape[0] / 539 * (1 - config['validation_split_ratio']))
train_size = num_training_ts * 539
train_data = data[:train_size, :, :]
train_y = y[:train_size]

validation_data = data[train_size:-1*539, :, :]
validation_y = y[train_size:-1*539]

test_data = data[-1*539:, :, :] # The last timeseries
test_y = y[-1*539:]

我使用 minMaxScale 在 -1 和 1 之间缩放数据,但为了简单起见,我在这里使用实际值。最后我有以下几点:
train_data.shape=(3234,28,1)
train_y.shape=(3234,)
test_data.shape=(539,28,1)
test_y.shape=(539,)
validation_data.shape=(1617,28,1)
validation_y.shape=(1617,)

最佳答案

当我首先发现此类问题时,我将重点放在数据上:我的数据是否已缩放?我有足够的数据用于这个模型吗?

然后我传递给模型。在您的情况下,似乎所有的学习都是在第一次迭代中完成的。那么为什么不尝试更改 学习率衰变你的优化器?

使用 keras 就这么简单。首先定义您的优化器(在您的代码中,我看到您使用了“亚当”):

my_adam_optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

然后在 complie 函数中使用它:
model.compile(loss='mean_squared_error', optimizer=my_adam_compiler)

更新:

最后一个 relu 层“削减”了负值,因此如果您的目标包含负值,则无法预测它们。在主题中的某个地方,您说您在 -1 和 1 之间使用了 minmaxScaler,并且肯定会给您带来问题。通过删除激活参数,您可以使用默认值,我认为它是“线性的”。
删除 relu从最后一层激活可以解决问题!

关于keras - LSTM 预测模型 : the loss value doesn't change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51931932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com