个人对tf.nn.dynamic_rnn以及tf.nn.static_rnn之间区别的一些了解n

 首先 ,我们来说明一下tf.nn.dynamic_rnn。(最好还是先用动态的吧,感觉好理解一些)

他的shape是【batch_size,time_step(序列长度),input-dim】,并且对应他的time_step是可以不同的,这区别于以下的static_rnn.

然而,他对应最后的输出shape是【batch_size,n_steps,n_hidden】,因此若要输出对应最后的output,我们必须要进行转置,即tf.transpose(xxx,[1,0,2]),

此时对应输出output[-1]才是对应最终的输出。(强调:对应dyanmic_rnn里有个参数是time_major,如果设置对应为true,则我们对应输入为【time_step,batch_size,input_dim】,对应输出也是如此;而如果设置为false,则对应我们如下的代码不需要改动。)下面让我们用mnist对应的一段代码来看一下。

#在此假设输入的mnist数据X_in对应为【batch_size,time_steps,input_dim】,则对应lstm的构建为
cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units,forget_bias=1.0,state_is_tuple=True)
init_state = cell.zero_state(batch_size,dtype=tf.float32)
outputs,final_state = tf.nn.dynamic_rnn(cell,X_in,initial_state=init_state,time_major=False)
#对应若是要取最后的数据,则需要进行转置,将n_steps维度提到前面来
outputs = tf.transpose(outputs,[1,0,2])
last_output = outputs[-1]

然后我们来对比一下tf.nn.static_rnn.

他的shape是【time_steps,batch_size,input_dim】,最主要的是,这里的input输入需要是一个list,也就是说是一个【】形式,每个list对应的都是一个time_steps(序列)。输出shape对应为【n_steps,batch_size,n_hidden】,因此对应输出最后一个output[-1]即为我们需要的值。代码如下:

input=tf.unstack(x ,time_steps,1)
'''还有一种方法,可以转换为list(忽略其中的加入输入层部分)

_X = tf.transpose(_X, [1, 0, 2])  # permute n_steps and batch_size   
_X = tf.reshape(_X, [-1, n_inputs])  # (n_steps*batch_size, n_input)   
_X = tf.matmul(_X, weights['in']) + biases['in']    
lstm_cell =tf.nn.rnn_cell.BasicLSTMCell(n_hidden_unis, forget_bias=1.0)    _init_state=lstm_cell.zero_state(batch_size,dtype=tf.float32)    
_X = tf.split(_X, n_step,0 )  # n_steps * (batch_size, n_hidden)   #得到我们对应想要的list

##上方的axis 默认是为0的 所以可写可不写
 outputs, states =tf.nn.static_rnn(lstm_cell, _X, initial_state=_init_state)

'''

lstm_layer=rnn.BasicLSTMCell(num_units,forget_bias=1)
#lstm_layer=rnn.LSTMCell(num_units,use_peepholes=True,forget_bias=1)

outputs,_=rnn.static_rnn(lstm_layer,input,dtype="float32")

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值