LSTM网络的图说明

时间:2019-03-09 14:16:20

标签: python keras lstm

我正在与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单元生成的吗?我不知道。可以大致给出这种网络结构的示意图示例吗?

2 个答案:

答案 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默认一样,您仅在最后一个时间步使用输出,然后将其输出到密集层。

权重W1W2的一维必须等于每个时间步输入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深度学习》一书:

enter image description here

在模型中,输入形状定义为(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,这很简单。