Keras - 意外的预测结果

时间:2017-10-24 20:09:31

标签: keras lstm predict

我试图创建一个keras LSTM来预测时间序列。我的x_train的形状像3000,15,10(例如,时间步,特征),y_train就像3000,15,1而我试图构建多对多的模型(每个序列10个输入特征使得1个输出/序列)。

我使用的代码是:

model = Sequential()

model.add(LSTM(
    10,
    input_shape=(15, 10),
    return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(
    100,
    return_sequences=True))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))
model.compile(loss="mse", optimizer="rmsprop")
model.fit(
        x_train, y_train,
        batch_size=1, nb_epoch=1, validation_split=0.05)
predicted = model.predict(x_test)

我的数据如下:

x_train = [
    [
        [3,4,3,1.5,0,7....], # 10 Features
        [2,4,1,1,4,3....],
        .... # 15 Timesteps
    ],
    .... # 3000 Examples
]
y_train = [
    [
        [0],
        [5],
        ....
    ],
    .....
]

代码编译和拟合没有错误,但预测值不现实。

期望值是0到15之间的整数。然而,预测是在-0.03和1之间浮动。此外,预测有15个时间步,但我实际上对第16个时间步(预测的未来结果)感兴趣。

示例预测:

predicted = [
    [
        [0.035478],
        [0.046423],
        [0.948723],
        ....
    ],
    ....
]

我的keras版本为2.0.6,python版本为3.4.5。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您应该将y_train重新缩放到介于0和1之间。假设y_train和预测是numpy数组:

y_train = y_train/15.0

然后,您可以在完成后重新调整预测。

predicted = (predicted*15).astype(int)

答案 1 :(得分:0)

  

我正在尝试构建多对多模型(每个序列10个输入要素使1个输出/序列)。

在我看来,你想建立一个多对一的模型。 (每个序列1个输出的10个输入功能)

为此你需要:

  1. 使用形状(3000,1)构建y_train。 y_train将是未来预测,t + 1时间的预测。如果您想预测更多时间步骤,请调整y_train和最后一个密集层来执行此操作。
  2. 如果您还没有,请缩放训练数据,因为神经网络需要比例数据。
  3. 从上一个LSTM图层中删除return_sequences,如下所示:
  4. model = Sequential()
    model.add(LSTM(10, input_shape=(15, 10), return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(100, return_sequences=False))
    model.add(Dropout(0.2))
    model.add(Dense(1, activation='linear'))