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

时间:2018-05-22 22:44:28

标签: python tensorflow keras lstm

我在这里阅读这篇博客是为了理解理论背景this,但在阅读here之后,我对** 1)时间步,2)展开,3)隐藏单位数和4有点困惑)批量大小**是?也许有人可以在代码的基础上解释这一点,因为当我查看模型配置时,下面的代码不会展开,但是在这种情况下,时间步是做什么的?假设我有一个长度为2.000点的数据,分为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)

1 个答案:

答案 0 :(得分:0)

“Unroll”只是一种处理LSTM的机制,它通过占用更多内存使它们更快。 (细节对我来说不得而知......但它肯定对步骤,形状等没有影响)。

当你说“以40个时间段分开2000分”时,我完全不知道发生了什么。

数据必须结构合理,并说“2000”数据点确实缺乏大量信息。

为LSTM构建的数据是:

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

示例:

  • 网站中的2000位用户
  • 他们使用该网站40天
  • 每天我都会测量他们点击按钮的次数

我可以绘制这些数据如何随着时间的推移每天发展(每一天都是一步)

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

<强>尺寸

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

<强>步骤

您的LSTM会尝试逐步了解点击次数的变化情况。这就是他们经常出现的原因,他们计算出一步并将这些东西送到下一步,直到所有40个步骤都被处理完毕。 (你不会看到这个处理,但它是内部的)

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

模型

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

  • 第一个LSTM图层将以循环步骤处理整个序列并返回最终结果。 (序列被杀死,没有任何步骤,因为你没有使用return_sequences=True
    • 输出形状= (batch, 100)
  • 使用RepeatVector创建新序列,但此序列在时间上是常量。
    • 输出形状= (batch, 40, 100)
  • 下一个LSTM图层处理此常量序列并生成一个输出序列,包含所有40个步骤
    • 输出形状= (bathc, 40, 100)
  • TimeDistributed(Dense)将处理每个步骤,但是独立地(并行地)处理,而不是像LSTM那样递归地处理。
    • 输出形状= (batch, 40, n_features)
  • 输出将是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的工作。