问题

展开,时间步,批大小和隐藏单位


我在这里读这篇博客是为了理解理论背景,但是在读完这里之后,我对什么是**1)时间步长,2)展开,3)隐藏单元的数量和4)批量大小**有点困惑?也许有人可以从代码的角度来解释这一点,因为当我查看模型配置时,下面的代码没有展开,但是在这种情况下,timestep 在做什么呢?假设我有一个长度为2000点的数据,分为40个时间步长和一个特征。例如,隐藏单位为100。batchsize 没有定义,模型中发生了什么?

model = Sequential()
model.add(LSTM(100, input_shape=(n_timesteps_in, n_features)))
model.add(RepeatVector(n_timesteps_in))
model.add(LSTM(100, return_sequences=True))
model.add(TimeDistributed(Dense(n_features, activation='tanh')))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])

history=model.fit(train, train, epochs=epochs, verbose=2, shuffle=False)

下面的代码仍然是没有 RepeatVector 的编码器-解码模型吗?

model = Sequential()
model.add(LSTM(100, return_sequences=True, input_shape=(n_timesteps_in, n_features)))
model.add(LSTM(100, return_sequences=True))
model.add(TimeDistributed(Dense(n_features, activation='tanh')))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])

history=model.fit(train, train, epochs=epochs, verbose=2, shuffle=False)
推荐答案

“展开”只是一种处理 LSTMs 的机制,通过占用更多内存来加快 LSTMs 的速度。(具体细节我不清楚...但在台阶、造型等方面肯定没有影响。)

当你说“2000点分成40个时间步”时,我完全不知道是怎么回事。

数据必须是有意义的结构,说“2000”个数据点真的缺少很多信息。

LSTM 的结构化数据为:

  • 我有一定数量的单个序列(数据随时间演变)
  • 每个序列都有多个时间步长(时间度量)
  • 在每个步骤中,我们测量了许多具有不同含义(特征)的不同变量

例子:

  • 一个网站有 2000 名用户
  • 他们使用该网站 40 天
  • 我每天测量他们点击按钮的次数

我可以画出这些数据每天是如何随时间演变的(每一天都是一个步骤)

因此,如果你有2000个序列(在 Keras 中也称为“样本”),每个序列的长度为40步,每一步只有一个特征,这将发生:

尺寸

  • fit 方法中,Batch size 默认定义为 32。该模型将处理包含 32 个序列/用户的批次,直到达到 2000 个序列/用户。
  • input_shape 需要为 (40,1) (在 fit 中选择免费的批量大小)

台阶

您的 LSTM 将尝试逐步了解点击次数如何随时间变化。这就是为什么它们是循环的,它们计算一个步骤的东西并将这些东西输入下一步,直到处理完所有 40 个步骤。(不过,您不会看到此处理,它是内部的)

  • 使用 return_sequences=True,您将获得所有步骤的输出。
  • 没有它,您将仅获得最后一步的输出。

该模型

该模型将在每批中一起处理 32 个并行(和独立)序列/用户。

  • 第一个 LSTM 层将在循环步骤中处理整个序列并返回最终结果。(序列被杀死,没有步骤,因为你没有使用 return_sequences=True
    • 输出形状 = (batch, 100)< /li>
  • 你用 RepeatVector 创建了一个新序列,但是这个序列在时间上是恒定的。
    • 输出形状 = ( batch, 40, 100)
  • 下一个 LSTM 层处理这个常数序列并产生一个输出序列,全部 40 步
    • 输出形状 = (bathc, 40, 100)
  • TimeDistributed(Dense)将处理每个步骤,但独立(并行)处理,而不是像 LSTM 那样递归处理。
    • 输出形状 = (batch, 40, n_features)
    • < /ul>
    • 输出将是 2000 个序列的总组(以 32 个为一组进行处理),每个序列有 40 个步骤和 n_features 个输出特征。

    细胞功能,单位

    一切都独立。

    输入特征是一回事,输出特征是另一回事。Dense 不需要使用与 input_shape 中使用的相同数量的特征,除非这是您想要的。

    当你在 LSTM 层中使用 100 个单元时,它会产生一个包含 100 个特征的输出序列,形状为 (batch, 40, 100)。如果你使用 200 个单元,它将产生一个具有 200 个特征的输出序列,形状为 (batch, 40, 200)。这就是计算能力。更多的神经元 = 模型中的更多智能。

    模型中的一些奇怪之处:

    你应该更换:

    model.add(LSTM(100, input_shape=(n_timesteps_in, n_features)))
    model.add(RepeatVector(n_timesteps_in))
    

    只有:

    model.add(LSTM(100, return_sequences=True,input_shape=(n_timesteps_in, n_features)))
    

    在第一层不返回序列,然后用 RepeatVector 创建一个常量序列有点破坏你的第一个 LSTM 的工作。