使用 RNN 进行序列预测模型的温和介绍

序列预测是一个利用历史序列信息预测序列中下一个值或多个值的问题。

序列可以是句子中的字母等符号,也可以是价格时间序列中的实值。序列预测可能在时间序列预测的背景下最容易理解,因为该问题通常已被普遍理解。

在这篇文章中,您将了解可用于构建自己的序列预测问题的标准序列预测模型。

阅读本文后,你将了解:

  • 如何使用循环神经网络对序列预测问题进行建模。
  • 循环神经网络使用的 4 种标准序列预测模型。
  • 初学者在应用序列预测模型时常犯的 2 个最常见误解。

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

让我们开始吧。

教程概述

本教程分为4个部分,它们是:

  1. 使用循环神经网络进行序列预测
  2. 序列预测模型
  3. 时间步长的基数而非特征
  4. 实践者常犯的两个常见误解

使用循环神经网络进行序列预测

循环神经网络,如长短期记忆 (LSTM) 网络,专为序列预测问题而设计。

事实上,在撰写本文时,LSTM 在神经机器翻译(将英语翻译成法语)等挑战性序列预测问题中取得了最先进的成果。

LSTM 通过学习一个函数 (f(…)) 来工作,该函数将输入序列值 (X) 映射到输出序列值 (y)。

学习到的映射函数是静态的,可以看作是一个程序,它接受输入变量并使用内部变量。内部变量由网络维护的内部状态表示,并在输入序列中的每个值上建立或累积。

… RNN 将输入向量与它们的 상태 向量结合,通过一个固定(但已学习)的函数生成一个新的状态向量。这在编程术语中可以解释为运行一个带有特定输入和一些内部变量的固定程序。

— Andrej Karpathy,《循环神经网络的非凡效用》,2015 年

静态映射函数可以使用不同数量的输入或输出进行定义,我们将在下一节中进行回顾。

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

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

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

序列预测模型

在本节中,我们将回顾用于序列预测的 4 种主要模型。

我们将使用以下术语:

  • X:输入序列值,可以通过时间步长分隔,例如 X(1)。
  • u:隐藏状态值,可以通过时间步长分隔,例如 u(1)。
  • y:输出序列值,可以通过时间步长分隔,例如 y(1)。

一对一模型

一对一模型为每个输入值生成一个输出值。

One-to-One Sequence Prediction Model

一对一序列预测模型

第一个时间步的内部状态为零;从那时起,内部状态在先前的时间步上累积。

One-to-One Sequence Prediction Model Over Time

一对一序列预测模型随时间变化

在序列预测的情况下,该模型将为每个收到的输入观测时间步长生成一个时间步长预测。

这是一种对 RNN 的糟糕使用,因为模型没有机会学习输入或输出时间步长(例如 BPTT)。如果您发现为序列预测实现此模型,您可能打算使用多对一模型。

一对多模型

一对多模型为单个输入值生成多个输出值。

One-to-Many Sequence Prediction Model

一对多序列预测模型

内部状态在生成输出序列中的每个值时累积。

此模型可用于图像描述,其中提供一张图像作为输入,并生成一系列单词作为输出。

多对一模型

多对一模型在接收多个输入值后产生一个输出值。

Many-to-One Sequence Prediction Model

多对一序列预测模型

内部状态在每个输入值产生最终输出值之前进行累积。

在时间序列的情况下,此模型将使用一系列最近的观测值来预测下一个时间步。这种架构将代表经典的自回归时间序列模型。

多对多模型

多对多模型在接收多个输入值后产生多个输出。

Many-to-Many Sequence Prediction Model

多对多序列预测模型

与多对一的情况一样,状态会一直累积,直到创建第一个输出,但在此情况下会输出多个时间步。

重要的是,输入时间步的数量不必与输出时间步的数量匹配。可以将输入和输出时间步视为以不同的速率运行。

在时间序列预测中,此模型将使用一系列最新观测值进行多步预测。

从某种意义上说,它结合了多对一和一对多模型的功能。

时间步的基数(不是特征!)

一个常见的困惑点是混淆上述序列映射示例与多个输入和输出特征。

一个序列可以由单个值组成,每个时间步一个。

或者,一个序列也可以轻松地表示一个时间步的多个观测值的向量。向量中每个时间步的每个项都可以被认为是独立的序列。它不影响上述模型的描述。

例如,一个以一个时间步的温度和压力作为输入,并预测一个时间步的温度和压力的模型是一对一模型,而不是多对多模型。

Multiple-Feature Sequence Prediction Model

多特征序列预测模型

该模型确实将两个值作为输入并预测两个值,但对于输入只有一个序列时间步,并预测为输出。

上述序列预测模型的基数指的是时间步,而不是特征(例如,单变量或多变量序列)。

实践者常犯的两个常见误解

特征与时间步长的混淆导致实践者在实现循环神经网络时产生两个主要误解:

1. 将时间步长作为输入特征

以前时间步长的观测值被构造成模型的输入特征。

这是多层感知器使用的经典的基于固定窗口的输入序列预测问题方法。相反,序列应该一次一个时间步地输入。

这种混淆可能导致您认为您已经实现了一个多对一或多对多序列预测模型,而实际上您只有一个时间步的单个向量输入。

2. 将时间步长作为输出特征

多个未来时间步长的预测被构造成模型的输出特征。

这是多层感知器和其他机器学习算法用于进行多步预测的经典固定窗口方法。相反,序列预测应该一次一个时间步地生成。

这种混淆可能导致您认为您已经实现了一个一对多或多对多序列预测模型,而实际上您只有一个时间步的单个向量输出(例如,seq2vec 而不是 seq2seq)。

注意:在序列预测问题中将时间步长作为特征是一种有效的策略,即使使用循环神经网络,也可能带来更好的性能(试试看!)。这里的重点是理解常见的陷阱,不要在构建自己的预测问题时欺骗自己。

进一步阅读

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

总结

在本教程中,您学习了使用循环神经网络进行序列预测的标准模型。

具体来说,你学到了:

  • 如何使用循环神经网络对序列预测问题进行建模。
  • 循环神经网络使用的 4 种标准序列预测模型。
  • 初学者在应用序列预测模型时常犯的 2 个最常见误解。

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

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

Long Short-Term Memory Networks with Python

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

...只需几行python代码

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

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

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

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

查看内容

使用 RNN 进行序列预测模型的温和介绍的 72 条回复

  1. Raan 2017 年 7 月 19 日 上午 4:34 #

    感谢您的文章。这非常有帮助。您有没有使用 RNN 预测多变量时间序列的例子?

    • Jason Brownlee 2017 年 7 月 19 日 上午 8:30 #

      我很快就会在博客上发布一篇,已经安排好了。

  2. mriazi 2017 年 7 月 20 日 上午 10:27 #

    嗨,Jason,

    非常感谢您的精彩文章和这个很棒的博客。我一直在关注您的博客
    几个月了,读过您关于 RNN 的大部分文章。
    正如您上面提到的,我正在努力正确建模我的时间序列预测问题。如果您能帮助我,那就太好了。
    我有一些传感器读数样本,每个样本都是一个包含 64 个时间步长的向量。我想使用 LSTM 来学习序列的结构并预测接下来的 64 个时间步长。
    我想我需要使用多对多模型来让模型学习输入并根据其所学到的内容预测输出(64 个值)。我正在尝试使用 LSTM 解决无监督异常检测问题。我想我正在努力解决的问题是,我希望我的模型学习我的长时序列中最常见的结构,而且我有点困惑我的输入应该是什么。
    抱歉,描述有点长。
    非常感谢

    • Jason Brownlee 2017 年 7 月 21 日 上午 9:26 #

      我建议将其建模为多对多监督学习问题。

      抱歉,我没有使用 LSTM 解决无监督问题的经验,我需要阅读一些资料。

  3. Paul 2017 年 8 月 2 日 下午 3:22 #

    你好,Jason。我总是感谢你发布了很棒的例子和帖子。
    我有一个简单的问题。
    对于预测/预报时间序列数据,多层神经网络和 RNN(LSTM)技术是预测未来数据的最佳方式吗?

    先谢谢您了。

    祝好,
    保罗

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

      没有最好的方法,我鼓励您评估一系列方法,看看哪种方法最适合您的问题。

  4. Gustavo 2017 年 8 月 12 日 上午 5:16 #

    序列学习和在线学习是一回事吗?有什么区别?

    • Jason Brownlee 2017 年 8 月 12 日 上午 6:54 #

      你好 Gustavo,

      不,序列是数据和预测问题的结构。

      与更简单的回归和分类一样,序列预测的学习可以是线上或线下进行的。

      这有帮助吗?

      • Gustavo 2017 年 8 月 14 日 晚上 10:30 #

        确实有帮助,谢谢,祝好

  5. hirohi 2017 年 8 月 21 日 下午 12:18 #

    在这篇文章中,Many2Many 和 One2Many 的情况下,当没有输入时,如何计算时间步的隐藏状态?具体来说,在 One2Many 中,如何在没有“X(2)”的情况下计算“u(1)”?我认为我们只能将 Y(1)、Y(2)、Y(3) 计算为一个向量。如果我错了,您能用图像描述或机器翻译等示例告诉我为什么吗?

    • Jason Brownlee 2017 年 8 月 21 日 下午 4:23 #

      很好的问题!

      通常会在序列的开头和结尾输入“开始序列”和“结束序列”来启动或结束序列输入或输出,以训练模型。

      我自己在图像描述模型和翻译中也使用了这种方法。

      • hirohi 2017 年 8 月 22 日 上午 11:33 #

        我研究了 many2many (encoder-decoder)。正如你所说,我们向 LSTM 输入“start”来计算“u(1)”。我的问题包括“计算‘u(2)’需要什么输入”。我的研究结果是,我们必须输入“y(2)”来计算“u(2)”。

        下面的图片更准确,对吗?
        http://suriyadeepan.github.io/img/seq2seq/seq2seq1.png

        • Jason Brownlee 2017 年 8 月 23 日 上午 6:38 #

          是的,那是一种方法。

          请记住探索问题的许多不同框架,以了解哪种最适合您的特定数据。

          • hirohi 2017 年 8 月 23 日 下午 12:30 #

            好的,谢谢!我会试试的!

  6. mrresearcher 2017 年 9 月 6 日 晚上 11:38 #

    我正面临一个一对多序列预测的问题,其中给定程序的一组输入参数,模型应该生成资源使用值随时间变化(CPU、内存等)。我有一些来自真实世界程序的示例,我已经尝试了简单的前馈网络,但现在我正在尝试寻找一对多序列生成问题的最新解决方案。到目前为止,我只找到了图像字幕的示例,但它是为预测单词而不是实值量身定制的。您是否知道生成一对多序列的任何最新解决方案?如果您知道,我将不胜感激任何参考文献。谢谢!

    • Jason Brownlee 2017 年 9 月 7 日 下午 12:56 #

      标题生成可以为你的问题提供一个很好的模型或起点。

      当然没有 CNN 前端,可能是一个大型 MLP 代替。

      这有帮助吗?我很期待听到你的进展。

  7. Sama 2017 年 11 月 30 日 上午 10:26 #

    尊敬的博士,请问我有一个重要问题。RNN 可以积累知识吗?例如,我是否可以持续训练网络以建立更大的知识,还是只能训练一次?如果可以持续学习,我该如何做到?

    • Jason Brownlee 2017 年 11 月 30 日 下午 2:46 #

      好问题。

      您可以在模型训练后更新它。

  8. Sharan 2017 年 12 月 29 日 下午 2:54 #

    Jason,

    我正在尝试将机器学习应用于我要解决的特定问题。

    以下是问题陈述:

    我有一个由许多功能块组成的系统。这些块通过事件相互通信。当系统运行时,会生成这些事件历史的日志。

    根据过去的经验,我知道哪些序列是有趣的。现在我想通过这些事件日志来查看是否有任何序列属于先验已知的有趣类别。需要注意的是,时间持续时间可以变化,而序列保持不变。
    例如,事件 1 t1 事件 2 t2 事件 3。在示例和实际序列之间,t1、t2 的值可以变化,但事件序列(事件 1 -> 事件 2 -> 事件 3)保持不变。

    手动执行此操作很繁琐,因为系统运行时可能会有数百万个此类事件。

    您能建议解决此问题的最佳方法吗?

  9. Arnold Loaiza 2018 年 4 月 9 日 上午 11:02 #

    你好 Jason,我有一个关于序列预测问题的问题,其中一位作者使用 LSTM 和密集层来利用这种组合的潜力。
    问题是使用过去 20 个时间单位来预测 T 个时间单位。例如,预测接下来 5 个时间单位的序列。因此,每个样本有 20 个时间单位,其中每个时间单位是一个包含 10 个特征的向量。

    X = (样本数, 20, 10)
    Y = (50)

    如您所见,每个样本对应的“Y”是一个包含 50 个单位的向量,它表示要预测的时间单位,一个时间及其对应的 10 个特征向量与剩余 4 个时间连接起来,总共 50 个。在 Keras 中,它将以这种方式呈现:

    model= Sequential()
    model.add(LSTM(500, input_shape=(20, 10)))
    model.add(Dense(10*5)) # 5 个时间,每个时间有 10 个特征向量。
    model.compile(optimizer= ‘rmsprop’, loss=’mse’)

    根据我在这篇文章中读到的,它将是一种向量形式,因为它将它的最后一个内部状态 H 作为输出发送,并且将其用作特征向量,该向量与接下来 5 个所需输出一起训练。令人惊讶的是,这个架构可以学习,它不是最好的,但它非常接近,它优于 SAE、ANN 等方法。最后,我用我的数据集测试了它,用于 10 个时间、15 个时间、20 个未来时间的各种输出序列,只需增加所需输出神经元的数量,就像魔法一样。

    您的意见会是什么?这是一个 Seq 到 Vector 吗?可以以更有效的方式完成吗?非常感谢。

  10. Shubhashis 2018 年 6 月 1 日 上午 12:04 #

    你好 Jason,

    我对“一对一序列预测模型随时间变化”和“多对多序列预测模型”的图表感到困惑。

    对于一对一模型,这里有一个 Keras 代码片段 –

    model = Sequential()
    model.add(LSTM(….., input_shape=(1, ….)))
    model.add(Dense(1))

    现在,根据“一对一序列预测模型随时间变化”的图表,我假设 Keras 的实现将是 –

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

    现在这似乎与“多对多序列预测”非常相似,其中输入特征的数量等于输出特征的数量。

    请让我知道我哪里理解错了。此外,对于图表“一对一序列预测模型随时间变化”,使用 Keras 的正确实现是什么?

    谢谢。

    顺便说一句,关于时间序列预测的精彩文章 🙂

    • Jason Brownlee 2018 年 6 月 1 日 上午 8:21 #

      “随时间变化”只是将相同的模型应用于每个时间步。模型没有区别,只是数据不同。

      • Shubhashis 2018 年 6 月 1 日 下午 1:30 #

        所以,如果一对一模型有多个时间步,你是说模型将是相同的,也就是说,模型将是 –

        model = Sequential()
        model.add(LSTM(….., input_shape=(1, ….)))
        model.add(Dense(1))

        但这表示只有一个时间步。多个时间步如何融入其中?

        • Jason Brownlee 2018 年 6 月 1 日 下午 2:49 #

          我明白了,我相信您正在描述一个多对多模型。

          • Shubhashis 2018 年 6 月 2 日 上午 12:23 #

            好的,如果是这样,那么我认为你所展示的“一对一序列预测模型随时间变化”的图表应该是一个“多对多”模型。

            因为我能想到的唯一逻辑的 Keras 实现是 –

            model = Sequential()
            model.add(LSTM(….., input_shape=(n, ….), return_sequence=True))

            这似乎不是一个“一对一”模型。而是一个“多对多”模型。

            请让我知道这是否清楚。

            如果您认为我提出的问题不足以描述问题,我可以给您发详细邮件。

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

            您的代码是多对多,而不是一对一。

  11. Joe wang 2018 年 6 月 16 日 上午 3:11 #

    嗨,Jason,

    感谢您的博客,它非常有帮助。我有一个关于多对一结构的问题,当我们尝试使用多对一模型进行预测时,我们还需要有一个序列作为输入(包含与训练数据相同的时间步长),我的理解正确吗?或者我们是否可以只输入一个时间戳的特征来获取预测?

    • Jason Brownlee 2018 年 6 月 16 日 上午 7:31 #

      这意味着多个时间步作为输入,然后多个时间步作为输出。

      它可以是实际的时间序列,也可以是句子中的单词,或者是按时间排序的其他观测值。

  12. Victor 2018 年 9 月 11 日 晚上 11:15 #

    嗨 Jason

    非常感谢您的精彩文章。

    我是这个领域的新手,我确信我还没有完全理解。

    如果我想利用神经网络的力量来预测温度,例如,使用每个时间帧的温度、压力、湿度等时间序列作为输入,那是什么网络?最好使用 LSTM RNN 吗?

    我正在考虑的模型架构是:

    1. 温度的时间序列值 T[],在时间 t 产生临时输出 O1。
    2. 压力的时间序列值 P[],在时间 t 产生临时输出 O2。
    3. 湿度的时间序列值 H[],在时间 t 产生临时输出 O3。
    4. 最后,O1、O2、O3 将用于在时间 t 生成最终输出,即模型的温度预测。

    我真的需要 4 个独立的神经网络吗?还是只需要 1 个,它接收所有时间序列特征?

    我真的需要 RNN 吗?我不需要将我的预测反馈到网络中,因为我可以持续地将最新的测量结果作为输入。

    非常感谢您花时间回答我的问题。

  13. Tunay 2018 年 10 月 3 日 晚上 7:02 #

    嗨,Jason,

    您能否推荐一些关于“在序列预测问题中将时间步长作为特征的策略”的读物?

    我很难找到相关的文献 🙂

    • Jason Brownlee 2018 年 10 月 4 日 上午 6:14 #

      不需要文献,这只是代码中的一个简单更改,将过去的观测值用作时间步长,而不是将它们用作时间步长上的特征。

      • Tunay 2018 年 10 月 7 日 下午 12:05 #

        哦,我明白了。我实际上只想将时间步长的观测值用作输出特征,而不使用 RNN。

        详细来说;所有输入特征都是针对 t=0 的,并且这些输入是与输出特征不同类型的数据。只有一种输出特征,并且它随时间变化。
        所以我有了
        X_1, X_2, … , X_n for t=0 and
        y_t=0, y_t=1, …, y_t=m

        我考虑过使用一对多 RNN(我不确定这是否是有效情况!?)
        但后来我想也许我也可以将不同的时间步长构造成不同的输出特征,并开发一个不使用 RNN 的简单前馈网络进行反向传播。

        你认为这是一个有效的策略吗?

  14. Javier 2019 年 6 月 17 日 下午 5:09 #

    Jason,您的文章和网站都非常棒。感谢您,我正在机器学习方面学到很多东西。

    我目前正面临一个序列预测问题,我有一个疑问。

    除了序列本身,是否可以使用其他数据来改进序列预测?例如,预测患者在医院的下一个症状,不仅使用其他用户的序列,还使用患者的年龄、性别等。

    我找到的方法总是只基于以前的序列进行预测,但如果我们有其他数据认为可以改善结果呢?

  15. skyrim4ever 2019 年 7 月 10 日 下午 3:18 #

    我对我所学到的东西有点困惑,所以我想寻求澄清。这是我的最后一个问题,此后不会再发垃圾邮件了!

    假设我们有时间序列 [10, 20, 30, 40, 50, 60, 70, 80, 90]。例如,每天的利润金额,所以这是一个单变量时间序列问题。我们想预测第二天的利润(一步预测),所以现在我将其转化为有监督的时间序列预测问题。

    在第一种情况下,它是一对一建模,因为我们有一个输入对应一个输出。训练阶段看起来像这样:
    [t] -> [t+1]
    [10] -> [20]
    [20] -> [30]
    [30] -> [40]

    [80] -> [90]

    在第二种情况下,根据您这里的博客,它是多对一的。一个输入序列对应一个输出。
    [t-2, t-1, t] -> [t+1]
    [10, 20, 30] -> [40]
    [40, 50, 60] -> [70]

    在第三种情况下,它还是多对一的吗,因为我们仍然有一个输入序列对应一个输出?
    [t-2, t-1, t] -> [t+1]
    [10, 20, 30] -> [40]
    [20, 30, 40] -> [50]
    [30, 40, 50] -> [60]

    [60, 70, 80] -> [90]

    到目前为止,我已经构建了第一种情况下的 LSTM 预测模型,结果还可以。但我正在考虑改进它,构建第三种情况下的 LSTM 预测模型,您认为这种建模有意义吗?第二种情况模型学习起来似乎更困难,因为它训练样本更少。

    • Jason Brownlee 2019 年 7 月 11 日 上午 9:44 #

      是的,那是多对一,多个时间步长对应一个时间步长。

      是的,这可能会带来更好的性能。还可以尝试其他模型,例如 CNN 和更多模型进行比较。

  16. Rao 2019 年 7 月 26 日 上午 4:43 #

    太棒了!我目前正在利用日志文件分析进行设备预测性维护。目标是通过分析日志消息的模式将日志消息聚类到不同的工作流(或活动中),并在偏离此类活动时预测错误。第一步是使用 BOW 方法聚类消息内容并为其分配 ID,这样我们现在就有了一系列 ID 而不是一系列消息。我目前正在探索 HMM 和神经网络模型以查找 ID 序列中的模式。

    任何关于形成或识别模式簇以形成工作流或改进消息 ID 形成方面的见解将不胜感激。

    • Jason Brownlee 2019 年 7 月 26 日 上午 8:32 #

      听起来是个很棒的项目。

      抱歉,我没有任何关于聚类的文章,我希望将来能写一些。

  17. Asad Khan 2019 年 10 月 12 日 晚上 8:26 #

    我们可以用这个来处理基因组序列吗?

  18. Ayman 2019 年 10 月 17 日 下午 6:19 #

    假设我有一些与每个序列相关的静态特征。(例如,我有温度/秒(序列)和海拔(静态))。我如何将我的静态特征融入到这些模型中?

    谢谢 Jason 🙂

    • Jason Brownlee 2019 年 10 月 18 日 上午 5:48 #

      或许是一个具有固定值的时间序列。或许作为模型的单独输入,例如多输入模型。

  19. Muthu 2019 年 12 月 18 日 上午 6:20 #

    嗨 Jason,非常感谢您的这篇文章。

    我有 n 个样本的输入数据,针对一个变量——1000 个时间步。因此我的输入形式是 [1 * 1000],我的输出是一个单一数字——假设是 85。

    1) 这是多对一问题吗?

    2) 哪个 LSTM 模型会更好?

    • Jason Brownlee 2019 年 12 月 18 日 下午 1:26 #

      可能是多对一。

      也许可以从这些模型开始尝试
      https://machinelearning.org.cn/how-to-develop-lstm-models-for-time-series-forecasting/

      • Firas Obeid 2020 年 8 月 28 日 上午 4:47 #

        Jason,
        这和张量切片序列的情况一样吗,假设形状是
        ((32, 400), (32, 400))
        其中 32 是批量大小,((, 400), (, 400)) 是序列长度 ((, IN(Xi), (, OUT(Yi))?

        谢谢!

        • Firas Obeid 2020 年 8 月 28 日 上午 5:21 #

          补充一点,模型正在更新其隐藏状态并在每个 X 中预测一个概率分布 399 次。

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

          抱歉,我不明白。张量切片序列是什么?

          • Firas Obeid 2020 年 8 月 28 日 上午 9:03 #

            抱歉,我没有详细说明;
            我使用 tf.data.Dataset.from_tensor_slices((X,y)) 将我的序列转换为以下格式

            我的 X 是一个长度为 400 的序列,对于每个 X,我的 Y 是 X 移动了一个索引的序列。
            X = []
            y = []
            for i in sequences
            X.append(i[0:-1])
            y.append(i[1:])
            X.shape, y.shape –> ((17433, 400), (17433, 400))

          • Jason Brownlee 2020 年 8 月 28 日 上午 10:21 #

            抱歉,我对那个函数不熟悉,我无法给您好的建议。

            也许可以尝试将您的问题发布到 Stack Overflow。

  20. Francis 2021 年 2 月 4 日 上午 1:35 #

    假设我想预测这张表中下一组字母的序列

    A B J Q E R
    T W U O Z X
    R O P J K L
    E D F V B T
    Q S D W E T
    V B N K M O
    E Z T V B T
    Q S A Q E T
    R Q A J S L
    E D X V Y T

    1) 神经网络需要多少个输入?
    2) 需要多少个隐藏层?
    3) 我必须为程序准备一个已初始化的文本字符值数组吗?

  21. Francis 2021 年 2 月 4 日 上午 1:37 #

    顺便说一下,我之前提出的问题是一个“多对多”问题——也就是说,对于字母序列的表格,预期有 5 种可能的结果……

  22. Michail G. 2021 年 6 月 18 日 下午 5:31 #

    嗨,Jason,

    在多对一预测场景中使用编码器-解码器模型有意义吗?

    我想知道解码器在一步预测中的作用是什么,因为我认为通过密集层解析编码器的输出可能类似。

    • Jason Brownlee 2021 年 6 月 19 日 上午 5:48 #

      也许可以尝试一下,并与其他方法进行比较,如果它能带来更好的结果就使用它。

  23. Raul Pereira 2021 年 7 月 2 日 下午 5:05 #

    嗨,Jason,

    感谢您通过您精彩的博客 machinelearningmastery.com 分享的所有信息和见解。

    我有一个问题,想知道我们如何使用神经网络来解决它。

    这是一个列表序列到序列的问题,其中输入是一个列表序列,每个列表都有固定数量的整数(例如 [3,4,2,7]),所以序列中有很多这样的列表(可以看作一个 2D 矩阵)。输出是给每个列表的一个标签(数字),例如,如果一个列表中整数之和在所有列表中最高,则其标签为 1;如果整数之和在所有列表中最低,则其标签为 0;如果整数之和介于最高和最低之间,则其标签是 0 到 1 之间的一个分数,具体取决于总和。总和越高,列表的标签越接近 1。将标签视为一个排序数字(可以在 0 到 1 之间,0 表示最低总和,而 1 表示最高总和)。

    您是否有任何示例或信息或任何见解,说明如何使用神经网络对上述问题进行建模,即训练神经网络根据每个列表中整数之和对列表序列进行排序?

    非常感谢 Jason!

  24. Derunderon 2022 年 6 月 24 日 晚上 9:06 #

    感谢你的精彩博客。

    不过,我有个问题想问。

    这些例子中很多似乎都想预测未来。我有一个情况,我有多天的数据,每天包含每个小时的数据点,即每个特征和目标变量每天有 24 个数据点。因此,每天的 24 个数据点都是一个时间序列。但是,每天与前一天不一定有任何关联。

    我实际上想的是输入每个特征的完整值序列(每小时 1 个数据点,共 24 个数据点),以预测目标变量的 24 个新值。因此,我不需要任何预测。我不需要在未来许多天或数周内延续某种趋势或曲线。我只是有每个特征的序列,包含 24 个时间相关的数据点,以预测 24 个目标值。

    哪种方法适合这种情况?因为我经常看到这些方法最终变成某种预测——这实际上不是我想要的。

    • James Carmichael 2022 年 6 月 25 日 上午 6:52 #

      你好 Derunderon…请澄清您的模型目标,以便我们更好地协助您。也许深度学习不是最好的选择。

      • Derunderon 2022 年 6 月 25 日 晚上 8:19 #

        你好,再次感谢您的快速回复。我将尝试详细说明。

        我有多天的数据。每天都有一个每小时的数据点,即每天有 24 个数据点。

        然后我有一个目标变量和几个预测变量。反过来,每个变量的这 24 个数据点都会创建某种每日曲线/结构。

        我想做的是,从每个预测变量输入一个值序列(24 个数据点,每小时 1 个)来预测目标变量的新值序列(又是 24 个新值)。因此,这不是预测,因为它会有输入,而且这些天之间不一定完全相关。在这种情况下,两天紧接着可能会非常不同。但有一天,和 100 天前的一天可能会非常相似。

        问题是输入是每个特征的 24 个数据点。

        原则上,可以为每个小时创建一个模型,然后总共有 24 个模型来预测每个小时。但是,我可能会想象从其他小时丢失一些信息,因为一天中的数据点是相关的。因此,每天本身不一定相关,但一天中的小时是相关的。

        我不确定最佳方法是什么。我只是觉得这听起来可能是一个解决方案,因为它可以将值序列作为输入。

  25. Derunderon 2022 年 6 月 25 日 晚上 8:19 #

    你好,再次感谢您的快速回复。我将尝试详细说明。

    我有多天的数据。每天都有一个每小时的数据点,即每天有 24 个数据点。

    然后我有一个目标变量和几个预测变量。反过来,每个变量的这 24 个数据点都会创建某种每日曲线/结构。

    我想做的是,从每个预测变量输入一个值序列(24 个数据点,每小时 1 个)来预测目标变量的新值序列(又是 24 个新值)。因此,这不是预测,因为它会有输入,而且这些天之间不一定完全相关。在这种情况下,两天紧接着可能会非常不同。但有一天,和 100 天前的一天可能会非常相似。

    问题是输入是每个特征的 24 个数据点。

    原则上,可以为每个小时创建一个模型,然后总共有 24 个模型来预测每个小时。但是,我可能会想象从其他小时丢失一些信息,因为一天中的数据点是相关的。因此,每天本身不一定相关,但一天中的小时是相关的。

    我不确定最佳方法是什么。我只是觉得这听起来可能是一个解决方案,因为它可以将值序列作为输入。

发表回复

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