使用Keras中的LSTM进行多变量多时间序列回归的恒定输出值

时间:2017-06-11 15:13:43

标签: python tensorflow neural-network keras lstm

我目前正在研究具有多个时间序列的类似机器和Keras中具有Tensorflow后端的多个功能的回归问题。

目标是预测每个时间步的值,这给出了机器的剩余寿命。

我对所有值进行了规范化,并在所有时间序列前面填充输入和输出,使其长度与最长时间一样长。 然后我添加了掩蔽层来掩盖那些零。

我遇到的问题是网络给出了输出变量的常量值。

我已经玩过隐藏的神经元,批次,激活函数,时代,但没有真正改变。 损失缓慢减少,但所有时间步长的输出保持不变。 哦,它有点适用于一个时间序列。

对于所有零填充行,我得到一些像4.88323085e-02的值(我猜这好吗?),对于所有其他行,输出看起来像这样:

[...
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01,   8.72270355e+01,
8.72270355e+01,   8.72270355e+01]

我的数据形成如下:

[n_machines, n_timesteps, n_features]

输出如下:

[n_machines, n_timesteps, remaining_life]

我目前的型号如下:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(None, n_features)))
model.add(LSTM(1000, return_sequences = True, unit_forget_bias=True))
model.add(TimeDistributed(Dense(1)))

model.compile(loss="mse", optimizer="adam", metrics=[RMSE])

model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=100, batch_size=1, shuffle=True)

遗憾的是,使用某种东西而不是神经网络是一种选择,所以我需要做这项工作。 如果有人能帮助我,我会很高兴。

1 个答案:

答案 0 :(得分:1)

经过多天的测试和游戏,我发现了一个有效的配置。显然我需要的是一个有状态的LSTM。这是我的工作解决方案:

model = Sequential()
model.add(Masking(mask_value=0., batch_input_shape=(1, 362, 105)))
model.add(
    LSTM(100, return_sequences=True, unit_forget_bias=True, stateful=True))
model.add(TimeDistributed(Dense(1, activation="linear")))

model.compile(loss="mse", optimizer="adam", metrics=[RMSE])

# Train the model
for epoch in range(200):
    print('Epoch %s' % epoch)
    train_loss=[]

    # Train
    for i in range(x_train.shape[0]):
        tr_loss, tr_RMSE = model.train_on_batch(x_train[i, :, :].reshape((1, x_train.shape[1], x_train.shape[2])), y_train[i, :, :].reshape(((1, y_train.shape[1], y_train.shape[2]))))
        train_loss.append(tr_loss)
        model.reset_states()
print('loss training = {}'.format(np.mean(train_loss)))