处理 LSTM 中超长序列的技术

长短期记忆(LSTM)循环神经网络能够学习和记忆长序列的输入。

如果你的问题是每个输入都有一个输出,例如时间序列预测或文本翻译,LSTM效果很好。但当你拥有非常长的输入序列而只有一到少数几个输出时,使用LSTM可能会很困难。

这通常被称为序列标注或序列分类。

一些例子包括:

  • 对包含数千个单词的文档进行情感分类(自然语言处理)。
  • 对数千个时间步长的脑电图(EEG)进行分类(医学)。
  • 对数千个DNA碱基对序列的编码或非编码基因进行分类(生物信息学)。

这些所谓的序列分类任务在使用循环神经网络(如LSTM)时需要特殊处理。

在本文中,你将发现处理序列分类问题中长序列的6种方法。

通过我的新书 《Python LSTM》启动你的项目,书中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

How to Handle Very Long Sequences with Long Short-Term Memory Recurrent Neural Networks

如何处理长短期记忆循环神经网络中的超长序列
照片由 Justin Jensen 拍摄,部分权利保留。

1. 按原样使用序列

起点是按原样使用长序列数据,不进行任何更改。

这可能会导致训练时间过长的问题。

更令人烦恼的是,尝试在非常长的输入序列上反向传播可能会导致梯度消失,进而导致模型无法学习。

在实践中,对于大型LSTM模型,通常使用250-500个时间步长的合理限制。

2. 截断序列

处理长序列的常用技术是简单地截断它们。

这可以通过选择性地从输入序列的开头或结尾删除时间步长来完成。

这允许你将序列强制为一个可管理的长度,但会丢失数据。

截断输入序列的风险是,模型为做出准确预测而有价值的数据被丢失了。

3. 摘要序列

在某些问题领域,可能可以对输入序列进行摘要。

例如,在输入序列是单词的情况下,可以删除输入序列中频率高于特定阈值的单词(例如“and”、“the”等)。

这可以被表述为只保留其在整个训练数据集中排名频率高于某个固定值的观测值。

摘要化可以使问题聚焦于输入序列中最显著的部分,并充分减小输入序列的长度。

4. 随机抽样

一种不太系统的方法可能是使用随机抽样来摘要序列。

可以从序列中选择和删除随机时间步长,以将其减少到特定长度。

或者,可以选择随机的连续子序列来构建一个期望长度的新抽样序列,并根据领域要求注意处理重叠或非重叠。

这种方法适用于没有明显系统化缩短序列长度方法的情况。

这种方法也可以用作一种数据增强方案,以便从每个输入序列创建许多可能不同的输入序列。此类方法可以在可用训练数据有限时提高模型的鲁棒性。

5. 使用截断反向传播

梯度可以从最后几个时间步长的子集估计,而不是基于整个序列更新模型。

这被称为截断反向传播(TBPTT)。它可以大大加速LSTM等循环神经网络在长序列上的学习过程。

这允许将所有序列作为输入并执行前向传播,但只使用最后几十或几百个时间步长来估计梯度并用于权重更新。

LSTM的一些现代实现允许你指定用于更新的时间步长数量,这与作为输入序列的时间步长是分开的。例如

6. 使用编码器-解码器架构

你可以使用自动编码器来学习长序列的新表示长度,然后使用解码器网络将编码表示解释为期望的输出。

这可能涉及使用无监督自动编码器作为序列的预处理步骤,或者更近期的编码器-解码器LSTM风格网络,用于自然语言翻译。

同样,在学习长序列时仍然可能存在困难,但更复杂的架构可以提供额外的优势或技能,特别是当与一种或多种上述技术结合使用时。

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

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

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

特别提及和疯狂的想法

本节列出了一些尚未完全想清楚的附加想法。

  • 探索将输入序列分割成多个固定长度的子序列,并为每个子序列训练一个模型作为单独的特征(例如,并行输入序列)。
  • 探索双向LSTM,其中成对的LSTM分别拟合输入序列的一半,然后合并每个层的输出。从2个扩展到更多,以适当减小子序列的长度。
  • 探索使用序列感知编码方案、投影方法甚至哈希来以不太特定于领域的方式减少时间步长。

你有什么自己的疯狂想法吗?
请在评论中告诉我。

进一步阅读

本节列出了一些关于序列分类问题的进一步阅读资源。

总结

在本文中,你学习了如何在训练LSTM等循环神经网络时处理长序列。

具体来说,你学到了:

  • 如何使用截断、摘要和随机抽样来减小序列长度。
  • 如何调整学习以使用截断反向传播。
  • 如何调整网络架构以使用编码器-解码器结构。

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

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

Long Short-Term Memory Networks with Python

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

...只需几行python代码

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

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

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

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

查看内容

93条对如何处理长序列的LSTM的回复

  1. Pranav Goel 2017年6月27日 凌晨1:32 #

    你好 Jason,

    感谢这篇博文!我认为TBPTT可能是一种非常合适的方法。你知道Keras是否有类似于Theano的‘truncate_gradient’参数吗?

    谢谢!

  2. Owen 2017年6月27日 上午5:03 #

    “例如,在输入序列是单词的情况下,可以删除输入序列中频率低于特定阈值的单词。”

    我认为应该是相反的。极低频率的词可能是句子的核心,而高频率的词可能只是无意义的。例如,“the”无疑是最常见的词,但它无法告诉你任何信息。然而,“covfefe”这样的词可能很重要。

    • Jason Brownlee 2017年6月27日 上午8:36 #

      我同意这是一个错误,已修正。谢谢Owen!

      • Michel Lemay 2017年7月4日 上午1:09 #

        在实践中,需要截断频率分布的两端。常识告诉我们,高频词往往是停用词。然而,有意义的词在这个列表中很早就出现了。因此,在定义顶部词语的良好阈值时应谨慎。在另一端,长尾词中,大多数低频词属于拼写错误词、晦涩术语、唯一ID或产品编号等类别。在这里,我们使用几种方法来清理列表:将局部IDF与通用英语IDF进行比较,并选择具有显著差异的词语;使用无监督算法通过删除词语来测试其在给定任务中的有用性,等等。

  3. Ben 2017年6月30日 上午5:01 #

    嗨 Jason
    谢谢你的网站
    你有没有使用LSTM进行符号序列预测的例子?
    谢谢

    • Jason Brownlee 2017年6月30日 上午8:18 #

      你的意思是什么?能举个例子吗?

      • Ben 2017年6月30日 下午6:24 #

        谢谢你的回复。
        例如,有这个序列
        1,2,2,3,1,6,4,5,7,1,3,2,2
        我们期望未来出现什么符号?

        谢谢

        • Jason Brownlee 2017年7月1日 上午6:30 #

          是的,我建议使用独热编码来编码整数,只要你知道输入/输出的范围。

  4. buzznizz 2017年8月4日 晚上9:39 #

    嗨 Jason

    你有没有使用小波将时间序列转换为时域和频域,然后将其作为输入的经验?

    此致

  5. allonbrooks 2017年11月21日 晚上8:25 #

    如果我的句子长度超过2000,我想用LSTM训练情感分析模型,我该如何处理这种情况?

    • Jason Brownlee 2017年11月22日 上午11:11 #

      尝试本文中的每种方法,看看哪种方法能产生技能最佳的模型。

  6. Saeid 2017年11月22日 下午2:16 #

    嗨,Jason,

    我有一个关于时间步长的问题。在我所有的样本中,序列都以以下形式出现:

    X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3 … … … X100 Y100 Z100

    那么在我的输入形状中,我假设时间步长是100,特征是3。这是对的吗?还是时间步长在这种情况下是300?

    • Jason Brownlee 2017年11月23日 上午10:25 #

      我不确定我是否明白了,你想要预测什么,你想要建模的输入和输出是什么?

      • Saeid 2017年11月26日 上午11:43 #

        我有一个分类问题。我的标记数据特征是人们在房间里行走轨迹的x-y坐标和方向角(theta)。数据是时间序列,有2000个人(样本)。标签是0和1,表示一个人是否有特定的意图。换句话说,数据的表格表示将是

        X1, Y1, theta1, X2 , Y2 , theta2 , … ,X100,Y100,Theta100, Label
        Person1 1 -1 3 1.1 -1.1 3.1 ….. 10 -10 , 3.9 0

        Person2 5 9 -2 5.1 9.1 -2.1 …. 15 19 , -2.6 1
        …. … …. … … … … … …. … 0
        ….. …. …. … … …. … … … … 1

        Person2000 …. …. … … … … … … …. 0

        由于有三个特征,并且我每个样本都有这些特征的历史记录,我正在尝试使用LSTM来建模这个问题。到目前为止,我已经实现了一个LSTM层和一个带Sigmoid激活的Dense层。但我最担心的是输入数据的重塑是否正确。所以我的输入形状,假设对于上表是(2000,100,3),但我认为也许时间步长是100*3?

        希望我能解释清楚,非常感谢您对输入形状的看法和任何一般的建议。

        谢谢

  7. JJ 2017年11月23日 上午10:36 #

    嗨,Jason,

    我关注你的博客已经有一段时间了,觉得非常有帮助。我对LSTM有些困惑,并且可用的各种来源并没有真正解决它,我希望你能解决,因为你的解释非常清晰。

    我的困惑与LSTM的“记忆”以及在现实世界示例中如何将数据馈送到它有关。假设我正在对一个人的单通道EEG进行分类(总共N个人)。假设我们每个人有100个时间点(为了简单起见),还有一个标签,说明该人在这100个时间点期间是否专心。对于一组新的时间点,我想说这个人是否专心。

    如果我使用20个时间步长的LSTM。那么记忆是基于什么的?它是否意味着它只能记住那20个时间步长内发生的事情?或者它会保留之前馈送到它那里的一段过去时间步长的记忆?训练样本现在是否简单地变成了20个时间步长的块,而LSTM可以回忆起之前块中的内容?因为在我看来,当人们谈论例如通过LSTM处理完整个文档后,从文档末尾预测下一个单词时,他们提到LSTM很棒,因为它们甚至可以记住文本开头处的单词来做出这样的预测。所以在我看来,它似乎有来自之前时间步长块的记忆。

    我的困惑在于,如果是这样,那么回到我们的EEG示例,LSTM可能会使用来自完全不同的人的EEG的记忆来进行预测?LSTM是否有区分提供时间序列数据的个体是不同的?

    谢谢你

  8. Tseo 2017年12月9日 晚上9:53 #

    你好!感谢你的文章!很喜欢!

    我有一个问题:我想预测不同序列中最后n个时间步长。我已经训练了网络,输入如下:
    输入时间步长:X(t-n).. X(t-1), X(t)
    输出时间步长:X(t-n+1).. X(t), X(t+1)

    训练和验证的损失几乎为零,但下一个时间步长 t+2, t+3..t+n 非常差。

    也许我应该使用其他方法?我相信网络正在记忆序列。

    谢谢!

  9. Rui 2017年12月21日 上午3:23 #

    一套不错的想法!我读过你关于结合卷积网络和LSTM的一篇文章。在那个例子中,我理解卷积运算被应用于每个时间样本(对于多变量或图像序列)……我想知道是否可以将卷积运算应用于序列步骤?

    提前感谢(也感谢所有高质量的信息☺)

    • Jason Brownlee 2017年12月21日 上午5:29 #

      当然。你可以将一批时间步长通过CNN,然后CNN可以从这些块中提取特征给LSTM。可能是按小时或天批处理。我认为这不会有效。试试看。

  10. Rahul 2018年1月20日 上午1:36 #

    我有一个关于长文本序列的问题,其中所有字符都以特定方式进行了更改。因此,我无法使用任何标准的嵌入。由于文本大约有1000个字符,使用LSTM非常耗时。我尝试使用不同核大小的CNN,然后将其传递给LSTM(仍然非常耗时)。有什么更好的方法(我喜欢随机抽样方法;我会将数据分成4部分并增加样本量)?

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

      我不确定我是否有足够的信息或能深入了解,以便给你好的建议。抱歉。

  11. Daniel 2018年1月31日 下午2:27 #

    我一直在努力理解如何准备数据来喂给LSTM。在我的例子中,我有一组文本,每个文本有一个或多个标签。为了简单起见,让我们假设我只有三个文本:

    1) “我在房子里有一辆绿色的车” (8个词)
    2) “香蕉是黄色的,苹果是绿色或红色的” (9个词)
    3) “我叫邦德,詹姆斯·邦德。谢谢你问,我的朋友” (11个词)

    我目前正在创建一个形状为(3个样本,11个时间步长,26个特征)的3D数组,其中11是最大文档中的单词数,26是所有文档中的唯一单词数。

    单词已被标记化,因此每个特征都是一个26D数组,其中“1”表示当前单词。

    句子也被标记化,每个句子都变成一个11D数组,其中每一行包含一个单词向量。

    我的目标是将这个3D数组馈送到模型,并尝试从其他文本中预测标签。

    问题是……我不知道将文档/单词转换成这样是否正确。大多数LSTM示例都使用预处理过的文本数据,所以我无法知道他们是如何处理原始文档的。我似乎没有正确使用时间步长参数……

    你能指点一下吗?

    非常感谢!真的很喜欢你的所有文章!

    • Jason Brownlee 2018年2月1日 上午7:15 #

      单词需要映射到整数。然后填充到相同的长度。然后映射到一个3D形状,可能使用某种编码(独热编码或词嵌入)。

      我在博客上有很多关于文本准备用于LSTM的例子,可以试试搜索。

  12. Marco Graziano 2018年3月2日 上午2:54 #

    有人尝试过使用1D卷积作为初步步骤来缩短非常长的序列吗?有例子可以参考吗?

    • Jason Brownlee 2018年3月2日 上午5:36 #

      有趣的想法。

      同样,也可以使用自动编码器来实现相同目的。

    • DanielDeng 2018年4月28日 下午1:08 #

      我第一次尝试了这个方法,它奏效了,但它的性能不如完全使用CNN层。那么RNN在CNN之上有什么意义呢?

  13. Rg 2018年3月8日 上午8:12 #

    我们可以用LSTM训练时间序列吗,其中每个观测值都有不同大小的时间步长?

    例如

    第一个观测值:50个输入
    第二个观测值:60个输入
    第三个观测值:30个输入
    以此类推。所有观测值的输入通道都相同。

    • Rg 2018年3月8日 上午8:23 #

      抱歉,愚蠢的问题,我可以使用批大小为1,我猜?对吗?

    • Jason Brownlee 2018年3月8日下午2:53 #

      是的,但你必须将所有样本填充到相同的长度,并使用一个掩码层来忽略零值。

  14. Andrew Medlin 2018年7月19日下午6:12 #

    我读过几篇关于用LSTM训练多变量时间序列数据的文章,并且有一个大致可行的LSTM实现,但没有一篇文章完全解决了我的这类数据训练策略的问题。

    我的数据是大量人群(1000多人)的医疗ECG数据。对于每个人,我都有一个包含数千次测量的时序列,每个样本由12个变量(特征)组成。测量是在恒定的采样率下进行的,所以在我输入中可以省略时间值。

    每个ECG样本的长度都不同。有些人可能有1000个时间步长,另一些人可能有1500个,等等。每个序列的长度都不同。

    提供的训练的预期输出(标签)数据是代表每个时间步长分类的概率分布。目前,我只有两个类别,所以我的标签是独热编码的,要么是[0 1],要么是[1 0]。其中一个类别的标签比另一个更占主导地位。

    我认为25到30个样本的时间窗口足以捕捉给定序列内的时间相关性,所以这是我LSTM输入中的time_steps数量。我的样本数量(> 1000)太大,无法一次性全部训练,所以我选择了一个256的批次大小。因此,我的LSTM输入形状是(256, 25, 12)。

    我的问题是如何正确地对这些时间序列进行子采样以进行训练。由于我的序列长度不同,我无法统一地塑造每个序列。目前,我一直在从256个随机人群中随机抽取25个time_steps(顺序的),并将其作为一个训练批次,重复进行直到损失“足够低”。

    我是否应该对每个样本序列使用滑动窗口并在此基础上进行训练?或者我是否应该对每个序列进行子采样,并将子样本(顺序的或其他的)排成行?我觉得我不想让一个训练批次只包含一个人的数据,我担心网络可能会过度学习该个人,然后在换人的时候损失会再次跳升。

    • Jason Brownlee 2018年7月20日上午5:55 #

      你好,Andrew。

      第一个问题是,形状的第0维不是批次大小,而是样本总数。批次大小仅用于在训练期间指定模型,而不是用于重塑数据。输入数据必须具有形状[样本数,时间步长,特征数]。

      25个时间步长对于一个有1500个时间步长的序列来说似乎太短了。也许可以尝试200或400?

      你可以将每个序列分割成多个子样本,例如,1500个时间步长可以分成3个样本,每个样本包含500个时间步长。

      作为分类问题,我鼓励你尝试CNN-LSTM,甚至直接使用CNN或ConvLSTM。我发现它们在时间序列分类方面达到了最先进的水平,并且我已计划发布相关主题的文章。

      这有帮助吗?

      • Andrew Medlin 2018年7月20日上午9:17 #

        这确实有帮助,谢谢。如果我对此应用有更多问题,我会在这个帖子里继续跟进。

      • VISWA 2020年2月11日上午1:28 #

        @jason。我也在做一个类似ECG的序列预测问题。但我的数据集每个序列的时间步长从6500到20k不等,有4个特征。

        我有一个训练网络的想法:

        将序列分成子序列,并将每个子序列的单个标签分配给一个Stateful LSTM。

        为每个fit单独使用一个序列进行训练(为每个序列单独重新训练模型),并在每次序列fit后重置lstm状态。

        或者有什么其他方法可以在中间重置lstm状态吗?

        • Jason Brownlee 2020年2月11日上午5:14 #

          干得不错。

          您可以使用有状态LSTM并手动控制何时重置状态。

  15. Nick 2018年9月4日下午10:42 #

    感谢您的这篇博文,Jason!

    我想问一下,您是否看到过关于“自然语言处理中包含数千个单词的文档情感分类”的示例代码。

    我的想法是,通过序列模型在Keras中对长文本(新闻)进行分类,以预测一个事件(二元分类)。我还没有找到关于这方面的任何工作,我想知道从技术/统计学的角度来看这是否有意义?

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

      当然,尽管通常会尽一切努力来减小输入的大小以加快模型训练速度。

      CNNs速度很快,而且表现良好,甚至是顶尖水平。

      我有很多教程,可以在博客上搜索。

  16. Faisal 2018年10月8日下午9:23 #

    嘿,我正在使用健康数据进行分类,采用深度学习技术。我有哪些时间序列数据可以使用的混合模型?我可以使用CNN LSTM,但是我的数据没有标签,那么可以使用哪种混合深度学习技术来分类无标签的时间序列数据呢?

    • Jason Brownlee 2018年10月9日上午8:43 #

      我建议测试一系列方法,以发现最适合您的特定数据集的方法。

  17. Renan Cunha 2018年10月18日下午10:36 #

    对于seq2seq任务,600个时间步长是否是LSTM可行的任务?

  18. Aaron 2019年3月12日上午11:31 #

    您是否有关于序列限制的论文/研究?训练时间长几乎是显而易见的,但梯度消失——长序列为什么会导致梯度发散?

  19. nandini 2019年3月19日下午4:42 #

    dropout和rnn_dropout在keras层中的区别是什么?我该如何决定网络中dropout的数值?是否有任何过程可以决定在层中应该使用多少?

    提前感谢

  20. M.Hamadan Ghani 2019年4月28日下午1:53 #

    “探索双向LSTM,其中每对LSTM都在输入序列的一半上进行拟合,并将每层的输出合并。从2个扩展到更多,以适当减少子序列的长度。”

    Jason,但如何实现将每对LSTM拟合到输入序列的一半的过程呢?

    先谢谢您了。

  21. Paul Wandeseer 2019年7月26日上午4:00 #

    您是否有展示RNN/LSTM长度限制的论文?我找不到好的参考,每个人总是写“实际上,500个时间步长的限制是一个好的经验法则”。

  22. wezen 2019年8月30日上午12:21 #

    你好,Jason。
    如果使用Timeserie Generatior来拟合LSTM,是否需要截断序列或使用其他样本分离技术?还是Generatior会为您处理?
    谢谢

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

      是的,我认为这没有区别。

      • wezen 2019年8月30日下午7:33 #

        谢谢您,非常感谢您的博客。它非常有帮助。

  23. Gordon Kwok 2019年10月4日下午8:58 #

    你好,Jason。
    我正在通过API调用顺序对恶意软件进行分类。问题是一些样本具有非常长的序列(最长的达到了170万次调用)。我应该使用CNN还是FastText?有什么算法可以总结序列吗?
    期待您的回复。

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

      也许您可以使用领域知识来分割、截断或重新定义长序列?

      • Gordon Kwok 2019年10月14日下午10:35 #

        非常感谢!我会按照您说的那样尝试。

  24. Kai Gu 2019年11月7日上午3:52 #

    感谢您的教程,对于初学者来说非常有用且易于理解。

    我正在处理来自“触发系统”的时间序列数据

    系统由脉冲信号触发并记录一段固定长度的1D数据及其时间戳。

    不同种类的脉冲显示出不同的周期性模式,因此我想用LSTM网络对不同种类的脉冲进行分类。

    我在处理LSTM网络的输入时遇到麻烦。

    时间戳的精度达到亚纳秒级别,我正在考虑将时间线分割成纳秒,并将没有脉冲的插槽用零填充。但是脉冲的重复周期大约是几毫秒(所以LSTM的时间步长大约是几毫秒)。在这种情况下,我将得到一个非常长的输入,而且输入可能非常稀疏。(有些脉冲的发生非常频繁,间隔只有几纳秒,所以我不能粗略地将时间线分割成10纳秒或微秒。)

    您是否有类似的经验或建议?先谢谢您!

    • Jason Brownlee 2019年11月7日上午6:47 #

      不尽然,或许可以头脑风暴一系列不同的问题框架,并测试每一种,看看哪一种最能将问题的结构暴露给学习算法。

      将结果与持久性等朴素模型进行比较,并确保测试MLP、CNN和混合模型等替代方案。

      • Kai Gu 2019年11月8日上午12:57 #

        感谢您的回复!

        实际上,我已经实现了一些简单的MLP CNN结构来挖掘波形中的一些特征。效果还不错。

        但是领域知识和专家告诉我,通过仅分析1D数据切片,我实际上错过了某些宏观周期性模式。这就是为什么我考虑通过使用LSTM网络来包含这些时间信息。

        但总的来说,非常感谢您的建议!

  25. Austin Bernard 2020年1月29日下午2:18 #

    我有一个问题,我的数据包含一年中的每一天天气和温度的输入。我的目标是预测给定年份的特定花何时会开。这个问题属于这些类别吗?我为此问题苦恼了很久,似乎找不到解决方案。因为我有一个相当长的输入序列,365天,只有一个输出,那就是开花的那一天。任何指向正确方向的帮助都将受到赞赏。我还是机器学习的初学者,不确定我的问题是否属于此类。

  26. Krithika 2020年3月2日下午9:17 #

    我有一个ECG时间序列数据集。我需要预测未来信号的标签(正常信号-'0'或异常信号-'1'),即,在不预测未来信号值的情况下,我只需要直接对其进行分类。这可以用CNN或LSTM或两者来完成吗?我在选择模型的损失和优化器时遇到了困难。我的验证损失和准确率似乎从一开始就保持不变,而我的训练损失和准确率在下降一段时间后然后变为“nan”。您对此有任何想法如何纠正吗?

  27. Krithika 2020年3月2日下午9:50 #

    你好 Jason,

    我正在处理ECG时间序列数据,该数据有2个特征信号。频率率为250个样本,每个信号被标记为正常或异常。我的任务是预测未来信号的标签(0-正常,1-异常)。因此,我不需要预测下一个信号值,而是需要分类未来信号是正常的还是异常的。

    在这种情况下,哪种模型更合适?是LSTM还是CNN,还是两者都适用?
    此外,在训练我的模型时,验证损失和准确率从一开始就保持不变,而训练损失下降,准确率在一段时间内增加,然后变为NaN。

    我在选择模型的损失(应该是二元交叉熵吗?)和优化器方面有些困惑。

    我有一个长度为245的滑动窗口,因此我的输入形式是(nx245x2),而我的输出是(nx1),其中我的输出标签是下一个信号的标签(下一个信号的第245个标签值)。即,inp_seq = X_train[0:245],out_label = label[489]。

  28. PorkPy 2020年3月18日上午2:42 #

    嗨,Jason,

    棒极了的帖子。

    我正在考虑使用LSTM来输入机器人轨迹数据序列。

    我的理论与使用多个样本来确定速度和加速度信息类似,但我需要更多。
    我需要学习代理来学习采取特定轨迹以到达某个位置的重要性,因为不同的轨迹会产生非常不同的结果。

    我计划使用机器人位置数据序列,其中最近的数据最重要,并将包含约5个连续数据点,并与其他几个间隔较远但能提供过去轨迹见解的早期数据点连接起来。

    基本上,越往回看,需要的数据点越少,因为我认为,随着时间的推移,历史对当前位置的重要性越小,但仍然相关。

    我还没有决定如何最好地切分我的数据,或者LSTM是否适合这个问题。
    如果有一个LSTM可以接受所有轨迹数据,但有一个超参数允许我或它自己调整历史数据的重要性,那就太好了。

    有什么想法?

    祝好,

  29. Sophia 2020年6月24日上午3:24 #

    Jason您好,我有一些问题。如果我将一个由LSTM单元组成的序列输入编码器,我希望通过解码器生成一些词语并将它们插入到输入序列中。我能否将一个解码器连接到t时间步的LSTM单元,再将另一个解码器连接到2t时间步的LSTM单元,依此类推?也许,就像您的疯狂想法一样,“探索将输入序列分成多个固定长度的子序列,并使用每个子序列作为单独的特征(例如,并行输入序列)来训练模型”,我可以训练三个编码器-解码器在三个子序列上,然后将这三个生成的词语与三个原始输入连接起来形成一个新的序列?
    您是否知道相关信息和研究?
    非常感谢!

    • Jason Brownlee 2020年6月24日上午6:37 #

      不,我认为您必须手动完成,例如,从数据和预测构建样本。

      • Sophia 2020年6月24日上午7:13 #

        那么,将解码器连接到每个时间步长的LSTM单元是否实用?

      • Sophia 2020年6月24日上午8:33 #

        您能告诉我这个方法是否正确吗?这就是我在一个模型架构中看到的,但没有验证和具体的实现。我长期以来都不知道该怎么办。

        • Jason Brownlee 2020年6月24日下午1:27 #

          我不知道,因为我不太懂,抱歉。也许可以开发一个原型来看看您的想法是否可行?

  30. QAYSAR 2020年9月13日上午12:31 #

    您好,先生。
    我们可以使用LSTM网络进行EEG分类吗?
    如果可以,那么输入格式应该是什么?

  31. John 2020年12月30日上午1:10 #

    感谢您的分享!非常有用。我还有一个问题。如果我想建立一个使用LSTM的预测模型,训练数据集可以通过随机采样然后排序来生成吗?

    • Jason Brownlee 2020年12月30日上午6:41 #

      不客气。

      也许可以尝试一下,看看它是否比截断更有效,并与MLP进行比较。

  32. Noam 2021年4月1日上午4:27 #

    如果你有许多(比如300个)输入,每个长度为10000。

    你能否将每个输入分割成100个块,每个块长度为100,然后将其输入到LSTM中,LSTM接受长度为100的输入,然后将下一个批次的c_n和h_n作为输入馈送给LSTM?

    也就是说,每个批次将包含例如16个不同序列的样本,每个样本的长度为100个时间帧,我们需要100个这样的批次来完成16个样本,总共100 * (300/16)个批次。

    这有意义吗?

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

      也许吧。尝试一下,看看它是否比截断等更有效。

  33. Pablo 2023年8月6日下午7:45 #

    Jackson您好,感谢您提供如此出色的内容。我有一个问题,如果我有非常长的数据序列,并且被迫使用窗口处理,您如何确保模型在训练时考虑到每个窗口属于特定的序列/ID?预测时呢?我见过各种方法,例如使用受控批次训练,并在ID更改时重置模型的状态,但这会意味着批次大小为1,并将训练速度减慢几天。您知道其他方法吗?再次感谢!

  34. Pablo 2023年8月6日下午7:46 #

    抱歉,Jason ????

留下回复

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