tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别

chunk_size = 256
chunk_n = 160
rnn_size = 256
num_layers = 2
n_output_layer = MAX_CAPTCHA*CHAR_SET_LEN   # 输出层

单层rnn:

tf.contrib.rnn.static_rnn:

输入:[步长,batch,input] 

输出:[n_steps,batch,n_hidden] 

还有rnn中加dropout

def recurrent_neural_network(data):
    
    data = tf.reshape(data, [-1, chunk_n, chunk_size])
    data = tf.transpose(data, [1,0,2])
    data = tf.reshape(data, [-1, chunk_size])
    data = tf.split(data,chunk_n)
    
    # 只用RNN
    layer = {'w_':tf.Variable(tf.random_normal([rnn_size, n_output_layer])), 'b_':tf.Variable(tf.random_normal([n_output_layer]))}
    lstm_cell = tf.contrib.rnn.BasicLSTMCell(rnn_size)
    outputs, status = tf.contrib.rnn.static_rnn(lstm_cell, data, dtype=tf.float32)
    # outputs = tf.transpose(outputs, [1,0,2])
    # outputs = tf.reshape(outputs, [-1, chunk_n*rnn_size])
    ouput = tf.add(tf.matmul(outputs[-1], layer['w_']), layer['b_'])
    
    return ouput

多层rnn:

tf.nn.dynamic_rnn:

输入:[batch,步长,input] 

输出:[batch,n_steps,n_hidden] 

所以我们需要tf.transpose(outputs, [1, 0, 2]),这样就可以取到最后一步的output

def recurrent_neural_network(data):
    # [batch,chunk_n,input]
    data = tf.reshape(data, [-1, chunk_n, chunk_size])
    #data = tf.transpose(data, [1,0,2])
    #data = tf.reshape(data, [-1, chunk_size])
    #data = tf.split(data,chunk_n)
    
    # 只用RNN
    layer = {'w_':tf.Variable(tf.random_normal([rnn_size, n_output_layer])), 'b_':tf.Variable(tf.random_normal([n_output_layer]))}
    #1
    # lstm_cell1 = tf.contrib.rnn.BasicLSTMCell(rnn_size)
    # outputs1, status1 = tf.contrib.rnn.static_rnn(lstm_cell1, data, dtype=tf.float32)
    
    def lstm_cell():
        return tf.contrib.rnn.LSTMCell(rnn_size)
    def attn_cell():
        return tf.contrib.rnn.DropoutWrapper(lstm_cell(), output_keep_prob=keep_prob)
    # stack = tf.contrib.rnn.MultiRNNCell([attn_cell() for _ in range(0, num_layers)], state_is_tuple=True)
    stack = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(0, num_layers)], state_is_tuple=True)
    # outputs, _ = tf.nn.dynamic_rnn(stack, data, seq_len, dtype=tf.float32)
    outputs, _ = tf.nn.dynamic_rnn(stack, data, dtype=tf.float32)
    # [batch,chunk_n,rnn_size] -> [chunk_n,batch,rnn_size]
    outputs = tf.transpose(outputs, (1, 0, 2))
    
    ouput = tf.add(tf.matmul(outputs[-1], layer['w_']), layer['b_'])
    
    return ouput 

 


 

参考:https://cloud.tencent.com/developer/article/1016695 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值