Keras中的LSTM返回始终相同的输出

时间:2019-01-10 09:29:47

标签: python keras lstm

我有一个大小为(5358,293,30)的数据集,我想训练一个LSTM网络以预测0到1之间的值。

我的神经网络定义如下:

model = Sequential()
model.add(LSTM(10, input_shape=(293, 30)))
model.add(Dense(1, activation="sigmoid"))
model.compile(loss="mean_squared_error", optimizer="adam")
model.fit(Xtrain, Ytrain, epochs=20, batch_size=38, shuffle=False)

火车中所有时期的损失值为〜0.04。 当我在测试数据上测试神经网络时,我得到的输出总是与结果相同,〜0.80。 我也尝试了更大的网络,但是输出没有改变。

我使用默认参数,并缩放了[0,1]范围内的数据。

此问题的可能原因是什么?我该如何解决?

更新: 简化版本的model.summary()的输出:

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 10)                1640      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 11        
=================================================================
Total params: 1,651
Trainable params: 1,651
Non-trainable params: 0
_________________________________________________________________

完整版:

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_2 (LSTM)                (None, 293, 64)           24320     
_________________________________________________________________
lstm_3 (LSTM)                (None, 64)                33024     
_________________________________________________________________
dense_2 (Dense)              (None, 64)                4160      
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 65        
=================================================================
Total params: 61,569
Trainable params: 61,569
Non-trainable params: 0
_________________________________________________________________

2 个答案:

答案 0 :(得分:0)

  1. 您可以使用交叉验证来跟踪此类奇怪的错误。
  2. 改组数据有助于更好地概括,请尝试
  3. 数据准备可能是另一个原因,您是否考虑过缩短序列长度,因为您使用的序列很大。

答案 1 :(得分:0)

如果我们假设您的模型还可以,那么您首先要做的就是增加纪元数。

epochs=20

也可以使用优化器。例如,您选择Adam优化器,确保测试不同的参数:

opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)

您可以添加model.summary(),以更好地预测模型。我认为提供模型摘要是了解系统的第一件事。

既然您提到了功能,请务必注意如何表示它们。根据功能表示,您可能需要修改LSTM模型。