前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tensorflow 之RNNinputs: shape = (batch_size, time_steps, input_size)cell: RNNCellinitial_state: shape

Tensorflow 之RNNinputs: shape = (batch_size, time_steps, input_size)cell: RNNCellinitial_state: shape

作者头像
微风、掠过
发布2018-08-14 17:35:51
6640
发布2018-08-14 17:35:51
举报

labels = tf.reshape(y, [-1]) 将矩阵变为一行

output = np.reshape(aa, -1)

output = np.reshape(aa, [-1,5]) -1表示一个占位符,分为5列。

  1. RNNcell:

它是TensorFlow中实现RNN的基本单元,每个RNNCell都有一个call方法,使用方式是:(output, next_state) = call(input, state)。

借助图片来说可能更容易理解。假设我们有一个初始状态h0,还有输入x1,调用call(x1, h0)后就可以得到(output1, h1):

1.jpg

再调用一次call(x2, h1)就可以得到(output2, h2):

2.jpg

[图片上传失败...(image-e4cb03-1533547159062)]

也就是说,每调用一次RNNCell的call方法,就相当于在时间上“推进了一步”,这就是RNNCell的基本功能。

两个子类:BasicRNNCell和BasicLSTMCell

state_size****:隐层的大小

output_size****:输出的大小

设输入数据的形状为(batch_size, input_size),那么计算时得到的隐层状态就是(batch_size, state_size),输出就是(batch_size, output_size)。

对于BasicLSTMCell,情况有些许不同,因为LSTM可以看做有两个隐状态h和c,对应的隐层就是一个Tuple,每个都是(batch_size, state_size)的形状。

tf.nn.dynamic_rnn:

RNNCELL是一次前进一步,如果我们的序列长度为10,就要调用10次call函数。

TensorFlow提供了一个tf.nn.dynamic_rnn函数:

设我们输入数据的格式为(batch_size, time_steps, input_size),其中time_steps表示序列本身的长度,如在Char RNN中,长度为10的句子对应的time_steps就等于10。最后的input_size就表示输入数据单个序列单个时间维度上固有的长度。另外我们已经定义好了一个RNNCell,调用该RNNCell的call函数time_steps次,对应的代码就是:

inputs: shape = (batch_size, time_steps, input_size)

cell: RNNCell

initial_state: shape = (batch_size, cell.state_size)。初始状态。一般可以取零矩阵

outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)

得到的outputs就是time_steps步里所有的输出。它的形状为(batch_size, time_steps, cell.output_size)。state是最后一步的隐状态,它的形状为(batch_size, cell.state_size)。

堆叠RNNCell: MultiRNNCell

将x输入第一层RNN的后得到隐层状态h,这个隐层状态就相当于第二层RNN的输入,第二层RNN的隐层状态又相当于第三层RNN的输入,以此类推。在TensorFlow中,可以使用tf.nn.rnn_cell.MultiRNNCell函数对RNNCell进行堆叠,相应的示例程序如下:

在经典RNN结构中有这样的图:

3.jpg

通过MultiRNNCell得到的cell并不是什么新鲜事物,它实际也是RNNCell的子类,因此也有call方法、state_size和output_size属性。同样可以通过tf.nn.dynamic_rnn来一次运行多步。

在上面的代码中,我们好像有意忽略了调用call或dynamic_rnn函数后得到的output的介绍。找到源码中BasicRNNCell的call函数实现:

说明在BasicRNNCell中,output其实和隐状态的值是一样的。因此,我们还需要额外对输出定义新的变换,才能得到图中真正的输出y。由于output和隐状态是一回事,所以在BasicRNNCell中,state_size永远等于output_size。TensorFlow是出于尽量精简的目的来定义BasicRNNCell的,所以省略了输出参数,我们这里一定要弄清楚它和图中原始RNN定义的联系与区别。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • inputs: shape = (batch_size, time_steps, input_size)
  • cell: RNNCell
  • initial_state: shape = (batch_size, cell.state_size)。初始状态。一般可以取零矩阵
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档