Keras:使用 LSTM 时混洗数据集

Sis*_*Sis 8 shuffle lstm keras tensorflow recurrent-neural-network

如果我错了,请纠正我,但根据官方Keras 文档,默认情况下,fit 函数的参数为​​“shuffle=True”,因此它会在每个 epoch 上对整个训练数据集进行洗牌。

但是,使用 LSTM 或 GRU 等循环神经网络的要点是使用每个数据的精确顺序,以便先前数据的状态影响当前数据。

如果我们将所有数据打乱,所有逻辑序列都会被破坏。因此我不明白为什么有这么多 LSTM 的例子,其中参数没有设置为 False。使用没有序列的 RNN 有什么意义?

此外,当我将 shuffle 选项设置为 False 时,即使数据之间存在依赖关系,我的 LSTM 模型的性能也会降低:我使用 KDD99 数据集,其中连接有链接。

seb*_*ckm 12

如果我们将所有数据打乱,所有逻辑序列都会被破坏。

不,改组发生在批次轴上,而不是时间轴上。通常,您的 RNN 数据具有如下形状:(batch_size, timesteps, features)

通常,您不仅要为网络提供一个序列以供学习,而且还要为多个序列提供学习。只有这些许多序列被训练的顺序才会被打乱。序列本身保持完整。改组通常总是一个好主意,因为您的网络将只学习训练示例本身,而不是它们的顺序。

话虽如此,在某些情况下,您确实只有一个巨大的序列可供学习。在这种情况下,您仍然可以选择将序列分成几个批次。如果是这种情况,您完全正确地担心改组会产生巨大的负面影响,所以在这种情况下不要这样做!

注意:RNN 有一个stateful参数,您可以将其设置为True。在这种情况下,上一个批次的最后一个状态将传递给下一个,这有效地使您的 RNN 将所有批次视为一个巨大的序列。因此,如果您有多个批次的巨大序列,请绝对执行此操作。