2017-04-22 66 views
0

我正在嘗試在Keras的時間序列數據上訓練ANN。我有三個數據向量被分解爲滾動窗口序列(即向量l)。神經網絡爲所有輸入產生類似的模式

np.array([l[i:i+window_size] for i in range(len(l) - window_size)]) 

靶載體類似地加窗,從而神經網絡輸出的時間的步驟的下一個數WINDOW_SIZE目標矢量的預測。所有數據都使用min-max縮放器進行標準化。它以形狀=(nb_samples,window_size,3)形式輸入神經網絡。這裏是3個輸入向量的圖。

input vector plots

我已經成功從ANN鼓起的唯一輸出如下情節。藍色目標矢量,紅色預測(繪圖放大,使預測模式更清晰)。預測向量以window_size間隔繪製,因此每個重複模式都是來自網絡的一個預測。 enter image description here

我已經嘗試了許多不同的模型架構,數量的時代,激活功能,短而胖的網絡,瘦,高。這是我目前的(這裏有一點)。

Conv1D(64,4, input_shape=(None,3)) -> 
Conv1d(32,4) -> 
Dropout(24) -> 
LSTM(32) -> 
Dense(window_size) 

但是我嘗試的任何東西都不會影響輸出這種重複模式的神經網絡。我必須誤解Keras的時間序列或LSTM。但是我現在非常失落,所以任何幫助都非常感謝。我已將完整的代碼附加到此存儲庫。

https://github.com/jaybutera/dat-toy

回答

1

我打你的代碼一點點,我覺得我有讓你在正確的軌道上提供了一些建議。該代碼似乎並不完全符合您的圖形,但我認爲自那時起你已經調整了一下。無論如何,有兩個主要問題:

  1. 最大的問題是在您的數據準備步驟。你基本上有數據形狀倒退,因爲你有一個X的輸入時間步和Y的時間序列。當你真正想要的是(18830,30,8)時,你的輸入形狀是(18830,1,8)這樣完整的30步時間被送入LSTM。否則,LSTM只能在一個時間步上運行,並不是很有用。爲了解決這個問題,我改了行中common.py

    X = X.reshape(X.shape[0], 1, X.shape[1])

    X = windowfy(X, winsize)

    同樣,輸出數據可能應該只值1,從我收集的您來自繪圖功能的目標。肯定有一些情況下,你想預測整個時間序列,但我不知道這是否是你想要的這種情況。我將Y_train更改爲使用fuels而不是fuels_w,因此它只需預測時間序列的一個步驟。

  2. 對於這個簡單的網絡體系結構,100個時期的培訓可能太多了。在某些情況下,當我運行它時,看起來有些過度配合正在進行。觀察網絡中損失的減少,似乎只需要3-4個時期。

下面是我提到的調整3個訓練時期後的預測圖。這不是一個很好的預測,但現在看起來至少在正確的軌道上。祝你好運! Predictions after three epochs

編輯:實施例預測多輸出時間步:

from sklearn import datasets, preprocessing 
import numpy as np 
from scipy import stats 
from keras import models, layers 

INPUT_WINDOW = 10 
OUTPUT_WINDOW = 5 # Predict 5 steps of the output variable. 
# Randomly generate some regression data (not true sequential data; samples are independent). 
np.random.seed(11798) 
X, y = datasets.make_regression(n_samples=1000, n_features=4, noise=.1) 
# Rescale 0-1 and convert into windowed sequences. 
X = preprocessing.MinMaxScaler().fit_transform(X) 
y = preprocessing.MinMaxScaler().fit_transform(y.reshape(-1, 1)) 
X = np.array([X[i:i + INPUT_WINDOW] for i in range(len(X) - INPUT_WINDOW)]) 
y = np.array([y[i:i + OUTPUT_WINDOW] for i in range(INPUT_WINDOW - OUTPUT_WINDOW, 
                len(y) - OUTPUT_WINDOW)]) 
print(np.shape(X)) # (990, 10, 4) - Ten timesteps of four features 
print(np.shape(y)) # (990, 5, 1) - Five timesteps of one features 

# Construct a simple model predicting output sequences. 
m = models.Sequential() 
m.add(layers.LSTM(20, activation='relu', return_sequences=True, input_shape=(INPUT_WINDOW, 4))) 
m.add(layers.LSTM(20, activation='relu')) 
m.add(layers.RepeatVector(OUTPUT_WINDOW)) 
m.add(layers.LSTM(20, activation='relu', return_sequences=True)) 
m.add(layers.wrappers.TimeDistributed(layers.Dense(1, activation='sigmoid'))) 
print(m.summary()) 

m.compile(optimizer='adam', loss='mse') 
m.fit(X[:800], y[:800], batch_size=10, epochs=60) # Train on first 800 sequences. 
preds = m.predict(X[800:], batch_size=10) # Predict the remaining sequences. 
print('Prediction:\n' + str(preds[0])) 
print('Actual:\n' + str(y[800])) 
# Correlation should be around r = .98, essentially perfect. 
print('Correlation: ' + str(stats.pearsonr(y[800:].flatten(), preds.flatten())[0])) 
+0

感謝您的響應。自從我提出這個問題以來,我一直在編輯代碼,這是一個錯誤。事情是我想要預測未來一個多步的時間。當我問這個問題的時候,輸入的形狀是(18830,30,8),正如你所描述的那樣,但是輸出是無意義的。是否有另一種預測未來一個以上時間步驟的方法? – jay

+0

@jay我不太熟悉序列預測,但我添加了一個簡單的例子,試圖預測一些短序列。隨機生成的數據不是真正的序列,因此沒有可以學習的模式,所以輸出並不意味着很多,但是可以看到一些結果。 – Nigel

+0

@jay實際上,我稍微改進了這個例子,它現在確實學到了一些東西,儘管數據仍然不是真正的順序,所以前5個輸入時間步可能實際上並不能幫助模型學習關於最後5個輸出時間步的任何事情。也不是說,如果你的輸入和輸出序列的長度相同,你不需要'RepeatVector'業務,並且可以在整個模型中保持順序。 – Nigel