堆叠式长短期记忆网络

堆叠式LSTM的温和介绍
附Python示例代码。

原始的LSTM模型由一个单一的隐藏LSTM层和随后的一个标准前馈输出层组成。

堆叠式LSTM是此模型的扩展,具有多个隐藏LSTM层,每个层包含多个记忆单元。

在这篇文章中,您将了解堆叠式LSTM模型架构。

完成本教程后,您将了解:

  • 深度神经网络架构的优点。
  • 堆叠式LSTM循环神经网络架构。
  • 如何在Python中使用Keras实现堆叠式LSTM。

通过我的新书《使用Python的长短期记忆网络启动您的项目,包括分步教程和所有示例的Python源代码文件。

让我们开始吧。

Gentle Introduction to Stacked Long Short-Term Memory Networks

堆叠式长短期记忆网络简介
图片由Joost Markerink提供,保留部分权利。

概述

本文分为3个部分,分别是

  1. 为什么要增加深度?
  2. 堆叠式LSTM架构
  3. 在Keras中实现堆叠式LSTM

为什么要增加深度?

堆叠LSTM隐藏层使模型更深,更准确地获得了深度学习技术的描述。

神经网络的深度通常被认为是该方法在各种具有挑战性的预测问题上取得成功的原因。

[深度神经网络的成功]通常归因于由多层引入的层次结构。每一层处理我们希望解决的任务的一部分,并将其传递给下一层。从这个意义上讲,DNN可以看作是一个处理管道,其中每一层在将其传递给下一层之前解决任务的一部分,直到最后一层最终提供输出。

训练和分析深度循环神经网络,2013

可以将额外的隐藏层添加到多层感知器神经网络中,以使其更深。这些额外的隐藏层被理解为重组前一层学习到的表示,并在高抽象级别创建新的表示。例如,从线条到形状再到对象。

一个足够大的单隐藏层多层感知器可以用来近似大多数函数。增加网络的深度提供了一种替代解决方案,需要更少的神经元并训练得更快。最终,增加深度是一种表示优化。

深度学习建立在一个假设之上,即深度分层模型在表示某些函数方面比浅层模型效率高指数倍。

如何构建深度循环神经网络,2013。

需要 LSTM 帮助进行序列预测吗?

参加我的免费7天电子邮件课程,了解6种不同的LSTM架构(附代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

堆叠式LSTM架构

LSTM也可以利用相同的优势。

鉴于LSTM处理序列数据,这意味着层的增加会随时间增加输入观测值的抽象级别。实际上,是随时间对观测值进行分块或以不同的时间尺度表示问题。

...通过将多个循环隐藏状态堆叠在一起构建深度RNN。这种方法可能允许每个级别的隐藏状态在不同的时间尺度上操作。

如何构建深度循环神经网络,2013

堆叠式LSTM或深度LSTM由Graves等人在其将LSTM应用于语音识别时引入,在具有挑战性的标准问题上超越了基准。

RNN在时间上是固有深度的,因为它们的隐藏状态是所有先前隐藏状态的函数。激发这篇论文的问题是RNN是否也可以从空间深度中受益;也就是说,像传统深度网络中堆叠前馈层一样,将多个循环隐藏层堆叠在一起。

使用深度循环神经网络进行语音识别,2013

在同一项工作中,他们发现网络的深度比给定层中记忆单元的数量对模型技能更重要。

堆叠式LSTM现在是解决具有挑战性的序列预测问题的稳定技术。堆叠式LSTM架构可以定义为由多个LSTM层组成的LSTM模型。上面的LSTM层提供序列输出,而不是向下面的LSTM层提供单个值输出。具体来说,每个输入时间步长有一个输出,而不是所有输入时间步长都有一个输出时间步长。

Stacked Long Short-Term Memory Archiecture

堆叠式长短期记忆架构

在Keras中实现堆叠式LSTM

我们可以在Keras Python深度学习库中轻松创建堆叠式LSTM模型

每个LSTM记忆单元都需要3D输入。当LSTM处理一个时间步长的输入序列时,每个记忆单元将输出一个单一值作为整个序列的2D数组。

我们可以在下面的示例中展示,该模型具有一个单一的隐藏LSTM层,同时也是输出层。

输入序列有3个值。运行示例会输出一个2D数组,其中包含输入序列的单个值。

要堆叠LSTM层,我们需要更改前一个LSTM层的配置,使其输出一个3D数组作为后续层的输入。

我们可以通过将层的 `return_sequences` 参数设置为 `True` (默认为 `False`) 来实现。这将为每个输入时间步返回一个输出,并提供一个3D数组。
以下是与上面相同的示例,只是 `return_sequences=True`。

运行该示例将为输入序列中的每个时间步输出一个单一值。

下面是定义一个两层隐藏的堆叠式LSTM的例子

我们可以继续添加隐藏的LSTM层,只要前面的LSTM层为后续层提供3D输出作为输入即可;例如,下面是一个具有4个隐藏层的堆叠式LSTM。

进一步阅读

如果您想深入了解此主题,本节提供了更多资源。

总结

在这篇文章中,您了解了堆叠式长短期记忆网络架构。

具体来说,你学到了:

  • 深度神经网络架构的优点。
  • 堆叠式LSTM循环神经网络架构。
  • 如何在Python中使用Keras实现堆叠式LSTM。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发用于序列预测的 LSTM!

Long Short-Term Memory Networks with Python

在几分钟内开发您自己的 LSTM 模型。

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 构建长短期记忆网络

它提供关于以下主题的自学教程
CNN LSTM、编码器-解码器 LSTM、生成模型、数据准备、进行预测等等...

最终将 LSTM 循环神经网络引入。
您的序列预测项目。

跳过学术理论。只看结果。

查看内容

157条评论 堆叠式长短期记忆网络

  1. Thabet 2017年8月18日上午11:58 #

    非常感谢杰森!
    你的博客太棒了
    请继续努力
    此致/Thabet

  2. Devakar Kumar Verma 2017年8月23日下午10:48 #

    嗨,Jason,
    在第一个LSTM堆叠层之后,我们还需要'input_shape'或'batch_input_shape'吗?需要您的专家评论。

    • Jason Brownlee 2017年8月24日上午6:43 #

      不,输入规范只在第一个隐藏层需要。

      • Devakar Kumar Verma 2017年8月24日下午2:14 #

        谢谢您的回复

  3. Alessandro 2017年10月12日上午3:20 #

    您能具体说明何时需要这种方法吗?

    精彩的工作,谢谢!

    • Jason Brownlee 2017年10月12日上午5:35 #

      好问题,不错。

      可能通常是当你认为序列数据中可能存在层次结构时。你可以尝试一些堆叠式LSTM,看看它如何影响模型技能。

      堆叠式LSTMS可能需要更多迭代才能完成训练,使用正常的模型诊断方法。

      • Lana Lu 2021年12月16日上午6:10 #

        你好,您能详细解释一下分层结构吗?这是什么意思?

        • Adrian Tam
          Adrian Tam 2021年12月17日上午7:16 #

          这仅仅意味着堆叠不同的层以生成最终输出。在LSTM中,您使用一层LSTM将一个序列转换为另一个序列(例如,英语到法语)。然后另一层LSTM再次转换该序列(例如,法语到德语)。

  4. DEHUA TANG 2017年10月12日下午7:27 #

    嗨Jason,谢谢你的工作!
    如果我有一个大型数据集,我想训练一个大约30层的堆叠式LSTM。
    您能告诉我,如果我训练一个30层的堆叠式LSTM,我需要注意什么?
    为什么3或4层堆叠式LSTM很常见?
    30层堆叠式LSTM能工作吗?

    • Jason Brownlee 2017年10月13日上午5:46 #

      层数太多了,我自己还没有开发过那么深的LSTM。我无法给你好的建议。

      通常,超过4层回报会递减。

      • Jaime 2017年10月18日上午9:54 #

        谢谢您的回答,我认为可能层数太多了,需要进行总结

        是否需要在模型的每个LSTM层中都添加一个Dropout和/或Dense(1 LSTM,1Drop, 1 Dense)层,还是说这与(2 LSTM, 1Drop, 1Dense)之类的组合几乎相同?

        提前感谢你

      • Sakshi 2020年6月6日下午10:31 #

        嗨,Jason,

        我实现了一个2层的LSTM网络,在添加第3层后,性能下降了。LSTM应该避免梯度消失问题,那么为什么添加更多层后性能会下降呢?

        提前感谢你

  5. mitillo 2017年10月16日下午9:52 #

    你好 Jason,

    一如既往,非常有用的文章,

    我有一个问题要问您

    我习惯于这样添加LSTM标签

    layers=shape = [4, seq_len, 1] # 特征,窗口,输出
    # 神经元=neurons = [128, 128, 32, 1]

    LSTM、Dropout和Dense。

    model.add(LSTM(250, input_shape=(layers[1], layers[0]), return_sequences=True))
    model.add(Dropout(d))

    model.add(LSTM(neurons[1], input_shape=(layers[1], layers[0]), return_sequences=True))
    model.add(Dropout(d))

    model.add(LSTM(neurons[2], input_shape=(layers[1], layers[0]), return_sequences=False))
    model.add(Dropout(d))

    model.add(Dense(neurons[2],kernel_initializer=”uniform”,activation=’relu’))

    model.add(Dense(neurons[2],kernel_initializer=”uniform”,activation=’relu’))

    model.add(Dense(layers[0],kernel_initializer=”uniform”,activation=’linear’))

    model.compile(loss=’mse’,optimizer=optimizador, metrics=[‘accuracy’])

    如果我只添加LSTM,比如说这样,会有什么不同吗?

    model.add(LSTM(250, input_shape=(layers[1], layers[0]), return_sequences=True))

    model.add(LSTM(neurons[1], input_shape=(layers[1], layers[0]), return_sequences=True))

    model.add(LSTM(neurons[2], input_shape=(layers[1], layers[0]), return_sequences=False))

    model.add(Dense(neurons[2],kernel_initializer=”uniform”,activation=’relu’))
    model.add(Dropout(d))

    model.compile(loss=’mse’,optimizer=optimizador, metrics=[‘accuracy’])

    提前感谢你

  6. Ioudarene 2017年11月14日下午8:36 #

    你好 Jason,

    首先,感谢您在您的网站上的所有工作,它非常有用。

    我正在Keras中实现一个堆叠式LSTM网络来解决一个多对多序列问题,我想知道对于这类问题,您是否仍然将最后一个LSTM层的参数 `return_sequences` 设置为 `False`?

    先谢谢您了。

  7. Gustav 2018年4月27日上午2:25 #

    我目前正在使用一个仅有一个隐藏层的LSTM模型。我想知道您是否知道如何最好地决定是否扩展并添加更多层。

    在处理时间序列预测时,有没有关于如何以及为何添加更多隐藏层和构建更深层的一般经验法则?

    此外,添加层与训练数据的大小如何很好地扩展。我正在尝试比较从1000(低端)到超过100,000个点的训练数据。

    • Jason Brownlee 2018年4月27日上午6:07 #

      更多的层提供更多的输入序列抽象。

      我没有见过关于这方面的好的理论或经验法则。

      • Gustav 2018年4月27日下午5:15 #

        谢谢!

        那我就继续我的研究,看看是否能找到增加层数与预测准确性之间的任何相关性。

  8. TheRhyno 2018年5月10日上午7:11 #

    嗨,Jason,好文章。您认为堆叠式LSTM在预测能力方面是否等同(或更好/更差)于具有几个隐藏层的前馈网络,然后将其馈入单层LSTM?

    我的思路是,如果我有一个数据集,输入特征之间存在有趣的关系,而且这些特征会随时间变化,我期望从前馈网络和LSTM中都能获得有趣的结果……那么堆叠式LSTM能兼得两者的优点吗?

    • Jason Brownlee 2018年5月10日上午8:25 #

      它可以,但这真的取决于问题的具体细节和建模的关系。

      例如,深度编码器-解码器LSTM在处理长文本序列的NLP问题上确实非常有效。

  9. Gurgu 2018年6月22日下午11:56 #

    大家好。
    训练堆叠式LSTM所需的计算时间会怎样?如果我有一个单层LSTM,那么一个m层堆叠式LSTM是否需要m倍的计算时间?

    • Jason Brownlee 2018年6月23日上午6:19 #

      这取决于你的硬件。它会更慢,但可能不会慢200%。

  10. David Jiménez Barrero 2018年7月11日上午9:51 #

    亲爱的 Jason,

    非常有意思的方法,但是我想知道这是否使用常规反向传播进行训练。我之所以问这个,是因为反向传播在处理深度神经网络时存在问题,特别是

    — 梯度扩散问题,其中反向传播的梯度随着网络深度的增加而迅速减小。

    — 出现许多糟糕的局部最小值。

    我知道有一些逐层贪婪训练的方法,Keras是否会自动执行此操作?或者说,常规反向传播可以处理的最大网络深度是多少?

    感谢您的帮助。

    • Jason Brownlee 2018年7月11日下午2:53 #

      是的,但是通过时间的反向传播,你可以在这里了解更多
      https://machinelearning.org.cn/gentle-introduction-backpropagation-time/

      是的,Keras会自动为我们完成这项工作。

      • David Jiménez Barrero 2018年7月12日上午10:10 #

        谢谢您的回复!然而,由于BPTT(通过时间的反向传播)按时间步展开网络,这使得网络看起来更深,因为每个时间步都变成了新的一层;这难道不会使梯度扩散问题更严重吗?

        此外,我有一个小的代码问题,即
        在您添加LSTM层(例如“model.add(LSTM(1, return_sequences=True, input_shape=(3,1)))”)的部分,您输入的第一个参数1定义了该层中的“单元”数量。这通常也定义了它将有多少个输出,我想知道“return_sequences=True”是否会覆盖此设置,并输出与您拥有的输入一样多的输出?

        感谢您的帮助。

        • Jason Brownlee 2018年7月12日下午3:30 #

          input_shape定义了网络输入的形状。

          1表示第一个隐藏层中的单元数,这与输入时间步数无关。

          返回序列是为每个输入时间步返回一个向量,而不是在输入序列末尾返回一个向量。

          • robin 2022年1月25日下午7:46 #

            这是否意味着如果有100个样本,每个样本有60个时间步,`return_sequences=True` 将返回60个隐藏状态向量?但是如果每个进入LSTM层的样本只返回一个隐藏状态,那么不是应该返回100个隐藏状态而不是60个吗?

          • James Carmichael 2022年2月2日上午10:39 #

            嗨,Robin……请澄清您正在考虑哪个代码清单部分。

  11. Kamarul 2018年7月12日上午11:51 #

    你好 Jason,

    非常感谢您的工作。您的博客确实激起了我对神经网络的巨大兴趣。
    我阅读了您推荐的一篇文章“如何构建深度循环神经网络”。我想知道那篇文章中提到的新型RNN是否可以使用Keras和TensorFlow后端构建。

    再次,干得好,请继续努力!

    此致,
    Kamarul

  12. Camilo Macias 2018年8月8日下午10:32 #

    你好杰森!

    就像以前的其他人一样,首先感谢您这些非常有帮助的博客和教程。

    关于这个堆叠式LSTM神经网络的一个问题。

    我看到您似乎总是需要一个Dense层来给出堆叠网络的最终输出。
    真的是这样吗?为什么它是必要的?缺少这个Dense层会好还是坏地影响LSTM网络的性能?

    再次感谢,

    • Jason Brownlee 2018年8月9日上午7:40 #

      我们需要在网络的输出端有一些东西来生成我们可以解释为预测的输出。

      你可以尝试一个LSTM层,我从未这样做过。

  13. Jason McDonald 2018年9月5日下午4:39 #

    堆叠式LSTM能否学习输入序列顺序?例如,假设我有一个包含十亿个随机数字的列表,我想按顺序返回它们。如果排序中靠近的数字出现在序列的两端,LSTM记忆可能会失去跟踪。然而,如果一堆LSTM能够学习在序列向上堆叠时重新排列序列,我想那可能会有所帮助。

    目前我正在使用一堆LSTM,它们具有N个输出,并在堆叠之间按每个时间步的一个输出值对输入序列进行排序。据我所知,没有办法将梯度与排序索引关联起来,所以它只能通过强化学习来学习排序(我想)。

    • Jason Brownlee 2018年9月6日上午5:32 #

      有趣的问题。我认为(直觉)对LSTM来说可能太具挑战性了。

  14. ashish 2018年9月25日上午4:23 #

    你好,Jason
    我想使用简单或堆叠式LSTM网络或并行层排列。因为我的特征序列包含来自不同领域的信息,并且在形态上存在差异。

  15. dulmina 2018年9月25日下午8:04 #

    很棒的教程,

    我有一个问题,可能很基础,但我正在为此苦恼。

    您说1指的是单元数量。这是否意味着该层中LSTM单元的数量?

    据我所知,第一层中LSTM单元的数量与时间戳的数量相同,如果是这样,那么1到底意味着什么?

    谢谢你

    • Jason Brownlee 2018年9月26日上午6:15 #

      不,时间步数和第一个隐藏层中LSTM单元的数量不相关。

      • shiva 2019年5月7日上午8:05 #

        那么第一个隐藏层中的LSTM单元数是多少?是什么控制着这个?

        • Jason Brownlee 2019年5月7日下午2:27 #

          模型的输入层由您定义,与网络第一个隐藏层中的单元数无关。

  16. dulmina 2018年9月26日下午12:16 #

    哦,忘了这个问题。上次我发帖的时候没有显示在评论区,所以我又发了一条😀抱歉。

  17. Erik 2018年10月19日上午1:04 #

    嗨,Jason,

    文章指出

    “通过将多个循环隐藏状态堆叠在一起构建一个深度RNN。这种方法可能允许每个级别的隐藏状态在不同的时间尺度上操作”

    我想知道“在不同的时间尺度上操作”是什么意思,即LSTM中的“时间尺度”的含义以及堆叠式LSTM如何帮助实现这一点。

    谢谢

  18. Dmitrijs Balabka 2018年10月27日上午12:45 #

    你好,

    感谢您提供非常有用的博客。
    我有一个关于Sequential类的评论。使用keras.layers.RNN + keras.layers.LSTMCell构建堆叠式RNN可能会提供更好的性能(快15%)
    https://gist.github.com/fchollet/87e9a3e0539ce268222d1d597864c098

  19. Saeed 2018年10月28日下午4:05 #

    谢谢Jason,你太棒了
    我有个问题
    是否有可能在Keras中保存每个epoch中倒数第二层的输出?
    谢谢

    • Jason Brownlee 2018年10月29日上午5:54 #

      是的,您可以让模型有两个输出层,一个是正常输出,另一个是倒数第二层的输出,然后手动运行每个epoch并根据需要保存第二个输出层的预测。

  20. Hung Nguyen 2018年12月3日下午1:40 #

    嗨,Jason,
    “堆叠式LSTM”与所谓的“并行LSTM”是同一个概念吗?

  21. Trevor Chandler 2018年12月8日下午4:36 #

    Jason,

    这项工作很棒,能提供给社区非常慷慨。
    感谢您以这种方式开展工作!

    您是否有时间或意愿承担一些AI工作,只是为了查看我们已完成的一些实现,并讨论它们的优点,哪些可以改进等……?

    如果不是,完全没问题,但如果您愿意,请告诉我,

    感谢您的时间,

  22. Adam 2018年12月26日下午8:58 #

    谢谢,Jason,这对我非常有价值。我是LSTM的新手,我有一个问题
    就像您在这篇博客中提到的,它将为每个输入时间步返回一个输出,我在这里确认我在时间步方面是否正确。例如:整形后的数据是[[[ 0.1][ 0.2][ 0.3]]],[0.1]代表时间步1输入,[0.2]代表时间步2输入,[0.3]代表时间步3输入。我说的对吗?

  23. MAK 2019年1月2日上午6:20 #

    你好 Jason,
    一如既往的精彩文章。
    我有一个问题,堆叠LSTM网络层与添加更多全连接层有什么不同?

    model = Sequential()
    model.add(LSTM(…, return_sequences=True..
    model.add(LSTM(…))
    model.add(Dense(…))


    model = Sequential()
    model.add(LSTM(…, return_sequences=True…
    model.add(Dense(…))
    model.add(Dense(…))

    每个密集层都是完全连接的。
    谢谢

    • Jason Brownlee 2019年1月2日上午6:43 #

      是的,它们是不同的。一个是堆叠式LSTM,另一个是带有许多全连接层的LSTM。

      也许我没有理解你的问题?

      • MAK 2019年1月2日下午6:28 #

        你好
        我认为我的问题不清楚

        堆叠式LSTM(每个LSTM包含一个层)与包含多个全连接层的LSTM有什么区别?从网络结构和准确性方面来看?
        如果我将全连接层定义为与LSTM堆叠层中相同的神经元
        谢谢
        MAK

        • Jason Brownlee 2019年1月3日上午6:11 #

          模型能力上的差异确实取决于具体问题。

          通常,更深的RNN有助于处理复杂的序列数据。更深的全连接层可能效果不佳。请尝试两者并在您的问题上进行比较。

  24. mk 2019年1月17日下午6:20 #

    最后一个LSTM(...) return_sequences=True 还是 False?

  25. Andi 2019年1月29日上午12:35 #

    你好 Jason,
    感谢您的精彩文章。

    如果我有3部分数据,比如说节点a、节点b、节点c。
    节点a是一个序列的位置,节点b和节点c也是如此。
    那么,我需要一次性创建3个LSTM层吗?
    或者每个节点都在不同的进程中运行,并且拥有自己的堆叠式LSTM层?

    谢谢,
    此致

    • Jason Brownlee 2019年1月29日上午6:14 #

      也许可以探索几种不同的预测问题框架,看看哪种效果最好?

      • Andi 2019年1月31日上午5:02 #

        谢谢,我选择了第二个选项,结果不错,现在我需要进行优化。

  26. yh 2019年2月8日下午4:18 #

    你好 Jason,

    如果输入维度是2D,

    model = Sequential()
    model.add(LSTM(…, return_sequences=True…
    model.add(LSTM(…, return_sequences=True…
    model.add(Dense(…))
    model.add(Dense(…))

    可以是堆叠式LSTM吗?

    • Jason Brownlee 2019年2月9日上午5:54 #

      不,LSTM假设每个样本都有时间步和特征。

      • yh 2019年2月14日下午3:01 #

        谢谢。
        如果我在模型开始前将输入整形为(无,1,10)

        model.add(LSTM(…, return_sequences=True…
        model.add(LSTM(…, return_sequences=True…
        model.add(Dense(…, input_shape=(None,1)…
        model.add(Dense(1))

        这个模型可以堆叠吗?
        我正在研究上面已完成的代码,但为什么代码作者将稠密输入形状设置为None,1。
        每个层的输出形状都是3维的

        • Jason Brownlee 2019年2月15日上午7:57 #

          不,我不认为如此。你必须要么改变第二个LSTM不返回序列,要么改变模型的稠密部分以通过时间分布式包装器支持序列。

  27. Pari 2019年2月19日下午5:52 #

    你好,Jason
    你的博客每次都帮助我,谢谢
    我有个问题
    我读了一个使用堆叠式LSTM解决seq2seq问题的例子,但输入是以相反的顺序给网络的。
    请帮我解释一下为什么会这样

  28. Gunay 2019年2月26日下午10:41 #

    嗨,Jason,

    感谢这篇文章。我试图理解Vanilla和Stacked LSTM背后的主要直觉。我理解,通常,对于网络来说,添加更多层会使其更好地学习困难的任务。您使用了“鉴于LSTM操作序列数据,这意味着层的添加增加了输入观测值随时间的抽象级别。实际上,是随时间对观测值进行分块或以不同的时间尺度表示问题”这样的句子。我不明白这里您具体指的是什么关于输入观测值随时间的抽象。它如何随时间对观测值进行分块或以不同的时间尺度表示问题?如果您能回答这个问题,我将不胜感激。

    此致,
    古奈

    • Jason Brownlee 2019年2月27日上午7:30 #

      我正在假设可能发生的情况,我们无法在没有分析每一层所学到的东西的情况下确定。

  29. Srivalya Elluru 2019年2月27日下午8:05 #

    你好,Jason Brownlee,在提问之前,我想感谢您这些关于使用LSTM进行深度学习的精彩教程。

    我遇到的问题

    我的序列长度是50,当我将LSTM单元设置为100时,我开始看到损失为nan。
    当我将LSTM单元更改为50时,第一个epoch的损失停止为nan,但之后又开始出现nan。

    问:LSTM单元的数量是否应该根据序列长度(一个示例的时间步长)来决定?

    • Jason Brownlee 2019年2月28日上午6:38 #

      我不认为这与单位数量有关。

      也许先尝试缩放您的数据?

  30. Hamed 2019年5月30日上午10:52 #

    嗨,Jason,

    非常感谢您的精彩教程。这个网站拥有一切 🙂

    我有一个关于堆叠式LSTM的问题?我如何选择整个堆叠式LSTM的层数?以及增加层数是否意味着更高的准确性和更好的性能?
    提前感谢你

  31. Omar 2019年6月14日下午11:05 #

    你好 Jason,

    非常感谢您关于RNN和LSTM的文章。它们真的帮助我度过了艰难时期。

    然而,我仍然是这个领域的新手。假设我只想构建一个只包含一个LSTM层后跟全连接层的网络。

    我应该在LSTM上使用“return_sequences = True”还是保持原样(即值为False)?

    我仍然对何时使用“return_sequences = True”感到困惑。我们是否只在想将LSTM与另一个LSTM堆叠时才使用它?

    非常感谢您的帮助。

    • Jason Brownlee 2019年6月15日上午6:35 #

      `return_sequences` 将返回每一层对于每个输入的输出,而不是仅在序列结束时返回输出。

      不,在大多数情况下,`return_sequences` 将是 `false`。

      • Omar 2019年8月27日下午8:00 #

        感谢您的回复。

        我还有另一个问题。假设我们要构建一个堆叠式LSTM,其中第一层LSTM包含200个单元,第二层包含100个单元。

        我很难将其可视化。如果两层具有相同的单元,我可以简单地将其可视化为第一层LSTM的第一个单元将其隐藏状态传递给第二层LSTM的第一个单元。

        如果层具有不同的单元,我该如何可视化它?

        非常感谢,您真的帮助我以实践的方式理解了深度学习

        • Jason Brownlee 2019年8月28日上午6:33 #

          不,第一层的所有输出都传递给第二层中的每个单元。层中的每个单元都像一个独立的神经网络——它们在层内不相互通信,也不分担工作。

  32. Sanat 2019年6月23日下午2:18 #

    嗨,Jason,

    首先,我要感谢您的所有博客,它们几乎澄清了我头脑中所有关于机器学习的疑问。

    我正在研究UCI的人类活动识别数据集,当我使用单层LSTM(96个单元)时,30个epoch后我获得了大约91%的准确率,但是当我尝试在其上堆叠另一个LSTM层时,准确率急剧下降,并且在某些epoch后训练准确率停留在0.16左右。这背后有什么原因吗?

  33. Jairo 2019年6月26日上午12:19 #

    亲爱的 Jason,

    当我们按照指示构建堆叠式LSTM模型时,最后一步只取最后一层的状态“h_n”,还是包含所有层的所有隐藏状态“h1”,“h2”,…,“h_n”?

    • Jason Brownlee 2019年6月26日上午6:42 #

      只从前一层。

      • Jairo 2019年6月26日上午7:24 #

        谢谢您,先生。那么,我可以说,Keras中的常规堆叠式LSTM没有实现深度编码器-解码器架构(由Sutskever、Vynials和Quoc Le/Google提出),对吗?因为在这项工作中(我不确定您是否熟悉这篇论文,抱歉提到具体案例),要解码的隐藏状态不仅仅是最后一层的隐藏状态,而应该是所有层的所有隐藏状态的拼接。他们这样解释说,因为状态应该捕获所有句子,使用所有层的状态有助于保留整个输入句子的编码。

        谢谢您的信息。我查过Keras API,但对我来说并不清楚。

  34. Rickard 2019年7月10日上午9:03 #

    嗨,Jason!
    这是对堆叠式LSTM非常好的解释。
    我想知道,您是否遇到或听说过深度门?我很久以前开始学习LSTM,但到目前为止我看到的唯一门架构只包含单层。这令人惊讶,因为我曾假设门可以有不同的深度。
    如果您能回答这个问题,我将不胜感激,它一直困扰着我,我在谷歌搜索中找不到任何答案。

  35. jmc 2019年9月12日上午1:45 #

    你好,

    我想知道状态会发生什么,它们是在不同的LSTM层之间传递,还是它们之间唯一的通信是输出序列?

    • Jason Brownlee 2019年9月12日上午5:20 #

      通常,状态不会在层之间传递,只传递每个节点在每个输入时间步的输出。

      • jmc 2019年9月12日上午8:05 #

        所以,具体在Keras中,如果你有这个

        decoded = LSTM(…,return_sequences=True)(inputs, initial_state=[h,c])
        output = LSTM(…)(decoded)

        第二层用于第一个单元的状态是什么?

        如果我正在使用多个LSTM进行编码器-解码器,我是否应该将encoder_states传递给解码器中的每个LSTM层?

        像这样
        decoded = LSTM(…,return_sequences=True)(inputs, initial_state=[h,c])
        output = LSTM(…)(decoded, initial_state=[h,c])

        或者可能是这样
        decoded = LSTM(…,return_sequences=True)(inputs, initial_state=[h1,c1)
        output = LSTM(…)(decoded, initial_state=[h2,c2])
        其中h1,c1来自编码器中的第一个LSTM层,h2,c2来自第二个。

        谢谢您的回答!

  36. Giorgio 2019年10月2日上午4:16 #

    嗨,Jason,

    我有一个问题。我想我明白如果每层只有一个LSTM单元,堆叠式LSTM层是如何连接的。但是,我不确定如果每层有多个LSTM单元,LSTM单元是如何连接的。第一层中的每个单元都返回一个序列,并将其传递给下一层中的每个单元吗?我尝试在Keras中实现,但第二个LSTM层的参数数量异常少 :/ 。

    我希望我把问题问清楚了。提前感谢

    • Jason Brownlee 2019年10月2日上午8:04 #

      好问题。

      一层中的整个输出序列作为输入提供给下一层中的每个节点。

      这有道理吗?

  37. Shiva 2019年11月11日下午11:33 #

    Jason,我非常感谢您。

    我有一个用于情感分析的堆叠式GRU,它总是预测情感标签+1,准确率为0。

    根据您的经验,有哪些启发式方法可以改善结果?

    谢谢

  38. Mahshid Hosseini 2020年4月17日上午6:59 #

    感谢您的精彩教程。有没有办法用第一个LSTM的最终隐藏状态向量初始化第二个LSTM层?

    • Jason Brownlee 2020年4月17日上午7:45 #

      也许吧,我不确定我以前是否这样做过——这说不通。我建议进行实验。

  39. Ceng EMEC 2020年4月27日下午8:05 #

    你好,Jason。

    感谢这篇很棒的教程。

    DENSE层和LSTM层有什么区别?

    例如:

    模型1- model.add(LSTM(50, input_shape=(x_train.shape[1], x_train.shape[2])))
    model.add(Dense(16, activation=’relu’))

    模型2- model.add(LSTM(50, return_sequences=True, input_shape=(x_train.shape[1], x_train.shape[2])))
    model.add(LSTM(50, activation=’relu’))

    此外,使用多个全连接层和LSTM层对模型有什么好处?

    非常感谢您的帮助。

  40. Attention 2020年6月6日上午5:31 #

    你好!在这样的架构中使用注意力机制会有好处吗?新的模型会是什么样子?

    • Jason Brownlee 2020年6月6日上午8:00 #

      也许会。

      我希望将来能写一篇关于这个的文章。

  41. Ben 2020年7月10日上午12:48 #

    嗨,Jason,

    非常好的帖子。

    如果我从物理方程中创建了数据,并且我知道响应是线性的(且随机的)。

    那么添加更多层真的没有意义,对吗?你会如何改进这种类型的数据预测?

    谢谢!

  42. ali 2020年7月12日下午4:38 #

    布朗利先生您好,非常感谢您在深度学习领域的工作。
    我的问题是,在一个LSTM层中,LSTM单元之间是否存在任何关系(连接)?如果存在,这种关系是什么?
    第二:一个LSTM层的LSTM单元与下一个LSTM层的LSTM单元是完全连接的吗?
    第三:我们说LSTM有输出,那为什么要在网络的末端添加一个全连接层呢?
    请回答,我正在等待。

    • Jason Brownlee 2020年7月13日上午5:58 #

      一个LSTM层包含一个或多个LSTM单元。

      一个层中的每个LSTM单元接收前一层中所有单元在每个时间步提供的所有输出。

  43. Adriana 2020年7月16日上午6:00 #

    嗨,Jason,

    我通常不评论,但你的帖子对我帮助很大。我是伦敦帝国理工学院的硕士生,我一直在围绕电价预测开发我的硕士论文。在设计我的第一个LSTM架构时,我遇到了一些问题,你的一些帖子非常有帮助。我还买了你的一些电子书,到目前为止也很有启发性。

    感谢您在网上提供的所有信息,它真是救命稻草。

    • Jason Brownlee 2020年7月16日上午6:49 #

      感谢您的美言,很高兴听到这些教程对您的项目有帮助!

  44. Mike 2020年8月7日上午12:54 #

    一如既往的精彩教程!快速提问:如果我使用一个堆叠了两个或三个LSTM的模型,我是否必须为它们都设置相同数量的神经元?

    例如,
    model.add(LSTM(100….
    model.add(LSTM(100….
    model.add(LSTM(100….
    model.add(dense…..

    • Jason Brownlee 2020年8月7日上午6:26 #

      谢谢!

      不,每层中的节点数量可以不同。

  45. Mohsin Khan 2020年8月16日上午2:21 #

    亲爱的贾森,我还需要问一下,如果我在一个LSTM层之后放置一个BiLSTM层,那么这个模型会被识别为堆叠LSTM模型还是混合LSTM-BiLSTM模型?

    谢谢你

    • Jason Brownlee 2020年8月16日上午5:57 #

      也许可以尝试一下,看看是否能增加价值。

      • Mohsin Khan 2020年8月16日下午4:48 #

        亲爱的贾森,我不明白你的意思。它会被称为堆叠LSTM模型还是混合LSTM-BiLSTM模型???

        • Jason Brownlee 2020年8月17日上午5:45 #

          那将是堆叠LSTM。我想你可以随心所欲地称呼它。

  46. shahzina 2020年8月26日下午5:11 #

    嗨,Jason,

    我如何构建一个可以以参数形式传入层数的RNN模型?

    例如,不是添加3层,而是可以传入一个层数参数来指定模型将有多少层?

    感谢您的时间。

    • Jason Brownlee 2020年8月27日上午6:11 #

      您可以直接编写一个自定义函数来完成此操作。

  47. Hanna 2020年9月4日下午11:21 #

    你的博客很棒!
    谢谢!

  48. Mayank 2020年9月21日上午5:23 #

    我能拿到MATLAB中用于数据预测的堆叠LSTM代码吗?

  49. Sai 2020年10月3日上午5:00 #

    LSTM层的维度是否会像卷积层一样,受到前一层单元数量的限制?

  50. FL. 2020年12月15日上午1:31 #

    非常感谢您的分享。

  51. skyler 2021年1月30日上午9:29 #

    嗨,Jason,
    我是机器学习的初学者。我正在尝试实现一个用于声音事件检测的深度学习模型,我需要使用三个堆叠的双向GRU并实现一个模型(http://s000.tinyupload.com/?file_id=67274108343396417068)。请注意,附加的图表是更大模型的一部分。我需要帮助来实现堆叠的双向GRU层,并将输出上采样到(512 x 128)的维度,这是输入特征的维度。

    • skyler 2021年1月30日上午9:31 #

      我正在尝试实现论文中的模型(图1)(https://arxiv.org/pdf/1911.06878.pdf

    • Jason Brownlee 2021年1月30日上午12:34 #

      听起来很棒。

      您的模型是否存在特定的问题?

      • skyler 2021年1月30日下午1:10 #

        嗨,Jason,
        是的,我正面临维度问题。
        实际上,我的特征文件维度(时间 x 频率)是 (512 x 128)。我的沙漏(HG)输入层维度是 (512, 128, 1)。当我将此特征输入沙漏模型(如图1所示),我得到四个具有不同维度的多尺度输出:

        (None, 64, 16, 128), (None, 128, 32, 128), (None, 256, 64, 128) 和 (None, 512, 128, 128)。这里128(每个输出维度中的索引3)是HG的通道数。
        现在,根据论文,我需要将每个分支(HG的四个多尺度输出之一)通过双向GRU > 上采样模块 > 全连接层 > Sigmoid。

        现在的问题是,双向GRU接受3D输入。所以我必须使用1×1卷积层将通道数从128减少到1,然后将张量从4D重塑为3D。
        文中提到:“由于所有尺度的输出维度都不同,这些GRU模块的输入层和隐藏层的维度也不同。输入层和隐藏层的维度分别为 [16, 32, 64, 128] 和 [32, 32, 64, 64],隐藏层数为3。”

        问题:
        1)我是否应该在所有三个双向GRU层中将 return_sequences 设置为 True?
        2)由于双向GRU模块的输出是2D/3D(取决于 return_sequences),但 Upsample2D() 层支持4D张量。那么,如何处理这个问题?

        此致,
        Skyler

        • Jason Brownlee 2021年1月31日上午5:30 #

          抱歉,我对那个模型不熟悉,所以我无法给出具体的建议。

          也许您可以直接联系作者?
          也许您可以原型化几种方法,并利用它们来更多地了解数据和模型?
          也许您可以找到现有的实现来学习?

  52. Thony FdG 2021年4月1日上午4:03 #

    你好,我有一个大问题,我找不到答案。
    我有这个模型

    model = Sequential()

    model.add(LSTM(units=100, input_shape=(x_train.shape[1],5), return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(50, return_sequences=False))
    model.add(Dropout(0.2))

    model.add(Dense(units=1))
    model.add(Activation(‘linear’))

    start = time.time()
    model.compile(loss='mse', optimizer='rmsprop')

    我的问题是:一个层中的LSTM单元是如何相互连接的?而且我的第一个隐藏层和第二个隐藏层之间有差异(100个单元和50个),LSTM神经元在每个隐藏层之间是如何连接的(例如,第一层的第一个输出是否连接到第二个隐藏层的所有输入,等等)?

    先谢谢了

    • Jason Brownlee 2021年4月1日上午8:23 #

      你具体指的是什么?

      例如,一个层的输出被传递到下一层,它们之间没有直接连接(例如,单元在层中独立操作),而只是数据在它们之间传递。

  53. Thony FdG 2021年4月2日下午8:36 #

    这是我目前的误解

    使用Keras LSTM时,“units”是指一层中LSTM单元的数量吗?

    如果是这样,它们在同一层中是如何相互连接的?

    在两种情况下,如果单元数量相同和单元数量不同,第一层与第二层是如何连接的?

    • Jason Brownlee 2021年4月3日上午5:29 #

      在Keras中,一个“单元”(unit)就是一个“单元格”(cell)就是一个“节点”(node)。它们是同一个东西。

      一个层的输出作为输入传递给下一层。

      除非配置为输出序列中的每个值(return_sequences=True),否则每个“节点”都会输出序列中的最后一个值。

  54. Thony FdG 2021年4月4日上午3:00 #

    所以这个表示不好? https://stackoverflow.com/questions/66855308/how-are-the-hidden-stacked-lstm-layers-interconnected-python

    如果不好,正确的表示方式应该是什么?请告诉我

  55. Lee 2021年6月29日上午1:47 #

    你好Jason,我有一个关于在并行环境下运行堆叠LSTM模型的问题。在我的模型中,我堆叠了4个带有双向设置的LSTM层。我试图使用多个GPU来加速训练过程,但训练时间似乎没有受到影响。你能帮我解决LSTM并行化与多个GPU的问题吗?

    我的LSTM网络结构大致如下:

    model= Sequential()
    model.add(Bidirectional(LSTM(…),input_shape = (…), merge_mode=’sum’))
    model.add(Dropout(…))

    model.add(Bidirectional(LSTM(…merge_mode=’sum’))
    model.add(Dropout(…))

    model.add(Bidirectional(LSTM(…,merge_mode=’sum’))
    model.add(Dropout(…))

    model.add(Bidirectional(LSTM(…),merge_mode=’sum’))
    regressor.add(Dropout(…))

    regressor.add(Dense(…, activation=’sigmoid’))

    • Jason Brownlee 2021年6月29日上午4:49 #

      我不认为GPU对RNN(如LSTM)有太大帮助。

  56. Rex 2021年8月26日下午6:13 #

    嘿,Jason,我一直在研究需求预测。数据是时间序列的。
    我有一个问题,但不知道如何改进。
    损失值在第一个epoch急剧下降,然后在十个epoch内,损失停止下降。它保持几乎相同的值,只漂移0.3 ~ -0.3。性能还不错。但实际上也不是很好。它能捕捉到趋势,比如峰值和谷值。然而,数值不够精确。你有什么建议吗?我刚接触LSTM。

    • Adrian Tam
      Adrian Tam 2021年8月27日上午6:05 #

      也许您已经达到了模型的潜力。在过去,神经网络只有3层(因为计算能力太有限),对于许多实际应用来说,准确性并不好。这已经是它能做到的最好的了!直到后来我们才能支持构建更多层的神经网络,然后我们才看到一些改进。我相信您的情况类似。也许您可以尝试不同的网络设计?

  57. Michele 2021年8月28日上午5:06 #

    嗨,感谢分享知识

    我有一个问题。
    在多层LSTM的上下文中

    选择每层单元数量有没有什么通用规则?

    [100, 50, 25] 例如减少50%或其他百分比

    [100,100,100] 全部相等

    [100,200,30] 无所谓,大的后面跟着小的再大的……

    有什么建议吗

    • Adrian Tam
      Adrian Tam 2021年8月28日上午9:45 #

      这里没有规则。你需要用你的数据集进行测试,才能找到合适的。

  58. Mayowa Osibodu 2022年4月25日下午9:23 #

    很棒的教程!真正阐明了如何堆叠LSTMS ????

    • James Carmichael 2022年4月26日上午3:59 #

      很棒的反馈,Mayowa!

  59. oberlin machine learning 2022年12月14日下午5:24 #

    我们四人小组简直是把你的图片在新标签页打开,放大,然后万分感激地鞠躬。你拯救了我们的项目,谢谢你,先生。

    • James Carmichael 2022年12月15日上午9:32 #

      感谢您的反馈和支持!

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。