限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

使用 TensorFlow 的递归神经网络(LSTM)进行序列预测

  • 2016-07-06
  • 本文字数:4120 字

    阅读完需:约 14 分钟

本篇文章介绍使用 TensorFlow 的递归神经网络(LSTM)进行序列预测。作者在网上找到的使用 LSTM 模型的案例都是解决自然语言处理的问题,而没有一个是来预测连续值的。

所以呢,这里是基于历史观察数据进行实数序列的预测。传统的神经网络模型并不能解决这种问题,进而开发出递归神经网络模型,递归神经网络模型可以存储历史数据来预测未来的事情。

在这个例子里将预测几个函数:

  • 正弦函数:sin

  • 同时存在正弦函数和余弦函数:sin 和 cos

  • x*sin(x)

首先,建立 LSTM 模型,lstm_model,这个模型有一系列的不同时间步的 lstm 单元(cell),紧跟其后的是稠密层。

复制代码
def lstm_model(time_steps, rnn_layers, dense_layers=None):
def lstm_cells(layers):
if isinstance(layers[0], dict):
return [tf.nn.rnn_cell.DropoutWrapper(tf.nn.rnn_cell.BasicLSTMCell(layer['steps']), layer['keep_prob'])
if layer.get('keep_prob') else tf.nn.rnn_cell.BasicLSTMCell(layer['steps'])
for layer in layers]
return [tf.nn.rnn_cell.BasicLSTMCell(steps) for steps in layers]
def dnn_layers(input_layers, layers):
if layers and isinstance(layers, dict):
return skflow.ops.dnn(input_layers,
layers['layers'],
activation=layers.get('activation'),
dropout=layers.get('dropout'))
elif layers:
return skflow.ops.dnn(input_layers, layers)
else:
return input_layers
def _lstm_model(X, y):
stacked_lstm = tf.nn.rnn_cell.MultiRNNCell(lstm_cells(rnn_layers))
x_ = skflow.ops.split_squeeze(1, time_steps, X)
output, layers = tf.nn.rnn(stacked_lstm, x_, dtype=dtypes.float32)
output = dnn_layers(output[-1], dense_layers)
return skflow.models.linear_regression(output, y)
return _lstm_model

所建立的模型期望输入数据的维度与(batch size,第一个 lstm cell 的时间步长 time_step,特征数量 num_features)相关。
接下来我们按模型所能接受的数据方式来准备数据。

复制代码
def rnn_data(data, time_steps, labels=False):
"""
creates new data frame based on previous observation
* example:
l = [1, 2, 3, 4, 5]
time_steps = 2
-> labels == False [[1, 2], [2, 3], [3, 4]]
-> labels == True [2, 3, 4, 5]
"""
rnn_df = []
for i in range(len(data) - time_steps):
if labels:
try:
rnn_df.append(data.iloc[i + time_steps].as_matrix())
except AttributeError:
rnn_df.append(data.iloc[i + time_steps])
else:
data_ = data.iloc[i: i + time_steps].as_matrix()
rnn_df.append(data_ if len(data_.shape) > 1 else [[i] for i in data_])
return np.array(rnn_df)
def split_data(data, val_size=0.1, test_size=0.1):
"""
splits data to training, validation and testing parts
"""
ntest = int(round(len(data) * (1 - test_size)))
nval = int(round(len(data.iloc[:ntest]) * (1 - val_size)))
df_train, df_val, df_test = data.iloc[:nval], data.iloc[nval:ntest], data.iloc[ntest:]
return df_train, df_val, df_test
def prepare_data(data, time_steps, labels=False, val_size=0.1, test_size=0.1):
"""
Given the number of `time_steps` and some data.
prepares training, validation and test data for an lstm cell.
"""
df_train, df_val, df_test = split_data(data, val_size, test_size)
return (rnn_data(df_train, time_steps, labels=labels),
rnn_data(df_val, time_steps, labels=labels),
rnn_data(df_test, time_steps, labels=labels))
def generate_data(fct, x, time_steps, seperate=False):
"""generate data with based on a function fct"""
data = fct(x)
if not isinstance(data, pd.DataFrame):
data = pd.DataFrame(data)
train_x, val_x, test_x = prepare_data(data['a'] if seperate else data, time_steps)
train_y, val_y, test_y = prepare_data(data['b'] if seperate else data, time_steps, labels=True)
return dict(train=train_x, val=val_x, test=test_x), dict(train=train_y, val=val_y, test=test

这将会创建一个数据让模型可以查找过去 time_steps 步来预测数据。比如,LSTM 模型的第一个 cell 是 10 time_steps cell,为了做预测我们需要输入 10 个历史数据点。y 值跟我们想预测的第十个值相关。
现在创建一个基于 LSTM 模型的回归量。

复制代码
regressor = skflow.TensorFlowEstimator(model_fn=lstm_model(TIMESTEPS, RNN_LAYERS, DENSE_LAYERS),
n_classes=0,
verbose=1,
steps=TRAINING_STEPS,
optimizer='Adagrad',
learning_rate=0.03,
batch_size=BATCH_SIZE)

预测 sin 函数

复制代码
X, y = generate_data(np.sin, np.linspace(0, 100, 10000), TIMESTEPS, seperate=False)
# create a lstm instance and validation monitor
validation_monitor = skflow.monitors.ValidationMonitor(X['val'], y['val'], n_classes=0,
print_steps=PRINT_STEPS,
early_stopping_rounds=1000,
logdir=LOG_DIR)
regressor.fit(X['train'], y['train'], validation_monitor, logdir=LOG_DIR)
# > last training steps
# Step #9700, epoch #119, avg. train loss: 0.00082, avg. val loss: 0.00084
# Step #9800, epoch #120, avg. train loss: 0.00083, avg. val loss: 0.00082
# Step #9900, epoch #122, avg. train loss: 0.00082, avg. val loss: 0.00082
# Step #10000, epoch #123, avg. train loss: 0.00081, avg. val loss: 0.00081

预测测试数据

复制代码
mse = mean_squared_error(regressor.predict(X['test']), y['test'])
print ("Error: {}".format(mse))
# 0.000776

真实 sin 函数

预测 sin 函数

预测 sin 和 cos 混合函数

复制代码
def sin_cos(x):
return pd.DataFrame(dict(a=np.sin(x), b=np.cos(x)), index=x)
X, y = generate_data(sin_cos, np.linspace(0, 100, 10000), TIMESTEPS, seperate=False)
# create a lstm instance and validation monitor
validation_monitor = skflow.monitors.ValidationMonitor(X['val'], y['val'], n_classes=0,
print_steps=PRINT_STEPS,
early_stopping_rounds=1000,
logdir=LOG_DIR)
regressor.fit(X['train'], y['train'], validation_monitor, logdir=LOG_DIR)
# > last training steps
# Step #9500, epoch #117, avg. train loss: 0.00120, avg. val loss: 0.00118
# Step #9600, epoch #118, avg. train loss: 0.00121, avg. val loss: 0.00118
# Step #9700, epoch #119, avg. train loss: 0.00118, avg. val loss: 0.00118
# Step #9800, epoch #120, avg. train loss: 0.00118, avg. val loss: 0.00116
# Step #9900, epoch #122, avg. train loss: 0.00118, avg. val loss: 0.00115
# Step #10000, epoch #123, avg. train loss: 0.00117, avg. val loss: 0.00115

预测测试数据

复制代码
mse = mean_squared_error(regressor.predict(X['test']), y['test'])
print ("Error: {}".format(mse))
# 0.001144

真实的 sin_cos 函数

预测的 sin_cos 函数

预测 x*sin 函数 ```

def x_sin(x):
return x * np.sin(x)
X, y = generate_data(x_sin, np.linspace(0, 100, 10000), TIMESTEPS, seperate=False)

create a lstm instance and validation monitor

validation_monitor = skflow.monitors.ValidationMonitor(X[‘val’], y[‘val’], n_classes=0,
print_steps=PRINT_STEPS,
early_stopping_rounds=1000,
logdir=LOG_DIR)
regressor.fit(X[‘train’], y[‘train’], validation_monitor, logdir=LOG_DIR)

> last training steps

Step #32500, epoch #401, avg. train loss: 0.48248, avg. val loss: 15.98678

Step #33800, epoch #417, avg. train loss: 0.47391, avg. val loss: 15.92590

Step #35100, epoch #433, avg. train loss: 0.45570, avg. val loss: 15.77346

Step #36400, epoch #449, avg. train loss: 0.45853, avg. val loss: 15.61680

Step #37700, epoch #465, avg. train loss: 0.44212, avg. val loss: 15.48604

Step #39000, epoch #481, avg. train loss: 0.43224, avg. val loss: 15.43947

复制代码
预测测试数据

mse = mean_squared_error(regressor.predict(X[‘test’]), y[‘test’])
print (“Error: {}”.format(mse))

61.024454351

复制代码
真实的 x\*sin 函数
![](https://static001.infoq.cn/resource/image/15/c0/15117ac90c23755ac54f86d2ae723fc0.png)
预测的 x\*sin 函数
![](https://static001.infoq.cn/resource/image/a2/58/a213b516943f882848665cdf35aea858.png)
译者信息:侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata\_ny 分享相关技术文章。
英文原文:[Sequence prediction using recurrent neural networks(LSTM) with TensorFlow](http://mourafiq.com/2016/05/15/predicting-sequences-using-rnn-in-tensorflow.html)
2016-07-06 19:0024094
用户头像

发布了 43 篇内容, 共 30.3 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

TIKV分布式事务简介

TiDB 社区干货传送门

TiKV 底层架构 学习&认证&课程

TIUP离线镜像管理

TiDB 社区干货传送门

安装 & 部署

TiDB启动:职业生涯新阶段

TiDB 社区干货传送门

社区活动 学习&认证&课程

写给职场新人|从迷茫到屡获殊荣的技术人成长之路

京东零售技术

人工智能 架构 后端 技术成长 企业号 4 月 PK 榜

百度官方!打造「大模型全开发周期系列课程」,AI应用开发入门课率先发布!(内含英雄帖)

飞桨PaddlePaddle

百度 开发者 BAIDU 百度飞桨 飞桨星河社区

新质生产力与智能制造:推动制造业转型升级的双引擎

天津汇柏科技有限公司

智能制造 新质生产力

TiProxy 问题解答 & 未来规划

TiDB 社区干货传送门

新版本/特性发布 新版本/特性解读 数据库连接 8.x 实践

“大模型驱动的软件研发” 华为云助推企业研发智能化升级

华为云开发者联盟

人工智能 华为云 大模型 华为云开发者联盟 企业号2024年4月PK榜

NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

汀丶人工智能

自然语言处理 大语言模型 NL2SQL

华大北斗芯片再登纽伦堡国际嵌入式展EW2024

江湖老铁

TiDB 8.0 新特性尝鲜

TiDB 社区干货传送门

版本测评 新版本/特性解读 8.x 实践

下班时刻的私人专访|PingCAP 九周年纪念日这一天,我问了表妹九个问题

TiDB 社区干货传送门

人物访谈

从偶然邂逅到深度热爱

TiDB 社区干货传送门

社区活动 学习&认证&课程

社区声音:恭喜 TiProxy 组件 GA!

TiDB 社区干货传送门

版本测评 8.x 实践

基于香橙派AIpro将开源框架模型转换为昇腾模型

华为云开发者联盟

华为云 昇腾 华为云开发者联盟 企业号2024年4月PK榜 香橙派AIpro

BOE(京东方)2024年一季度净利润预计8亿元-10亿元,三位数增长叩响高质量发展“开门红”

科技热闻

即时通讯技术文集(第36期):《跟着源码学IM》系列专题 [共12篇]

JackJiang

即时通讯;IM;网络编程

TiDB 监控告警高可用

TiDB 社区干货传送门

碳视野 | 今后五年国家重点支持三类双碳项目!

AMT企源

数字化转型 双碳 碳管理

哔哩哔哩游戏宣布《碧蓝航线》将启动鸿蒙原生应用开发

最新动态

HTML API 设计指南:打造高效、可维护的接口

Apifox

JavaScript html 程序员 前端 HTML API

DCDN连接云和用户:加速企业全球拓展之旅

MasterInTech

阿里云 CDN

前端代码规范 - 图片相关

南城FE

前端 代码规范 图片优化

实用技巧:排查数据异常/数据波动问题,该如何下手?

feng

大数据 分布式 后端

火山引擎 VeDI:剪映产品如何应用A/B测试验证新功能效果

字节跳动数据平台

大数据 A/B测试 企业号 4 月 PK 榜 对比试验 数字化增长

解锁阿里巴巴1688数据宝藏:API助力批量获取商品价格、标题、图片及库存

技术冰糖葫芦

API boy api 货币化 pinduoduo API

tidb 6.1.4 table cache 导致的集群QPS异常问题

TiDB 社区干货传送门

集群管理 管理与运维 故障排查/诊断 6.x 实践

利用Python实现数据可视化

技术冰糖葫芦

API Explorer API boy api 货币化

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

LigaAI

人工智能 DevOps 极狐GitLab LigaAI 研发效能管理

使用TensorFlow的递归神经网络(LSTM)进行序列预测_语言 & 开发_Mourad_InfoQ精选文章