LSTM(Long Short Term Memory Network)長短時記憶網(wǎng)絡(luò)辩恼,是一種改進(jìn)之后的循環(huán)神經(jīng)網(wǎng)絡(luò),可以解決 RNN 無法處理長距離的依賴的問題谓形,在時間序列預(yù)測問題上面也有廣泛的應(yīng)用灶伊。
今天我們根據(jù)問題的輸入輸出模式劃分,來看一下幾種時間序列問題所對應(yīng)的 LSTM 模型結(jié)構(gòu)如何實現(xiàn)寒跳。
1. Univariate
Univariate 是指:
input 為多個時間步聘萨,
output 為一個時間的問題。
數(shù)例:
訓(xùn)練集:
X, y
10, 20, 30 40
20, 30, 40 50
30, 40, 50 60
…
預(yù)測輸入:
X童太,
70, 80, 90
模型的 Keras 代碼:
# define model【Vanilla LSTM】
model = Sequential()
model.add( LSTM(50, activation='relu', input_shape = (n_steps, n_features)) )
model.add( Dense(1) )
model.compile(optimizer='adam', loss='mse')
n_steps = 3
n_features = 1
其中:
n_steps
為輸入的 X 每次考慮幾個時間步
n_features
為每個時間步的序列數(shù)
這個是最基本的模型結(jié)構(gòu)米辐,我們后面幾種模型會和這個進(jìn)行比較。
2. Multiple Input
Multiple Input 是指:
input 為多個序列书释,
output 為一個序列的問題翘贮。
數(shù)例:
訓(xùn)練集:
X, y
[[10 15]
[20 25]
[30 35]] 65
[[20 25]
[30 35]
[40 45]] 85
[[30 35]
[40 45]
[50 55]] 105
[[40 45]
[50 55]
[60 65]] 125
…
預(yù)測輸入:
X爆惧,
80, 85
90, 95
100, 105
即數(shù)據(jù)樣式為:
in_seq1: [10, 20, 30, 40, 50, 60, 70, 80, 90]
in_seq2: [15, 25, 35, 45, 55, 65, 75, 85, 95]
out_seq: [in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))]
模型的 Keras 代碼:
# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
n_steps = 3
# 此例中 n features = 2狸页,因為輸入有兩個并行序列
n_features = X.shape[2]
其中:
n_steps
為輸入的 X 每次考慮幾個時間步
n_features
此例中 = 2,因為輸入有兩個并行序列
和 Univariate 相比:
模型的結(jié)構(gòu)代碼是一樣的扯再,只是在 n_features = X.shape[2]
芍耘,而不是 1.
3. Multiple Parallel
Multiple Parallel 是指:
input 為多個序列,
output 也是多個序列的問題熄阻。
數(shù)例:
訓(xùn)練集:
X, y
[[10 15 25]
[20 25 45]
[30 35 65]] [40 45 85]
[[20 25 45]
[30 35 65]
[40 45 85]] [ 50 55 105]
[[ 30 35 65]
[ 40 45 85]
[ 50 55 105]] [ 60 65 125]
[[ 40 45 85]
[ 50 55 105]
[ 60 65 125]] [ 70 75 145]
…
預(yù)測輸入:
X斋竞,
70, 75, 145
80, 85, 165
90, 95, 185
模型的 Keras 代碼:
# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')
n_steps = 3
# 此例中 n features = 3,因為輸入有3個并行序列
n_features = X.shape[2]
其中:
n_steps
為輸入的 X 每次考慮幾個時間步
n_features
此例中 = 3饺律,因為輸入有 3 個并行序列
和 Univariate 相比:
模型結(jié)構(gòu)的定義中窃页,多了一個 return_sequences=True
,即返回的是序列复濒,
輸出為 Dense(n_features)
脖卖,而不是 1.
4. Multi-Step
Multi-Step 是指:
input 為多個時間步,
output 也是多個時間步的問題巧颈。
數(shù)例:
訓(xùn)練集:
X, y
[10 20 30] [40 50]
[20 30 40] [50 60]
[30 40 50] [60 70]
[40 50 60] [70 80]
…
預(yù)測輸入:
X畦木,
[70, 80, 90]
模型的 Keras 代碼:
# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')
n_steps_in, n_steps_out = 3, 2
n_features = 1
其中:
n_steps_in
為輸入的 X 每次考慮幾個時間步
n_steps_out
為輸出的 y 每次考慮幾個時間步
n_features
為輸入有幾個序列
和 Univariate 相比:
模型結(jié)構(gòu)的定義中,多了一個 return_sequences=True
砸泛,即返回的是序列十籍,
而且 input_shape=(n_steps_in, n_features)
中有代表輸入時間步數(shù)的 n_steps_in
,
輸出為 Dense(n_steps_out)
唇礁,代表輸出的 y 每次考慮幾個時間步.
當(dāng)然這個問題還可以用 Encoder-Decoder 結(jié)構(gòu)實現(xiàn):
# define model【Encoder-Decoder Model】
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')
5. Multivariate Multi-Step
Multivariate Multi-Step 是指:
input 為多個序列勾栗,
output 為多個時間步的問題。
數(shù)例:
訓(xùn)練集:
X, y
[[10 15]
[20 25]
[30 35]] [65
85]
[[20 25]
[30 35]
[40 45]] [ 85
105]
[[30 35]
[40 45]
[50 55]] [105
125]
…
預(yù)測輸入:
X盏筐,
[40 45]
[50 55]
[60 65]
模型的 Keras 代碼:
# define model
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')
n_steps_in, n_steps_out = 3, 2
# 此例中 n features = 2围俘,因為輸入有2個并行序列
n_features = X.shape[2]
其中:
n_steps_in
為輸入的 X 每次考慮幾個時間步
n_steps_out
為輸出的 y 每次考慮幾個時間步
n_features
為輸入有幾個序列,此例中 = 2琢融,因為輸入有 2 個并行序列
和 Univariate 相比:
模型結(jié)構(gòu)的定義中界牡,多了一個 return_sequences=True
,即返回的是序列漾抬,
而且 input_shape=(n_steps_in, n_features)
中有代表輸入時間步數(shù)的 n_steps_in
宿亡,
輸出為 Dense(n_steps_out)
,代表輸出的 y 每次考慮幾個時間步纳令,
另外 n_features = X.shape[2]
挽荠,而不是 1,
相當(dāng)于是 Multivariate 和 Multi-Step 的結(jié)構(gòu)組合起來平绩。
6. Multiple Parallel Input & Multi-Step Output
Multiple Parallel Input & Multi-Step Output 是指:
input 為多個序列坤按,
output 也是多個序列 & 多個時間步的問題。
數(shù)例:
訓(xùn)練集:
X, y
[[10 15 25]
[20 25 45]
[30 35 65]] [[ 40 45 85]
[ 50 55 105]]
[[20 25 45]
[30 35 65]
[40 45 85]] [[ 50 55 105]
[ 60 65 125]]
[[ 30 35 65]
[ 40 45 85]
[ 50 55 105]] [[ 60 65 125]
[ 70 75 145]]
…
預(yù)測輸入:
X馒过,
[[ 40 45 85]
[ 50 55 105]
[ 60 65 125]]
模型的 Keras 代碼:
# define model【Encoder-Decoder model】
model = Sequential()
model.add(LSTM(200, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(200, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
n_steps_in, n_steps_out = 3, 2
# 此例中 n features = 3臭脓,因為輸入有3個并行序列
n_features = X.shape[2]
其中:
n_steps_in
為輸入的 X 每次考慮幾個時間步
n_steps_out
為輸出的 y 每次考慮幾個時間步
n_features
為輸入有幾個序列
這里我們和 Multi-Step 的 Encoder-Decoder 相比:
二者的模型結(jié)構(gòu),只是在最后的輸出層參數(shù)不同腹忽,
TimeDistributed(Dense(n_features))
而不是 Dense(1)
来累。
好啦,這幾種時間序列的輸入輸出模式所對應(yīng)的代碼結(jié)構(gòu)就是這樣窘奏,如果您還有更有趣的嘹锁,歡迎補(bǔ)充!
大家好着裹!
我是 不會停的蝸牛 Alice领猾,
喜歡人工智能,沒事兒寫寫機(jī)器學(xué)習(xí)干貨,
歡迎關(guān)注我摔竿!
推薦閱讀歷史技術(shù)博文鏈接匯總
http://www.reibang.com/p/28f02bb59fe5
也許可以找到你想要的:
[入門問題][TensorFlow][深度學(xué)習(xí)][強(qiáng)化學(xué)習(xí)][神經(jīng)網(wǎng)絡(luò)][機(jī)器學(xué)習(xí)][自然語言處理][聊天機(jī)器人]