如documentation所述
这是否意味着要将数据拆分为批处理,我需要按以下方式进行操作
例如假设我正在训练一个有状态的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,我对其进行了一些测试。
有状态=否:
通常,(状态为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)
。这意味着您具有:每次训练时,无论您重复此批次还是通过新批次,它都会看到各个序列。每个序列都是唯一的条目。
有状态=真:
当您进入有状态层时,您将不再传递单个序列。您将传递很长的序列,分为小批。您将需要更多批次:
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)
。这意味着您具有:有状态层是按巨大顺序排列的,足够长,足以超出您的内存或某些任务的可用时间。然后,您可以对序列进行切片并分批处理。结果没有差异,该层不更智能或具有其他功能。它只是不认为序列在处理一批后就结束了。它期望那些序列的延续。
在这种情况下,您可以自行决定序列何时结束,并手动调用
model.reset_states()
。关于machine-learning - 正确的方法将数据拆分为Keras状态RNN的批次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46330073/