正确理解LSTM在keras API中的stateful参数
理解LSTM中的return_sequence和return_state看这里。解释的很详细:
理解LSTM在keras API中参数return_sequences和return_state
推荐英语原文Stateful LSTM in Keras
文中使用三个问题来解释了这个参数:
-
给定了一个长序列(eg 时间序列),然后把它分为一些更小的子序列来构造输入矩阵
X
,LSTM是否能在序列之间找到依赖的关系?除非我们指定使用有状态的LSTM,否则LSTM无法找到序列之间的依赖关系。
但大多数问题都可以通过无状态LSTM来解决,所以确保你真的需要有状态模式,再将
stateful
设为True
。在无状态模式下,长期记忆并不意味着LSTM将记住先前批次的内容,这里的批次指的是
batch
。 -
为什么我们在Keras中区分无状态LSTM和有状态LSTM?
LSTM具有cell,因此根据定义是有状态的(这个指的是隐藏层的状态)。
Fabien Chollet给出了有状态的定义:
stateful:Boolean(默认为False)。 如果为True,则批次中索引i处的每个样本的最后状态将用作后续批次中索引i的样本的初始状态。
换句话说,无论何时训练或测试LSTM,首先必须构建形状为
(nb_samples,时间步长,input_dim)
的输入矩阵X
,其中batch
批量大小除以nb_samples
。例如,如果
nb_samples = 1024
且batch_size = 64
,则表示您的模型将接收64个样本的块,计算每个输出(无论每个样本的时间步数是多少)的平均梯度并传播它以更新参数向量 。默认情况下,Keras在
X
中对样本进行shuffles
(置换),并且 Xi和 Xi+1之间的依赖关系丢失。也就是为什么当我们使用有状态的LSTM时,在对模型fit
时,shuffles
为False
,确保顺序不被打乱。假设我们没有对其进行
shuffles
操作。如果模型是无状态的,则在每个序列处重置单元状态。 使用有状态模型,所有状态都将传播到下一批。 这意味着位于索引i
, Xi的样本的状态将用于计算下一批中的样本 Xi+bs,其中bs
是批量大小(无混洗)。 -
为什么Keras在有状态模式下需要批量大小?
当模型是无状态时,Keras为大小为
output_dim
(LSTM中的cell数)的状态分配一个数组。 在每个序列处理中,重置该状态数组。在有状态模型中,Keras必须在批次中传播每个样本的先前状态。 参考上面的解释,批#1中的索引
i
处的样品 (Xi+bs)将知道批#0 (Xi)中样品i
的状态。 在这种情况下,存储状态的数值结构形状为(batch_size,output_dim)
。这就是必须在创建LSTM时指定批量大小的原因。 如果不这样做,Keras可能会引发错误提醒:如果RNN是有状态的,则必须提供完整的input_shape(包括批量大小)。