为Keras有状态RNN正确分割数据到批次的方法

文档所述

在批次中,每个样本在索引i处的最后状态将被用作下一批次中索引i处的样本的初始状态

这是否意味着要将数据分割成批次,我需要按照以下方式进行操作?例如,假设我在训练一个有状态的RNN来预测给定前一个整数的下一个整数,范围在0到5之间

# batch_size = 3# x中的0, 1, 2等是样本(为了示例的简洁性,省略了时间步和特征)x = [0, 1, 2, 3, 4]y = [1, 2, 3, 4, 5]batches_x = [[0, 1, 2], [1, 2, 3], [2, 3, 4]]batches_y = [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

那么在学习x[0, 0]后的状态将成为x[1, 0]的初始状态,而x[0, 1]将成为x[1, 1]的初始状态(0对应1,1对应2等)?

这是正确的方法吗?


回答:

根据这个回答,我进行了一些测试。

Stateful=False:

通常情况下(stateful=False),你有一个包含许多序列的批次:

batch_x = [            [[0],[1],[2],[3],[4],[5]],            [[1],[2],[3],[4],[5],[6]],            [[2],[3],[4],[5],[6],[7]],            [[3],[4],[5],[6],[7],[8]]          ]

形状是(4,6,1)。这意味着你有:

  • 1个批次
  • 4个独立序列 = 这是批次大小,可以变化
  • 每个序列6个步骤
  • 每个步骤1个特征

每次训练时,无论是重复这个批次还是传递一个新的批次,它都会看到独立的序列。每个序列都是一个唯一的条目。

Stateful=True:

当你使用有状态层时,你不再传递独立的序列。你将传递非常长的序列,分成小的批次。你将需要更多的批次:

batch_x1 = [             [[0],[1],[2]],             [[1],[2],[3]],             [[2],[3],[4]],             [[3],[4],[5]]           ]batch_x2 = [             [[3],[4],[5]], #batch_x1[0]的继续             [[4],[5],[6]], #batch_x1[1]的继续             [[5],[6],[7]], #batch_x1[2]的继续             [[6],[7],[8]]  #batch_x1[3]的继续           ]

两个形状都是(4,3,1)。这意味着你有:

  • 2个批次
  • 4个独立序列 = 这是批次大小,必须保持不变
  • 每个序列6个步骤(每个批次3个步骤)
  • 每个步骤1个特征

有状态层旨在处理巨大的序列,这些序列长到超出你的内存或完成某些任务所需的时间。然后你可以将序列切片并分部分处理。结果没有区别,层并不会更智能或具有额外的能力。它只是不会认为在处理完一个批次后序列就结束了。它期待这些序列的继续。

在这种情况下,你自己决定序列何时结束,并手动调用model.reset_states()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注