本文的参考:https://www.jianshu.com/p/0c65b47cd6fb
https://machinelearningmastery.com/return-sequences-and-return-states-for-lstms-in-keras/
1 LSTM
关于LSTM的介绍.
对于每一个LSTM block 输出有两个 ctc_tct? 和 hth_tht?,但是,在keras中的LSTM模型中,只有一个输出值hth_tht?。因此,我们接下来要探索以下keras中的LSTM模型。
2 深入理解Return Sequences and Return States for LSTMs in Keras
在keras LSTM的文档中有两个参数
- return_sequences: Boolean. 是否返回最后一个输出或是整个序列的输出,默认是False
- return_state: Boolean. 是否在输出之外返回状态,默认是False
1.return_sequences=False && return_state=False
h = LSTM(6)
此时返回的对输入数据进行计算得到的a,如果X有多个timestep,则返回最后一个timestep的a
2.return_sequences=True && return_state=False
LSTM(6, return_sequences=True)
此时返回的是全部timestep的a
3.return_sequences=False && return_state=True
lstm1, state_h, state_c = LSTM(6, return_state=True)
lstm1, state_h是最后一个timestep的a,state_c是最后一个timestep的c
4.return_sequences=True && return_state=True
lstm1, state_h, state_c = LSTM(6, return_sequences=True, return_state=True)
lstm1是全部timestep的a,
state_h是最后一个timestep的a,
state_c是最后一个timestep的c
同样道理,GRU的输出也是这样的
3 深入理解Keras LSTM的stateful
stateful: Boolean (default False). If True, the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch.
使RNN具有状态意味着每批样品的状态将被重新用作下一批样品的初始状态。
当使用有状态 RNN 时,假定:
- 所有的批次都有相同数量的样本
- 如果x1和x2是连续批次的样本,则x2[i]是x1[i]的后续序列,对于每个i
要在 RNN 中使用状态,你需要:
-
通过将batch_size参数传递给模型的第一层来显式指定你正在使用的批大小。例如,对于10个时间步长的32样本的batch,每个时间步长具有16个特征,batch_size = 32
-
在RNN层中设置stateful = True
-
在调用fit()时指定shuffle = False
-
假设Timestep=5,batch_size=2
-
X1和X2就是连续的两个批次,X2[i]是X1[i]的后续序列,也就是说,
床前明月光
后面是疑是地上霜
-
光的状态会传递到疑作为初始状态,也就是用光输出的(h, c)来初始化疑的(h, c)
-
那就不难理解为什么“所有的批次都有相同数量的样本”,如果不同批次的样本数不同,那上一批次传过来的(h, c)将没人接手
-
进而,Keras文档说用stateful需要指定batch_size也没毛病,不指定的话,Keras默认容忍最后一个批次样本数不同。例如,samples=9,batch_szie=2,那么默认分成5批,最后一批只有1个样本
下一个问题,shuffle
- shuffle = True会在每个epoch开始之前打乱训练集数据顺序,使用stateful LSTM肯定要设置shuffle = False,不然光可能传给汗不就乱套了