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 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Small Code

使用MATLAB的fitlm函数进行线性回归

今天在做《数理统计》关于线性回归的作业,本来用R已经做出来了,但是由于最近使用matlab很多,所以也想看看用matlab怎么做。 matlab中有很多函数可以...

5896
来自专栏mwangblog

gauss消元法

942
来自专栏ascii0x03的安全笔记

利用Python sklearn的SVM对AT&T人脸数据进行人脸识别

要求:使用10-fold交叉验证方法实现SVM的对人脸库识别,列出不同核函数参数对识别结果的影响,要求画对比曲线。 使用Python完成,主要参考文献【4】...

5908
来自专栏素质云笔记

keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)

之前在博客《keras系列︱图像多分类训练与利用bottleneck features进行微调(三)》一直在倒腾VGG16的fine-tuning,然后因为其...

1.4K10
来自专栏专知

显存不足?PyTorch 显存使用分析与优化

面对动辄几百万几千万参数量的模型, GPU那连常规 U盘都比不过的显存, 真的是杯水车薪。相信大家在日常模型训练过程中,或多或少的总会遇见:

1.6K2
来自专栏互联网大杂烩

逻辑斯蒂回归(Logistic Regression)

定义x=<x1,x2,...xn>来表示n维特征向量,权重为w=<w1,w2,...wn>,同时,截距(Intercept)为b。则这种线性关系为: f(w,...

1072
来自专栏数据结构与算法

洛谷P4180 [Beijing2010组队]次小生成树Tree

题目描述 小C最近学了很多最小生成树的算法,Prim算法、Kurskal算法、消圈算法等等。正当小C洋洋得意之时,小P又来泼小C冷水了。小P说,让小C求出一个无...

3728
来自专栏有趣的Python和你

Python数据分析之一元线性回归问题Python方差分析结论

1232
来自专栏null的专栏

[置顶] 《Python机器学习算法》勘误

本书在出版的过程中已经经过详细的检查,但是大小问题依旧存在,感谢各位细心的读者为本书指出的错误。 第34页的错误在Python2.7.9版本上不会报错。 第1...

3765
来自专栏CreateAMind

stackGAN通过文字描述生成图片的V2项目

https://github.com/hanzhanggit/StackGAN-v2

3113

扫码关注云+社区

领取腾讯云代金券