tensorflow dynamic_rnn与static_rnn使用注意

不同有好多,例如:输入输出

输入输出要格外注意,敲代码的时候,这个和我们关系最大
帖俩段代码,注意其中的输入输出

这个是static_rnn

def lstm_model(x,y):
  # x = tf.transpose(x, [1, 0, 2])
  # x = tf.reshape(x, [-1, 1])
  # x = tf.split(x, 10, axis=0)
#上面和下面这一句效果一样
   x=tf.unstack(x,axis=2)
   lstm_cell = rnn.BasicLSTMCell(20)
   outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)
   output=outputs[-1]
   prediction,loss=learn.models.linear_regression(output,y)
   train_op=tf.contrib.layers.optimize_loss(loss,tf.contrib.framework.get_global_step(),\
   optimizer='Adagrad',learning_rate=0.1)
   return prediction,loss,train_op

很明显,这个输入是一个list,len(list)=步长 list[0].shape=[batch,input]
这个输出和输入一样是个list,len(list)=步长,list[0].shape=[batch,hidden]
所以output=outputs[-1] 就取到了最后一步的ouput

这个是dynamic_rnn

#n_steps = 25 
#n_hidden = 32
def lstm_model(x,y):
    lstm_cell = rnn.BasicLSTMCell(20)
    outputs, states = tf.nn.dynamic_rnn(lstm_cell, x, dtype=tf.float32)
    output=tf.transpose(outputs, [1, 0, 2])[-1]
    prediction,loss=learn.models.linear_regression(output,y)
    train_op=tf.contrib.layers.optimize_loss(loss,tf.contrib.framework.get_global_step(),\
    optimizer='Adagrad',learning_rate=0.1)
    return prediction,loss,train_op

这个输入就不一样了,[batch,步长,input]
机智,输出看看什么样子
Tensor(“rnn/transpose:0”, shape=(?, 25, 32), dtype=float32)
这个应该就是[batch,n_steps,n_hidden]
所以我们需要tf.transpose(outputs, [1, 0, 2]),这样就可以取到最后一步的output

tensorflow dynamic_rnn与static_rnn使用注意_第1张图片

这张图是引用 知乎的,有侵权请联系本人

参考:static_rnn与dynamic_rnn不同

你可能感兴趣的:(深度学习)