理解LSTM中的return_sequence和return_state看这里。解释的很详细:

理解LSTM在keras API中参数return_sequences和return_state

推荐英语原文Stateful LSTM in Keras

文中使用三个问题来解释了这个参数:

  1. 给定了一个长序列(eg 时间序列),然后把它分为一些更小的子序列来构造输入矩阵X,LSTM是否能在序列之间找到依赖的关系?

    除非我们指定使用有状态的LSTM,否则LSTM无法找到序列之间的依赖关系。

    但大多数问题都可以通过无状态LSTM来解决,所以确保你真的需要有状态模式,再将stateful设为True

    在无状态模式下,长期记忆并不意味着LSTM将记住先前批次的内容,这里的批次指的是batch

  2. 为什么我们在Keras中区分无状态LSTM和有状态LSTM?

    LSTM具有cell,因此根据定义是有状态的(这个指的是隐藏层的状态)。

    Fabien Chollet给出了有状态的定义:
    stateful:Boolean(默认为False)。 如果为True,则批次中索引i处的每个样本的最后状态将用作后续批次中索引i的样本的初始状态。

    换句话说,无论何时训练或测试LSTM,首先必须构建形状为(nb_samples,时间步长,input_dim)的输入矩阵X,其中batch批量大小除以nb_samples

    例如,如果nb_samples = 1024batch_size = 64,则表示您的模型将接收64个样本的块,计算每个输出(无论每个样本的时间步数是多少)的平均梯度并传播它以更新参数向量 。

    默认情况下,Keras在X中对样本进行shuffles(置换),并且 X i X_i Xi X i + 1 X_{i+1} Xi+1之间的依赖关系丢失。也就是为什么当我们使用有状态的LSTM时,在对模型fit时,shufflesFalse,确保顺序不被打乱。

    假设我们没有对其进行shuffles操作。如果模型是无状态的,则在每个序列处重置单元状态。 使用有状态模型,所有状态都将传播到下一批。 这意味着位于索引i X i X_i Xi的样本的状态将用于计算下一批中的样本 X i + b s X_{i + bs} Xi+bs,其中bs是批量大小(无混洗)。

  3. 为什么Keras在有状态模式下需要批量大小?

    当模型是无状态时,Keras为大小为output_dim(LSTM中的cell数)的状态分配一个数组。 在每个序列处理中,重置该状态数组。

    在有状态模型中,Keras必须在批次中传播每个样本的先前状态。 参考上面的解释,批#1中的索引i处的样品 ( X i + b s ) (X_{i + bs}) (Xi+bs)将知道批#0 ( X i ) (X_i) (Xi)中样品i的状态。 在这种情况下,存储状态的数值结构形状为(batch_size,output_dim)

    这就是必须在创建LSTM时指定批量大小的原因。 如果不这样做,Keras可能会引发错误提醒:如果RNN是有状态的,则必须提供完整的input_shape(包括批量大小)。