代码之家  ›  专栏  ›  技术社区  ›  Bob

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

  •  5
  • Bob  · 技术社区  · 8 年前

    作为 documentation

    批次中索引i处每个样本的最后状态将用作

    这是否意味着要将数据拆分为多个批次,我需要按以下方式执行

    # 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等)?

    这样做对吗?

    1 回复  |  直到 8 年前
        1
  •  7
  •   Daniel Möller    8 年前

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

    通常(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) . 这意味着您已经:

    • 4个单独序列=这是批量大小,可以变化
    • 每个步骤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步)

    有状态层意味着巨大的序列,足够长,超过您的内存或您执行某些任务的可用时间。然后将序列切片,并对其进行部分处理。结果没有差别,该层并不更智能或具有附加功能。它只是不考虑在处理一批后序列已经结束。它期望这些序列继续。

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