首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

机器学习100天-Day11 Tensorflow实现RNN算法

本例是为了配合NLP学习中的RNN网络,斯坦福CS224n课程里面使用的是Tensorflow进行,所以提前熟悉一下,使用Tensorflow生成一个echo-rnn。

说实话,这个例子是照着教程敲出来的,仅仅实现了,但是没有对后面的原理进行分析,目前还是在一步一步往前推。

代码同样更新在github:https://github.com/jwc19890114/-02-learning-file-100days

什么是RNN?

RNN是循环神经网络(Recurrent Neural Network)的英文缩写,它能结合数据点之间的特定顺序和幅值大小等多个特征,来处理序列数据。更重要的是,这种网络的输入序列可以是任意长度的。

举一个简单的例子:数字时间序列,具体任务是根据先前值来预测后续值。在每个时间步中,循环神经网络的输入是当前值,以及一个表征该网络在之前的时间步中已经获得信息的状态向量。该状态向量是RNN网络的编码记忆单元,在训练网络之前初始化为零向量。

RNN和CNN、DNN

CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类。对于输入数据的维度约束是比较严重的,其训练和预测的输入数据都必须完全相同,但是如果用CNN去做一个智能问答系统,CNN会需要所有的问答数据都是固定的长度,这就很可怕了,这种模型会让问答变成对对子,必须每句话长短固定。而RNN没有这种约束。

RNN 专门解决时间序列问题的,用来提取时间序列信息,放在特征提取层(如CNN)之后。RNN更多的考虑了神经元之间的联系,例如训练机器翻译,那么对于一个短语的翻译一定要考虑前因后果,这就需要模型对于数据输入的前后因素都要考虑

DNN 说白了就是 多层网络,只是用了很多技巧,让它能够 deep 。

RNN和LSTM

为了解决原始RNN网络结构存在的梯度消失(vanishing gradient)问题,设计了LSTM这种新的网络结构。但从本质上来讲,LSTM是一种特殊的循环神经网络。

其和RNN的区别在于,对于特定时刻t,隐藏层输出st的计算方式不同。故对LSTM网络的训练的思路与RNN类似,仅前向传播关系式不同。

本文借鉴Erik Hallström教程

引入所需库

构建一个回声状态网络Echo-RNN,能记忆输入数据信息,在若干时间步后将其回传。

生成随机训练数据,输入为一个随机的二元向量,在echo_step(3)个时间步后,得到输入的回声

构建计算视图

占位符是计算图的“起始节点”。在运行每个计算图时,批处理数据被传递到占位符中。

另外,RNN状态向量也是存储在占位符中,在每一次运行后更新输出。

权重

拆分序列

开始构建RNN计算视图的下个部分,首先我们要以相邻的时间步分割批数据。

可以按批次分解各列,转成list格式文件。RNN会同时从不同位置开始训练时间序列

在我们的时间序列数据中,在三个位置同时开启训练,所以在前向传播时需要保存三个状态。我们在参数定义时就已经考虑到这一点了,

故将init_state设置为3,[batch_size, state_size]。

前向传播

计算损失

这里调用的tosparse_softmax_cross_entropy_with_logits函数,能在内部算得softmax函数值后,继续计算交叉熵。

可视化结果

生成会话

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181230A1C9UT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券