我在这里读这篇博客是为了理解理论背景,但是在读完这里之后,我对什么是**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个序列(在 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)
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 的工作。