[問題] 有關LSTM的粗淺觀念疑問

看板DataScience作者 (足球就是我的呼吸)時間6年前 (2018/03/23 01:30), 6年前編輯推噓3(3022)
留言25則, 4人參與, 6年前最新討論串1/1
各位大大好 我之前有接觸一些傳統的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

03/23 02:17, 6年前 , 1F
Input shape應該是(225, 6, 1)喔~你有225個sequence,6
03/23 02:17, 1F

03/23 02:17, 6年前 , 2F
是你輸入sequence 的長度,每次輸入1個feature這樣~所以
03/23 02:17, 2F

03/23 02:17, 6年前 , 3F
feature變多就變成(225, 6, n)這樣
03/23 02:17, 3F

03/23 02:23, 6年前 , 4F
然後LSTM層後通常會接dense層再輸出吧?以你的例子可以
03/23 02:23, 4F

03/23 02:23, 6年前 , 5F
讓LSTM裡面的units改成數個到數十個,然後再加一層1個uni
03/23 02:23, 5F

03/23 02:23, 6年前 , 6F
t的dense層
03/23 02:23, 6F

03/23 02:23, 6年前 , 7F
以上個人淺見,有錯誤歡迎指正
03/23 02:23, 7F

03/23 03:25, 6年前 , 8F
1.對 但你圖是錯的 展開次數=timeseries長度
03/23 03:25, 8F

03/23 03:25, 6年前 , 9F
2. 如樓上 後面接dense就能串了
03/23 03:25, 9F

03/23 03:28, 6年前 , 10F
阿阿上面是說3.才對 你2.在return_sequences=False
03/23 03:28, 10F

03/23 03:29, 6年前 , 11F
下是對的
03/23 03:29, 11F

03/23 03:29, 6年前 , 12F
我說對是指output 展開次數一樣是timeseries長度
03/23 03:29, 12F

03/23 03:31, 6年前 , 13F
喔我看錯 我以為那個y是h的意思 那應該不對
03/23 03:31, 13F

03/23 03:31, 6年前 , 14F
units是指lstm裡面的hidden layer有多少個neuron
03/23 03:31, 14F

03/23 03:33, 6年前 , 15F
一樣以上歡迎大師打臉 QQ
03/23 03:33, 15F

03/23 03:42, 6年前 , 16F
2不對噢,units數應該是「每一個 step 輸出數量」
03/23 03:42, 16F

03/23 03:42, 6年前 , 17F
也就是你有六步,unit 數是 n, 就會產生 6n 個輸出
03/23 03:42, 17F

03/23 03:44, 6年前 , 18F
然後一點淺見,如果 input sequence 長度固定,
03/23 03:44, 18F

03/23 03:44, 6年前 , 19F
其實不太需要 LSTM,可以先試直接 NN,或 CNN
03/23 03:44, 19F

03/23 03:48, 6年前 , 20F

03/23 03:48, 6年前 , 21F
這張圖做的類似 seq2seq autoencoder,
03/23 03:48, 21F

03/23 03:48, 6年前 , 22F
而不是用 units 數量達到
03/23 03:48, 22F

03/23 10:39, 6年前 , 23F
謝謝幾位大大解釋 我會再消化一下
03/23 10:39, 23F

03/23 11:58, 6年前 , 24F
為避免你混亂 補充下我說的unit意義和P大的是一樣的
03/23 11:58, 24F

03/23 11:58, 6年前 , 25F
我是直接對gate那邊描述 看你喜歡哪種理解
03/23 11:58, 25F
文章代碼(AID): #1Qi-X3KP (DataScience)
文章代碼(AID): #1Qi-X3KP (DataScience)