【问题标题】:Pit in LSTM programming by pythonpython在LSTM编程中的坑
【发布时间】:2018-11-07 02:17:07
【问题描述】:

众所周知,如果我们要训练一个 LSTM 网络,我们必须通过函数numpy.reshape() 对训练数据集进行重构,重构结果类似于[samples,time_steps,features]。但是,新形状会受到原始形状的影响。我看过一些教授 LSTM 编程的博客,将 1 作为 time_steps,如果 time_steps 是另一个数字,则样本会发生相应的变化。我的问题是samples等于batch_size吗?

X = X.reshape(X.shape[0], 1, X.shape[1])

【问题讨论】:

    标签: python-3.x tensorflow keras lstm rnn


    【解决方案1】:

    不,样本与 batch_size 不同。样本是您将拥有的样本总数。 batch_size 将是每个批次的大小或训练中使用的每个批次的样本数,例如 .fit。

    例如,如果 samples=128 和 batch_size=16,那么您的数据将在 .fit 调用期间分为 8 个批次,每个批次包含 16 个样本。

    另外,time_steps 是每个样本内的总时间步长或观察值。使用 LSTM 将其设为 1 并没有多大意义,因为 RNN 的主要优势通常是学习时间模式。使用 time_step=1,将没有任何历史可以利用。这里作为一个可能有帮助的例子:

    假设您的工作是通过查看每个人每分钟提供的呼吸频率和心率来确定某人是否每小时都处于活动状态,即每小时测量 60 个样本的 2 个特征。 (这只是一个示例,如果您真的想这样做,请使用加速度计 :))假设您有 128 小时的标记数据。那么您的输入数据将是 (128, 60, 2) 的形状,而您的输出将是 (128, 1) 的形状。

    在这里,您有 128 个样本,每个样本有 60 个时间步长或观察值,以及两个特征。

    接下来,您根据样本将数据拆分为训练、验证和测试。例如,您的训练、验证和测试数据的形状将分别为 (96, 60, 2)、(16, 60, 2) 和 (16, 60, 2)。

    如果您使用 batch_size=16,您的训练、验证和测试数据将分别有 6、1 和 1 个批次。

    【讨论】:

    • 从你的回答中我对time_steps 有点困惑,你能举个例子说清楚吗?非常感谢。
    • 确实把问题搞清楚了,谢谢你的帮助。
    • 使用 time_step=1,将没有任何历史可利用。 但是,在博客中写了一些将 1 作为 time_steps 的示例,它确实做出了很好的预测,我该如何解释呢?此外,是否有更好的方法来选择更好的 time_steps?非常感谢!
    • 你能分享使用 step_size 为 1 的链接吗?您是否共享他们的输入数据,step_size 为 1?此外,还有一个“state_full”选项可以与 LSTM 一起使用,您可以阅读该选项。然后 step_size 大小为 1 可能会带来一些历史优势,因为状态不会重置,但即使这样,step_size=1 也不会是我的选择。
    • machinelearningmastery.com/… 博客的作者回答说 LSTM 具有在批次之间重置的内存,或者如果您选择手动重置。从概念上讲,这个内存与一个样本中的时间步数是分开的。 那么,哪一个决定了 LSTM 的内存呢?如何确认LSTM的内存长度?
    【解决方案2】:

    没有。样本不等于批量大小。样本是指数据集中的行数。您的训练数据集被分成多个批次并将其传递给网络进行训练。

    简单来说,

    假设您的数据集有 30 个样本,并且您将 batch_size 定义为 3。 这意味着 30 个样本分为 10 个批次(30 除以您定义的 batch_size = 10)。当你训练你的模型时,一次只有 3 行数据会被推送到神经网络,然后接下来的 3 行数据会被推送到神经网络。明智的做法是将整个数据集推送到神经网络。

    Samples/Batch_size = 批次数

    请记住,batch_size 和批次数是两个不同的东西。

    【讨论】:

    • 但是,当我想将训练数据集重塑为 time_steps 不为 1 且特征始终为列数的指定形状时,必须将训练数据集重新调整为 [samples, time_steps, features] 的形式训练数据集,我必须改变样本的值,这是怎么发生的?实际如何理解time_steps