在分段输入上实现RNN / LSTM

时间:2017-10-24 03:15:10

标签: deep-learning lstm rnn

我正在设计一个深度学习模型,用于对长度为 m 2 的输入进行分类,并考虑到以下多层LSTM模型:

图片(发布图片的代表不足):https://i.imgur.com/rUsvu0a.png

注意LSTM分别是m 2 -to-m 2 和m 2 -to-one。然而, m 2 很大,使得LSTM容易受到梯度消失/爆炸的影响。我想把输入分成大小为 m 的段,允许LSTM是m-to-one而不是m 2 -to-one:

图片:https://i.imgur.com/WQXGGng.png

  • 如何在Tensorflow或Keras中实现这一点?我找不到任何LSTM文档,每个输入样本接受多个段。
  • 是否有比我提议的模型更好的模型,用于处理可以分段的长序列输入?

1 个答案:

答案 0 :(得分:0)

  • 您如何在Tensorflow或Keras中实现此目标? 通过反复重定。假设您的数据组织为[B, m^2]。因此,您可以按照对[B, m, m ]的建议进行重塑。然后,您通过重塑为B,使B*m明确,假装您的批处理不是由[B*m, m, 1]个样本组成,而是1个段,因为我大多数RNN实现可见(包括TF / Keras)每个时间步需要显式功能。您通过LSTM运行此命令并得到[B*m, k],其中k是LSTM的宽度。现在,您可以重新调整为[B, m, k]的形状,并可以通过另一个LSTM来运行它,接收到[B, j],其中j是第二个LSTM的宽度。然后,您可以Dense()sigmoid进行二进制分类或执行任何任务。

  • 是否存在比我提出的模型更好的模型,可以处理可分段的长序列输入?只有知道数据,才能决定。但是从我的角度来看,您的建议是(1)已经不平凡了。最好从琐碎的基线开始,以了解您的期望。并且(2),您的提案会以m的倍数引入数据中断。只有您知道数据,但是此IMHO人为地限制了您的第一个LSTM可以从数据中挖掘的模式数量。

如果这是我的问题(现在我真的在边缘化所有与数据相关的想法),我会这样做:

  1. 一个LSTM。当然,梯度将消失,但是可以通过梯度剪切来缓解爆炸。超级简单,可以在线应用。
  2. 双向LSTM。,您牺牲了在线处理来获得更好的表示,尤其是。序列的初始部分。应该可以帮助您的模型变得更加准确,也可以帮助您更好地了解对于任务而言什么(不重要)。
  3. 添加均值池。通过均值池LSTM的输出(而不是仅获取最后一个),可以有效地为每个时间步提供目标信息,这将再次有助于挖掘有用的模式,这次是从中间某个地方,通过前向或后向LSTM都无法实现的可怜回头。
  4. 1-d卷积。一旦有了均值池,就可以从技术上用任何本地体系结构替换LSTM,例如1-d CNN。根据您的数据和其中有用信息的范围,这是否有帮助。无论如何,CNN通常更容易训练,因为您获得了非常好的并行化属性,因此在训练和测试阶段都大大提高了速度。