当前位置: 代码迷 >> 综合 >> 个人对tf.nn.dynamic_rnn以及tf.nn.static_rnn之间区别的一些了解n
  详细解决方案

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

热度:101   发布时间:2023-09-22 07:04:15.0

 首先 ,我们来说明一下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")

 

  相关解决方案