我正在与LSTM合作解决我的时间序列预测问题。我有以下网络:
model = Sequential()
model.add(LSTM(units_size=300, activation=activation, input_shape=(20, 1)))
model.add(Dense(20))
我的预测问题是预测下20个时间步长,回顾过去20个时间步长。因此,对于每次迭代,我都有一个输入形状,如(x_t-20 ... x_t)并预测下一个形状(x_t + 1 ... x_t + 20)。对于隐藏层,我使用300个隐藏单元。
由于LSTM与简单的前馈神经网络不同,我无法理解用于LSTM单元的那300个隐藏单元以及输出结果如何。是否有20个LSTM单元和每个单元300个单元?这些单元如何产生输出?如上文所述,我有20个时间步长可以预测,这些步骤都是从最近的LSTM单元生成的吗?我不知道。可以大致给出这种网络结构的示意图示例吗?
答案 0 :(得分:1)
要了解LSTM,我建议您先花几分钟时间来理解“普通香草” RNN,因为LSTM只是其中的一个更复杂的版本。如果它是基本的RNN,我将尝试描述您的网络中正在发生的事情。
您正在训练一组权重,该权重在每个时间步(t-20,...,t
)中重复使用。第一个权重(例如W1
)用于输入。将x_t-20,...,x_t
中的每一个乘以W1
,然后应用非线性激活函数-与任何NN前向传递相同。
与RNN的区别在于,存在一个单独的“状态”(请注意:不是经过训练的权重),该状态可以从随机或零开始,并跨时间步长携带有关序列的信息。状态还有另一个权重(W2
)。因此,从第一个时间步骤t-20
开始,将初始状态乘以W2
并应用激活函数。
因此,在时间步t-20
处,我们有W1
(在输入上)和W2
(在状态上)的输出。我们可以在每个时间步组合这些输出,并使用它生成状态以传递到下一个时间步,即t-19
。由于必须在每个时间步长计算状态并传递到下一个时间步长,因此这些计算必须从t-20开始顺序进行。为了生成所需的输出,我们可以在所有时间步长获取每个输出状态-或仅在最后一个时间步长获取输出。与Keras中的return_sequences=False
默认一样,您仅在最后一个时间步使用输出,然后将其输出到密集层。
权重W1
和W2
的一维必须等于每个时间步输入x_t-20...
的维,矩阵乘法才能起作用。在您的情况下,此维度为1,因为20个输入中的每个输入都是一个1d向量(或数字),乘以W1
。但是,我们可以根据需要自由设置权重的第二维-在您的情况下为300。因此W1
的大小为1x300,并乘以20次,每个时间步一次。
This lecture将带您逐步了解我上面介绍的RNN的基本流程图,并逐步介绍可以跳过的更高级的内容。 This is a famous explanation of LSTMs如果您想从基本RNN过渡到LSTM,您可能不需要这样做-权重和状态会更复杂。
答案 1 :(得分:1)
关于这些问题,
我不明白用于LSTM单元的那300个隐藏单元以及输出结果如何。是否有20个LSTM单元和每个单元300个单元?这些单元格的输出如何产生?
考虑将您定义为单个块的LSTM层更为简单。该图大量借鉴了Francois Chollet的《 Python深度学习》一书:
在模型中,输入形状定义为(20,1),因此您有20个大小为1的时间步。请暂时考虑不存在输出Dense层。
model = Sequential()
model.add(LSTM(300, input_shape=(20,1)))
model.summary()
lstm_7(LSTM)(无,300)362400
LSTM层的输出形状为300,这意味着输出大小为300。
output = model.predict(np.zeros((1, 20, 1)))
print(output.shape)
(1,300)
输入(1,20,1) =>批处理大小= 1,时间步长= 20,输入功能大小= 1。
输出(1,300) =>批处理大小= 1,输出功能大小= 300
Keras反复运行LSTM 20个时间步,并生成大小为(300)的输出。在上图中,这是输出t + 19 。
现在,如果在LSTM之后添加Dense层,则输出的大小将为20,这很简单。