gpt4 book ai didi

machine-learning - Keras 有状态 RNN 数据分批的正确方法

转载 作者:行者123 更新时间:2023-11-30 08:27:56 25 4
gpt4 key购买 nike

作为documentation

the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch

这是否意味着要将数据拆分为批处理,我需要按照以下方式进行例如假设我正在训练一个有状态 RNN,根据前一个整数来预测 range(0, 5) 中的下一个整数

# batch_size = 3
# 0, 1, 2 etc in x are samples (timesteps and features omitted for brevity of the example)
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 等)?

这是正确的做法吗?

最佳答案

基于this answer ,为此我进行了一些测试。

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]], #continuation of batch_x1[0]
[[4],[5],[6]], #continuation of batch_x1[1]
[[5],[6],[7]], #continuation of batch_x1[2]
[[6],[7],[8]] #continuation of batch_x1[3]
]

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

  • 2批
  • 4 个单独的序列 = 这是批处理大小,并且必须恒定
  • 每个序列 6 个步骤(每批 3 个步骤)
  • 每步 1 个特征

有状态层意味着巨大的序列,其长度足以超出您的内存或完成某些任务的可用时间。然后对序列进行切片并分段处理。结果没有差异,该层并不更智能或具有额外的功能。它只是不认为序列在处理完一批后就已经结束。它期望这些序列继续。

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

关于machine-learning - Keras 有状态 RNN 数据分批的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com