50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

使用 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:0024272
用户头像

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

关注

评论

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

当敏捷开发遇上固定交付……

敏捷开发

项目管理 敏捷开发 Scrum Master 固定交付

GLTF编辑器如何快速重置模型原点

3D建模设计

编辑器 GLTF 模型原点

GLTF编辑器如何合并相同材质的Mesh

3D建模设计

编辑器 GLTF 模型材质合批

覆盖8大领域,云投集团财务数智化管理平台全面上线!

用友BIP

财务数智化

Studio One 6 Pro永久许可证 附Studio One for Mac安装教程

南屿

Studio One 许可证 音乐制作软件 Studio One 6下载 Studio One 6破解

专家观点∣基于数据驱动的设备预测性维护

用友BIP

数据驱动 设备维护

什么是IoT数字孪生?

3D建模设计

IoT 数字孪生

逻辑漏洞挖掘之XSS漏洞原理分析及实战演练 | 京东物流技术团队

京东科技开发者

信息安全 漏洞分析 xss攻击 逻辑漏洞 企业号9月PK榜

M3E/OpenAi+vearch内容查重实践 | 京东云技术团队

京东科技开发者

数据库 openai 企业号9月PK榜 内容查重 vearch

权威认证!用友再获全球企业级应用软件市场10强

用友BIP

企业级应用软件

苹果电脑效率提升:Alfred 5 for Mac直装版 附Alfred5汉化包 支持M1

南屿

Alfred 5 Mac Alfred 5破解版 Mac效率办公软件

Appilot发布:打造面向DevOps场景的开源AI助手

SEAL安全

AI DevOps 企业号9月PK榜 Appilot

即时通讯技术文集(第21期):后端架构设计基础入门系列 [共15篇]

JackJiang

网络编程 即时通讯 即时通讯IM

VUE模块化开发是如何实现的?

FN0

Vue

别再纠结线程池池大小、线程数量了,哪有什么固定公式 | 京东云技术团队

京东科技开发者

cpu 线程池 企业号9月PK榜

鞍钢集团∣共和国钢铁工业长子的财务转型之路

用友BIP

财务数智化

创新传媒行业的未来发展

百度开发者中心

#人工智能 生成式AI 千帆大模型平台

美国站群服务器和香港站群服务器,哪一个更适合你的在线业务?

一只扑棱蛾子

站群服务器

功能强大的 PostgreSQL 没有 MySQL 流行的 10 个原因

NineData

MySQL postgresql 架构 品牌

赋能企业:释放加密货币代币开发的潜力

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 链游开发 NFT开发

探析ElasticSearch Kibana在测试工作中的实践应用 | 京东物流技术团队

京东科技开发者

测试 Kibana ES 企业号9月PK榜

平台运营,让数智底座更安全更稳定更高效

用友BIP

数智底座 2023全球商业创新大会

HTTP代理IP在什么情况下会请求超时?

巨量HTTP

代理IP http代理

末流院校24届秋招逆袭之路!

王磊

Java java面试

DHorse v1.4.0 发布,基于 k8s 的发布平台

tiandizhiguai

DevOps k8s kubernetes 运维

简单好用的防火墙 Radio Silence for mac激活最新

胖墩儿不胖y

Mac 软件 防火墙软件 阻止网络连接软件

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