2017-06-11 36 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)))