作者HYDE1986 (足球就是我的呼吸)
看板DataScience
標題[問題] 有關LSTM的粗淺觀念疑問
時間Fri Mar 23 01:29:54 2018
各位大大好
我之前有接觸一些傳統的ML和Data mining的方法
最近開始接觸Deep learning
主要嘗試用LSTM處理數值資料的預測
在 LSTM 觀念和實作上遇到一些問題
想要請教各位
觀念上面的建立我是看李宏毅教授的影片
和以下幾篇文章
ref1:
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
ref2:(WILDML)
https://tinyurl.com/y9xgqbg9
一、以下是我現在嘗試做的預測問題描述
1.資料:289個月的稅收金額,data shape就
很單純的是 289 列(row),1欄(column)
2.目標:用前六個月的稅收當作輸入,預測下一個月的稅收。
例:用2017年7月到2017年12月的稅收預測2018年1月的稅收。
3.處理方式:
(1)將資料用min-max正規化到0跟1之間。
(2)分出30%做測試資料。
(3)產生六個月一組的lookback資料(*1 原始碼)及預測目標資料。
(4)將輸入資料轉換成[samples, time steps, features]形式,
其shape變成(225,1, 6)。
(5)建立LSTM model並訓練(用keras Sequential)。
程式參考:
ref3:(kaggle tutorial)
https://tinyurl.com/ybuoqe4q
ref4:(machinelearningmastery)
https://tinyurl.com/y7pn2bb8
二、觀念上的問題
疑問1:LSTM是根據我所丟進去的input shape長出所需要的cell嗎?
外界看來模型的樣子(設只有一個輸出):
https://imgur.com/XQxtiaX.png
輸入資料:
https://i.imgur.com/5BkBxpc.jpg
LSTM根據我的輸入展開的樣子:
https://imgur.com/PrjDsnJ.png
疑問2:LSTM的輸出(units)。
(1)下面是用keras 實作的程式碼,不知道我對輸出的理解是否正確
(都只考慮LSTM這一層)
a.輸出(units)為1,故輸出同前面的圖。
model.add(LSTM(units = 1,
input_shape=(trainX.shape[1], trainX.shape[2])))
https://imgur.com/PrjDsnJ.png
b.輸出(units)為4,結果如下圖
model.add(LSTM(units = 4,
input_shape=(trainX.shape[1], trainX.shape[2])))
https://imgur.com/gYLAJ3o.png
疑問3:如果今天要用多個特徵去做單一數字的預測,要怎麼設計?
(1)舉例:前面只用一個稅的金額用類似自迴歸的方式來預測自己,
但如果要引入另一個稅收的數字做為特徵,
模型的應該會長什麼樣子。
(2)我的理解:因為不像MLP一層可以設定多個節點,
LSTM一層就是一個LSTM,
只是它內部會依據輸入的shape去長出對應數目cell,
所以我在輸入的第一層就要有兩個LSTM,
假設直接用兩個LSTM與輸出層間不再加入隱藏層,
網路的形狀就會變成下圖:
https://imgur.com/GOIgCU9.png
*1. 產生look back資料的code
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset) - look_back):
a = dataset[i:(i + look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.133.122
※ 文章網址: https://webptt.com/m.aspx?n=bbs/DataScience/M.1521739843.A.519.html
※ 編輯: HYDE1986 (123.194.133.122), 03/23/2018 01:39:40
1F:→ BogiHsu: Input shape應該是(225, 6, 1)喔~你有225個sequence,6 03/23 02:17
2F:→ BogiHsu: 是你輸入sequence 的長度,每次輸入1個feature這樣~所以 03/23 02:17
3F:→ BogiHsu: feature變多就變成(225, 6, n)這樣 03/23 02:17
4F:→ BogiHsu: 然後LSTM層後通常會接dense層再輸出吧?以你的例子可以 03/23 02:23
5F:→ BogiHsu: 讓LSTM裡面的units改成數個到數十個,然後再加一層1個uni 03/23 02:23
6F:→ BogiHsu: t的dense層 03/23 02:23
7F:→ BogiHsu: 以上個人淺見,有錯誤歡迎指正 03/23 02:23
8F:推 goldflower: 1.對 但你圖是錯的 展開次數=timeseries長度 03/23 03:25
9F:→ goldflower: 2. 如樓上 後面接dense就能串了 03/23 03:25
10F:→ goldflower: 阿阿上面是說3.才對 你2.在return_sequences=False 03/23 03:28
11F:→ goldflower: 下是對的 03/23 03:29
12F:→ goldflower: 我說對是指output 展開次數一樣是timeseries長度 03/23 03:29
13F:→ goldflower: 喔我看錯 我以為那個y是h的意思 那應該不對 03/23 03:31
14F:→ goldflower: units是指lstm裡面的hidden layer有多少個neuron 03/23 03:31
15F:→ goldflower: 一樣以上歡迎大師打臉 QQ 03/23 03:33
16F:推 Panthalassa: 2不對噢,units數應該是「每一個 step 輸出數量」 03/23 03:42
17F:→ Panthalassa: 也就是你有六步,unit 數是 n, 就會產生 6n 個輸出 03/23 03:42
18F:→ Panthalassa: 然後一點淺見,如果 input sequence 長度固定, 03/23 03:44
19F:→ Panthalassa: 其實不太需要 LSTM,可以先試直接 NN,或 CNN 03/23 03:44
21F:→ Panthalassa: 這張圖做的類似 seq2seq autoencoder, 03/23 03:48
22F:→ Panthalassa: 而不是用 units 數量達到 03/23 03:48
23F:→ HYDE1986: 謝謝幾位大大解釋 我會再消化一下 03/23 10:39
24F:推 goldflower: 為避免你混亂 補充下我說的unit意義和P大的是一樣的 03/23 11:58
25F:→ goldflower: 我是直接對gate那邊描述 看你喜歡哪種理解 03/23 11:58