2017-06-11 35 views
1

我目前正在使用Tensorflow后端在Keras中处理多个时间序列相似机器和多个功能的回归问题。在Keras中使用LSTMs进行多变量多时间序列回归的恒定输出值

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

我对所有值进行了归一化处理,并将输入和输出填充到所有时间序列的前面,以使其长度最长。 然后我添加了遮罩层来掩盖这些零。

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

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

对于所有零填充行我得到这样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) 

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

+0

我会尝试增加'batch_size'。 –

+0

@MarcinMożejko我已经尝试了10的批量大小没有帮助。毕竟我只有100个序列。 – hfjn

+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)))