Keras:使用LSTM时改组数据集

时间:2019-07-15 13:55:42

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

如果我做错了,请纠正我,但是根据官方Keras documentation的说法,默认情况下,fit函数的参数为​​'shuffle = True',因此,它会在每个纪元内对整个训练数据集进行改组。

但是,使用递归神经网络(例如LSTM或GRU)的目的是使用每个数据的精确顺序,以便先前数据的状态影响当前数据。

如果我们重新整理所有数据,则所有逻辑序列都会中断。因此,我不明白为什么有很多LSTM的示例未将参数设置为False。使用不带序列的RNN有什么意义?

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

1 个答案:

答案 0 :(得分:1)

  

如果我们重新整理所有数据,则所有逻辑序列都会中断。

否,混洗发生在批处理轴上,而不是时间轴上。 通常,您用于RNN的数据具有以下形状:(batch_size, timesteps, features)

通常,您不仅给网络学习了一个序列,而且给了许多序列。仅对训练这些许多序列的顺序进行了打乱。序列本身保持完整。 改组通常是一个好主意,因为您的网络只能学习训练示例本身,而不是学习顺序。

话虽如此,在某些情况下,您确实只有一个巨大的序列需要学习。在这种情况下,您可以选择将序列分为几批。如果是这种情况,那么您担心改组会产生巨大的负面影响是绝对正确的,因此在这种情况下不要这样做!

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