作者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/cn.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