Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keras LSTM预测模型:损失值不';不变_Keras_Deep Learning_Time Series_Lstm - Fatal编程技术网

Keras LSTM预测模型:损失值不';不变

Keras LSTM预测模型:损失值不';不变,keras,deep-learning,time-series,lstm,Keras,Deep Learning,Time Series,Lstm,我试图在keras中为时间序列实现一个简单的LSTM预测模型。我有10个timeseries,回望窗口=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, state

我试图在keras中为时间序列实现一个简单的LSTM预测模型。我有10个timeseries,回望窗口=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)
我不会在一个历元后重置状态,也不会使用洗牌,因为时间序列中的顺序很重要,并且它们之间有联系。问题是损失值有时仅在第一个历元后发生轻微变化,然后它保持不变,并且根本没有变化,大多数时候它根本没有变化。我尝试使用一种不同的优化方法,比如
RMSprop
,改变了它的学习速度,删除了早期的作用域,让它训练的时间更长,改变了批量大小,甚至没有批量地训练,尝试了相同的无状态模型,设置
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)为5390,共10次):

我使用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,这很容易。首先定义优化器(在代码中我看到您使用了“Adam”):

然后在complie函数中使用它:

model.compile(loss='mean_squared_error', optimizer=my_adam_compiler)
更新:


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

您可以添加有关输入数据的更多信息吗?我通过对输入数据进行适当的缩放解决了一个类似的问题。只是在关于数据的问题上添加了更多细节。我使用
minMaxScale
在-1和1之间缩放数据。我测试了缩放过程,看起来还可以,我通过转换回原始值进行了测试,结果是正确的。@paolof89谢谢你的回答。问题来自模型的最后一层,致密层。当我移除
激活时
开始学习!但我不确定这是怎么引起这个问题的!最后一个relu层“剪切”负值,因此如果目标包含负值,则无法预测它们。在主题的某个地方,您说过您使用了介于-1和1之间的minmaxScaler,这肯定会给您带来问题。通过删除激活参数,您可以使用defalut,我认为它是“线性的”@paolof89,谢谢您的解释。我将把它添加到您的答案中来解决这个问题。
my_adam_optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='mean_squared_error', optimizer=my_adam_compiler)