老规矩,主要框架译自How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python~,中间加了一点点自己的理解。
长短时记忆网络(LSTMs)是一种流行且功能强大的循环神经网络(RNN)。它们很难配置和应用于任意序列预测问题,即使使用定义良好且“易于使用”的接口(如Python中的Keras深度学习库中提供的接口)也是如此。Keras中出现这种困难的一个原因是使用了TimeDistributed包装器层,并且需要一些LSTM层返回序列而不是单个值。
在本教程中,您将发现为序列预测配置LSTM网络的不同方法、TimeDistributed层所扮演的角色以及如何正确使用它。
完成本教程后,您将知道:
- 如何设计一个用于序列预测的一对一LSTM。
- 如何在没有TimeDistributed层的情况下设计多对一LSTM进行序列预测。
- 如何利用TimeDistributed层设计多对多LSTM进行序列预测。
让我们开始吧。
教程概述
本教程分为五个部分;它们是:
- TimeDistributed层
- 序列学习问题
- 用于序列预测的一对一LSTM
- 用于序列预测的多对一LSTM(没有TimeDistributed)
- 用于序列预测的多对多LSTM (TimeDistributed)
TimeDistributed层
LSTMs功能强大,但是很难使用和配置,尤其是对于初学者。附加的复杂性是TimeDistributed层(和前TimedistributedDense层),它被神秘地描述为一个层包装器:
这个包装器允许我们对输入的每个时间片应用一个层。
您应该如何以及何时在LSTMs中使用这个包装器?
当您搜索关于Keras GitHub问题和StackOverflow上的包装器层的讨论时,这种混淆就更加复杂了。
例如,在“When and How to use TimeDistributedDense”一文中,fchollet (Keras的作者)解释道:
TimeDistributedDese对三维张量的每个时间步长应用相同的Dense(全连接)操作。
如果您已经了解TimeDistributed层的用途以及何时使用它,那么这是非常有意义的,但是对初学者毫无帮助。
本教程的目的是通过一些工作示例来澄清使用带有LSTMs的TimeDistributed包装器的困惑,您可以查看、运行和使用这些示例来帮助您具体理解。
序列学习问题
我们将使用一个简单的序列学习问题来演示TimeDistributed层。
在这个问题中,序列[0.0,0.2,0.4,0.6,0.8]一次作为一个输入,然后必须作为输出返回,一次作为一个项。把它看作是学习一个简单的回声程序。我们给出0.0作为输入,我们希望看到0.0作为输出,对序列中的每一项重复执行。我们可以直接生成这个序列如下:
from numpy import array
length = 5
seq = array([i/float(length) for i in range(length)])
print(seq)
运行此示例将打印生成的序列:
该示例是可配置的,如果您愿意,稍后还可以自己处理较长/较短的序列。请在评论中告诉我你的结果。
用于序列预测的一对一LSTM
在我们深入研究之前,重要的是证明这个序列学习问题可以分段学习。也就是说,我们可以将问题重新构造为序列中每个项的输入-输出对的数据集。给定0,网络应该输出0,给定0.2,网络必须输出0.2,以此类推。
这是该问题最简单的公式,它要求将序列分解为输入-输出对,并对序列进行一次一步预测,然后在网络外部收集序列。输入-输出对如下:
LSTMs的输入必须是三维的(三维的结构是[样本批大小,滑窗大小,特征数量],详细介绍可以参考博客lstm数据格式与老鼠屎的旧博文Keras实战:基于LSTM的股价预测方法)。