送机器学习电子书——(TensorFlow)RNN入门

简介: 本文作者正在写自己的新书Machine Learning with TensorFlow,这篇博文只是他新书的一小部分,作者用简单的语言介绍了RNN,不用一个小例子介绍了如何使用Tensorflow中内置的RNN模型进行预测。

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud


今天我们将研究一种名为循环神经网络的神经网络体系结构。它针对的不是自然语言数据,而是处理连续的时间数据,如股票市场价格。在本文结束之时,你将能够对时间序列数据中的模式进行建模,以对未来的值进行预测。

a1d1902a809c6ad3473e31d9ac71127cc4ee2ba0

1.上下文信息

回到学校,我的一个期中考试仅由真的或假的问题组成时。假设一半的答案是真的,而另一半则是假的。我想出了大部分问题的答案,剩下的是靠随机猜测。我做了一件聪明的事情,也许你也可以尝试一下这个策略。在计数了我的“真”的答案之后,我意识到它与“假”这个答案不成比例。于是我的大部分猜测是“假”的,这样就可以平衡分配。

这竟然是有效的。在那一时刻我感觉到我是狡猾的。这是什么样的判断力,使我们对自己的决定那么有信心,我们又如何将这种判断力给予神经网络?

这个问题的一个答案是使用上下文来回答问题。语境提示是可以提高机器学习算法性能的重要信号。例如,假设你想检查一个英文句子,并标记每个单词的词性。

傻傻的方法是将每个单词单独分类为“名词”,“形容词”等,而不确认其相邻的单词。单词“努力”被用作动词,但根据上下文,你也可以使用它作为一个形容词,单纯的词性标注是一个需要努力的问题。

更好的方法是考虑上下文信息。为了向神经网络提供上下文信息,我们可以使用称为循环神经网络的体系结构。

循环神经网络(RNN)简介

为了理解循环神经网络(RNN),我们首先来看一下图1所示的简单架构。它将输入向量Xt)作为输入,并在某个时间(t)产生一个向量Yt)的输出。中间的圆圈表示网络的隐藏层。

79e1314601bc1d8d2daa9477f1e1da0bfa0ea5bc

1分别具有标记为Xk)和Yk)的输入和输出层的神经网络

通过足够的输入/输出示例,你可以在TensorFlow中了解网络的参数。例如,我们将输入权重称为矩阵in,输出权重作为矩阵out。假设有一个隐藏层,称为向量Zt)。

如图2所示,神经网络的前半部分的特征在于函数Zt= Xt* W in,神经网络的后半部分形式为Yt= Zt* W out。同样,如果你愿意,整个神经网络可以是函数Yt=Xt* Win* W out

1a7944f8e7fd96be7b0cd64e302c141d391f64e4

2神经网络的隐藏层可以被认为是数据的隐藏,由其输入权重编码并输出权重解码。

在微调神经网络后,你可能希望在现实世界的场景中开始使用你所学习的模型。通常,这意味着你将多次调用该模型,甚至可能连续反复调用,如图3所示。

3755f72519c9d32b1dfde817a1bc8949ae8584c2

3通常,我们会运行相同的神经网络多次,而不考虑关于先前运行的隐藏状态。

在每个时间t,当调用学习模型时,这种体系结构不考虑关于以前运行的结果经验。就像预测股市走势一样,只看当前的数据。循环神经网络(RNN)与传统神经网络不同,因为它引入了转移权重W来跨越时间传递信息。图4显示了必须在RNN中学习的三个加权矩阵。

acda61bfd9b93480cd8262d84b0db6a9c4d4c550

4循环神经网络架构可以利用网络的先前状态来实现其优点。

理论上很好理解,但是你在这里必须要亲自动手做一下。让我们来吧!接下来将介绍如何使用TensorFlow的内置RNN模型。我们将使用这个RNN在现实世界的时间数据来预测未来!

2.实施循环神经网络

当我们实施RNN时,我们将使用TensorFlow。如图4所示,你不需要手动构建网络,因为TensorFlow库中已经支持一些鲁棒(robust)的RNN模型。

参考有关RNNTensorFlow库信息,请参见https://www.tensorflow.org/tutorials/recurrent

RNN的一种类型模型被称为长短期记忆网络(LSTM)。我觉得这是一个有趣的名字。它听起来也意味着:短期模式长期不会被遗忘。

LSTM的精确实现细节不在本文的范围之内。相信我,如果只学习LSTM模型会分散我们的注意力,因为它还没有确定的标准。

进一步阅读:为了了解如何从头开始执行LSTM,我建议你阅读以下的文章:https://apaszke.github.io/lstm-explained.html

我们现在开始我们的教程。首先从编写我们的代码开始,先创建一个新的文件,叫做simple_regression.py。导入相关的库,如步骤1所示。

步骤1:导入相关库

import numpy as np
import tensorflow as tf
from tensorflow.contrib import rnn

接着,定义一个类叫做SeriesPredictor。如步骤2所示,构造函数里面设置模型超参数,权重和成本函数。

步骤2:定义一个类及其构造函数

class SeriesPredictor:
     def __init__(self, input_dim, seq_size, hidden_dim=10):
        self.input_dim = input_dim //#A
        self.seq_size = seq_size  //#A
        self.hidden_dim = hidden_dim  //#A
        self.W_out = tf.Variable(tf.random_normal([hidden_dim, 1]),name='W_out') //#B
        self.b_out = tf.Variable(tf.random_normal([1]), name='b_out')  //#B
        self.x = tf.placeholder(tf.float32, [None, seq_size, input_dim]) //#B
        self.y = tf.placeholder(tf.float32, [None, seq_size]) //#B
        self.cost = tf.reduce_mean(tf.square(self.model() - self.y)) //#C
        self.train_op = tf.train.AdamOptimizer().minimize(self.cost) //#C
        self.saver = tf.train.Saver()  //#D

#A超参数。

#B权重变量和输入占位符。

#C成本优化器(cost optimizer)。

#D辅助操作。

接下来,我们使用TensorFlow的内置RNN模型,名为BasicLSTMCellLSTM单元的隐藏维度是通过时间的隐藏状态的维度。我们可以使用该rnn.dynamic_rnn函数处理这个单元格数据,以检索输出结果。步骤3详细介绍了如何使用TensorFlow来实现使用LSTM的预测模型。

步骤3:定义RNN模型

def model(self):
         """
         :param x: inputs of size [T, batch_size, input_size]
         :param W: matrix of fully-connected output layer weights
         :param b: vector of fully-connected output layer biases
         """
         cell = rnn.BasicLSTMCell(self.hidden_dim)  #A
         outputs, states = tf.nn.dynamic_rnn(cell, self.x, dtype=tf.float32) #B
         num_examples = tf.shape(self.x)[0]
         W_repeated = tf.tile(tf.expand_dims(self.W_out, 0), [num_examples, 1, 1])#C
         out = tf.matmul(outputs, W_repeated) + self.b_out
         out = tf.squeeze(out)
         return out

#A创建一个LSTM单元。

#B运行输入单元,获取输出和状态的张量。

#C将输出层计算为完全连接的线性函数。

通过定义模型和成本函数,我们现在可以实现训练函数,该函数学习给定示例输入/输出对的LSTM权重。如步骤4所示,你打开会话并重复运行优化器。

另外,你可以使用交叉验证来确定训练模型的迭代次数。在这里我们假设固定数量的epocs

训练后,将模型保存到文件中,以便稍后加载使用。

步骤4:在一个数据集上训练模型

def train(self, train_x, train_y):
         with tf.Session() as sess:
             tf.get_variable_scope().reuse_variables()
             sess.run(tf.global_variables_initializer())
             for i in range(1000):  #A
               		mse = sess.run([self.train_op, self.cost], feed_dict={self.x: train_x, self.y: train_y})
                 if i % 100 == 0:
                     print(i, mse)
             save_path = self.saver.save(sess, 'model.ckpt')
             print('Model saved to {}'.format(save_path))

#A训练1000

我们的模型已经成功地学习了参数。接下来,我们想评估利用其他数据来评估以下预测模型的性能。步骤5加载已保存的模型,并通过馈送一些测试数据以此来运行模型。如果学习的模型在测试数据上表现不佳,那么我们可以尝试调整LSTM单元格的隐藏维数。

步骤5:测试学习的模型

def test(self, test_x):
         with tf.Session() as sess:
             tf.get_variable_scope().reuse_variables()
             self.saver.restore(sess, './model.ckpt')
             output = sess.run(self.model(), feed_dict={self.x: test_x})
             print(output)

但为了完善自己的工作,让我们组成一些数据,并尝试训练预测模型。在步骤6中,我们将创建输入序列,称为train_x,和相应的输出序列,称为train_y

步骤6训练并测试一些虚拟数据

if __name__ == '__main__':
     predictor = SeriesPredictor(input_dim=1, seq_size=4, hidden_dim=10)
     train_x = [[[1], [2], [5], [6]],
                [[5], [7], [7], [8]],
                [[3], [4], [5], [7]]]
     train_y = [[1, 3, 7, 11],
                [5, 12, 14, 15],
                [3, 7, 9, 12]]
     predictor.train(train_x, train_y)
       test_x = [[[1], [2], [3], [4]],  #A
               [[4], [5], [6], [7]]]  #B
     predictor.test(test_x)

#A预测结果应为1357

#B预测结果应为491113

你可以将此预测模型视为黑盒子,并用现实世界的时间数据进行测试。

这篇博文只是我新书的一小部分,如果你想要学习更多的知识请移步:

Machine Learning with TensorFlow 

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织整理。

文章原标题:《Recurrent Neural Networks

作者:Nishant Shukla  机器学习布道者

译者:虎说八道。审校:主题曲哥哥。

文章为简译,更为详细的内容,请查看原文


相关文章
|
15天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
44 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 数据采集 TensorFlow
使用TensorFlow进行模型训练:一次实战探索
【8月更文挑战第22天】本文通过实战案例详解使用TensorFlow进行模型训练的过程。首先确保已安装TensorFlow,接着预处理数据,包括加载、增强及归一化。然后利用`tf.keras`构建卷积神经网络模型,并配置训练参数。最后通过回调机制训练模型,并对模型性能进行评估。此流程为机器学习项目提供了一个实用指南。
|
2月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
44 0
|
2月前
|
缓存 开发者 测试技术
跨平台应用开发必备秘籍:运用 Uno Platform 打造高性能与优雅设计兼备的多平台应用,全面解析从代码共享到最佳实践的每一个细节
【8月更文挑战第31天】Uno Platform 是一种强大的工具,允许开发者使用 C# 和 XAML 构建跨平台应用。本文探讨了 Uno Platform 中实现跨平台应用的最佳实践,包括代码共享、平台特定功能、性能优化及测试等方面。通过共享代码、采用 MVVM 模式、使用条件编译指令以及优化性能,开发者可以高效构建高质量应用。Uno Platform 支持多种测试方法,确保应用在各平台上的稳定性和可靠性。这使得 Uno Platform 成为个人项目和企业应用的理想选择。
38 0
|
2月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
57 0
|
2月前
|
C# 开发者 前端开发
揭秘混合开发新趋势:Uno Platform携手Blazor,教你一步到位实现跨平台应用,代码复用不再是梦!
【8月更文挑战第31天】随着前端技术的发展,混合开发日益受到开发者青睐。本文详述了如何结合.NET生态下的两大框架——Uno Platform与Blazor,进行高效混合开发。Uno Platform基于WebAssembly和WebGL技术,支持跨平台应用构建;Blazor则让C#成为可能的前端开发语言,实现了客户端与服务器端逻辑共享。二者结合不仅提升了代码复用率与跨平台能力,还简化了项目维护并增强了Web应用性能。文中提供了从环境搭建到示例代码的具体步骤,并展示了如何创建一个简单的计数器应用,帮助读者快速上手混合开发。
45 0
|
2月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
49 0
|
2月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
40 0
|
2月前
|
前端开发 开发者 设计模式
揭秘Uno Platform状态管理之道:INotifyPropertyChanged、依赖注入、MVVM大对决,帮你找到最佳策略!
【8月更文挑战第31天】本文对比分析了 Uno Platform 中的关键状态管理策略,包括内置的 INotifyPropertyChanged、依赖注入及 MVVM 框架。INotifyPropertyChanged 方案简单易用,适合小型项目;依赖注入则更灵活,支持状态共享与持久化,适用于复杂场景;MVVM 框架通过分离视图、视图模型和模型,使状态管理更清晰,适合大型项目。开发者可根据项目需求和技术栈选择合适的状态管理方案,以实现高效管理。
32 0
|
2月前
|
自然语言处理 C# 开发者
Uno Platform多语言开发秘籍大公开:轻松驾驭全球用户,一键切换语言,让你的应用成为跨文化交流的桥梁!
【8月更文挑战第31天】Uno Platform 是一个强大的开源框架,允许使用 C# 和 XAML 构建跨平台的原生移动、Web 和桌面应用程序。本文详细介绍如何通过 Uno Platform 创建多语言应用,包括准备工作、设置多语言资源、XAML 中引用资源、C# 中加载资源以及处理语言更改。通过简单的步骤和示例代码,帮助开发者轻松实现应用的国际化。
31 0

热门文章

最新文章

下一篇
无影云桌面