用Keras实现简单Seq2Seq模型
- 背景
- 什么是 seq2seq
- Encoder–Decoder 结构
- 用Seq2Seq实现时间序列预测
背景
时间序列预测是一个普遍存在的问题。应用范围非常广泛,例如价格预测、天气预报、生物信号预测等等。
本文将利用Keras实现时间序列预测的RNN for encoder-decoder。
对于vanilla RNN以及LSTM和GRU的相关知识,可以从这里了解"Understanding LSTM Networks" by Christopher Olah。
什么是 Seq2Seq
Seq2Seq模型是RNN最重要的一个变种:N vs M(输入与输出序列长度不同)。
Seq2Seq 是一个 Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。
这个结构最重要的地方在于输入序列和输出序列的长度是可变的,可以用于翻译,聊天机器人,句法分析,文本摘要等。
Encoder–Decoder 结构
Sutskever团队和Cho团队分别都在2014年发表论文提出这种结构。不同的是Cho团队用的cell是GRU,而Sutskever团队用的是LSTM。
图中的 Encoder 和 Decoder 都只展示了一层的普通的 LSTMCell。从上面的结构中,我们可以看到,整个模型结构还是比较简单的。
EncoderCell 最后一个时刻的状态 作为 DecoderCell 的初始状态。
然后在 DecoderCell 中,每个时刻的输出将会作为下一个时刻的输入。以此类推,直到 DecoderCell 某个时刻预测输出结束。
用Seq2Seq实现时间序列预测
为了更好地理解Seq2Seq。我将用keras来实现解决一个时间序列预测问题——温度预测。气象数据资料来源于Max-Planck-Institute for Biogeochemistry in Jena, Germany.
在这个数据集中,有14个不同的量(如气温、气压、湿度、风向等)每十分钟记录一次,持续数年。最初的数据可以追溯到2003年,但是我们将数据限制在2009-2016年。这个数据集非常适合数值型时间预测问题。我们将用它来建立一个模型,该模型将最近几天的数据作为输入,并预测未来24小时的气温。
让我们先看一下这个数据集。
import os
data_dir = './data/'
fname = os.path.join(data_dir, 'jena_climate_2009_2016.csv')
f = open(fname)
data = f.read()
f.close()
lines = data.split('\n')
header = lines[0].split(',')
lines = lines[1:]
print(header)
print(len(lines))
['"Date Time"', '"p (mbar)"', '"T (degC)"', '"Tpot (K)"', '"Tdew (degC)"', '"rh (%)"', '"VPmax (mbar)"', '"VPact (mbar)"', '"VPdef (mbar)"', '"sh (g/kg)"', '"H2OC (mmol/mol)"', '"rho (g/m**3)"', '"wv (m/s)"', '"max. wv (m/s)"', '"wd (deg)"']
420551
首先将这420551条数据转成numpy数组
import numpy as np
float_data = np.zeros((len(lines), len(header) - 1))
for i, line in enu