看板 DataScience 關於我們 聯絡資訊
各位大大好 我之前有接觸一些傳統的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://www.ptt.cc/bbs/DataScience/M.1521739843.A.519.html ※ 編輯: HYDE1986 (123.194.133.122), 03/23/2018 01:39:40
BogiHsu: Input shape應該是(225, 6, 1)喔~你有225個sequence,6 03/23 02:17
BogiHsu: 是你輸入sequence 的長度,每次輸入1個feature這樣~所以 03/23 02:17
BogiHsu: feature變多就變成(225, 6, n)這樣 03/23 02:17
BogiHsu: 然後LSTM層後通常會接dense層再輸出吧?以你的例子可以 03/23 02:23
BogiHsu: 讓LSTM裡面的units改成數個到數十個,然後再加一層1個uni 03/23 02:23
BogiHsu: t的dense層 03/23 02:23
BogiHsu: 以上個人淺見,有錯誤歡迎指正 03/23 02:23
goldflower: 1.對 但你圖是錯的 展開次數=timeseries長度 03/23 03:25
goldflower: 2. 如樓上 後面接dense就能串了 03/23 03:25
goldflower: 阿阿上面是說3.才對 你2.在return_sequences=False 03/23 03:28
goldflower: 下是對的 03/23 03:29
goldflower: 我說對是指output 展開次數一樣是timeseries長度 03/23 03:29
goldflower: 喔我看錯 我以為那個y是h的意思 那應該不對 03/23 03:31
goldflower: units是指lstm裡面的hidden layer有多少個neuron 03/23 03:31
goldflower: 一樣以上歡迎大師打臉 QQ 03/23 03:33
Panthalassa: 2不對噢,units數應該是「每一個 step 輸出數量」 03/23 03:42
Panthalassa: 也就是你有六步,unit 數是 n, 就會產生 6n 個輸出 03/23 03:42
Panthalassa: 然後一點淺見,如果 input sequence 長度固定, 03/23 03:44
Panthalassa: 其實不太需要 LSTM,可以先試直接 NN,或 CNN 03/23 03:44
Panthalassa: https://imgur.com/gYLAJ3o.png 03/23 03:48
Panthalassa: 這張圖做的類似 seq2seq autoencoder, 03/23 03:48
Panthalassa: 而不是用 units 數量達到 03/23 03:48
HYDE1986: 謝謝幾位大大解釋 我會再消化一下 03/23 10:39
goldflower: 為避免你混亂 補充下我說的unit意義和P大的是一樣的 03/23 11:58
goldflower: 我是直接對gate那邊描述 看你喜歡哪種理解 03/23 11:58