【问题标题】:Keras : Shuffling dataset while using LSTMKeras:使用 LSTM 时洗牌数据集
【发布时间】:2019-11-24 05:57:43
【问题描述】:

如果我错了,请纠正我,但根据官方 Keras documentation,默认情况下,fit 函数具有参数“shuffle=True”,因此它会在每个 epoch 上对整个训练数据集进行随机播放。

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

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

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

【问题讨论】:

标签: tensorflow keras lstm shuffle recurrent-neural-network


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 非常感谢您非常完整的回答。你是对的,我确实对洗牌是如何完成的感到困惑。我在 Keras [就在这里] (github.com/keras-team/keras/blob/…) 中查看了 fit 函数的代码,它当时确实洗牌了一批。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2021-05-01
  • 2018-10-28
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多