tensorflow的static_rnn和dynamic_rnn详解

1,001 阅读2分钟

  • 此篇文章摘录于LoveMIss-Y的博客,博客的地址是: blog.csdn.net/qq_27825451…
  • 帮助于看清动态构建RNN和静态构建RNN的不同

前言: tensorflow对于RNN的实现提供了良好的封装,但是你真的了解它们的运算过程吗?本次分享的几张图片为自己的手写笔记,有不正确的还望大佬支指出,因为每次编辑文章还要画图实在是有点费事费力,就上传手写图片了。

image.png

注意这个地方里面有个y0-->y0,y1-->y1,y2-->y2...的过程,文章中说前后的y0有不同的含义,拿到我们的项目中说就是,前面输出的那个[batch_size,y_max_length,vocab_size]得到的是每个单词的数据,但是我们在上面加上一层softmax,就会变成vocab中对应每个词的比例,所以前后的y0是不相同的

image.png

基本的rnn,直接输入的参数是隐藏神经元的个数(等同于是输出/入的状态的数量);静态的rnn,直接输入的是构造好的进本_cell和inputs

x = tf.placeholder(tf.float32,[None,timesteps,n_inputs])
xx = tf.unstack(tf.transpose(x,perm=[1,0,2]))
basic_cell = BasicalRNNCell(num_units=3)
outputs,states = tf.nn.static_rnn(basical_cell,xx)

image.png

动态的rnn,直接输入的是构造好的rnn_cell和inputs

x = tf.placeholder(tf.float32,[None,timesteps,n_inputs])
basic_cell = BasicalRNNCell(num_units=3)
outputs,states = tf.nn.dynamic_rnn(basical_cell,x)

将代码的细节规避掉了,由程序自己完成输入转化的步骤 其中也谈到了basicalrnncell可以使用,但是不建议使用的原因

image.png

对于RNN的新认识:

  • 首先是针对序列的,正确的序列形式[X0,X1,X2,X3...],其中X0 = [x0,x1,x2,..],所以完整的序列应该是[[x01,x02,x03..],[x11,x12,x13..]..]是一个两层的结构,在算上batch_size的话是一个三层的结构
  • 我们使用高阶API,只暴漏了num_units的一个隐藏神经元的个数(输出state的维度),其他的都被封装了起来,我们深入原理层探究,循环的部分其实是框架帮我们实现好了,并不需要关注,了解机理更好。