zoukankan      html  css  js  c++  java
  • TensorFlow实战12:Bidirectional LSTM Classifier

    https://blog.csdn.net/felaim/article/details/70300362

    1.双向递归神经网络简介

    双向递归神经网络(Bidirectional Recurrent Neural Networks, Bi-RNN),是由Schuster和Paliwal于1997年首次提出的,和LSTM是在同一年被提出的。Bi-RNN的主要目标是增加RNN可利用的信息。RNN无法利用某个历史输入的未来信息,Bi-RNN则正好相反,它可以同时使用时序数据中某个输入的历史及未来数据。 
    Bi-RNN网络结构的核心是把一个普通的单项的RNN拆成两个方向,一个随时序正向的,一个逆着时序的反向的

    感觉上面的图就很直观了,看箭头就可以很容易的发现有正向的箭头和反向的箭头,也就代表时序的不同。注意一点就是,我们发现正向节点和反向节点是不共用的,作为输出的时候是两个节点输出一个结果。

    Bi-RNN中的每个RNN单元既可以是传统的RNN,也可以是LSTM单元或者GRU单元,同样也可以叠加多层Bi-RNN,进一步抽象的提炼出特征。如果最后使用作分类任务,我们可以将Bi-RNN的输出序列连接一个全连接层,或者连接全局平均池化Global Average Pooling,最后再接Softmax层,这部分和使用卷积神经网络部分一致,如果有不理解Softmax这些概念的建议看下cs231n系列的课程,里面的概念还是讲解的非常清晰的。

    2.Bidirectional LSTM Classifier的代码实现

    #coding:utf-8
    #代码主要是使用Bidirectional LSTM Classifier对MNIST数据集上进行测试
    #导入常用的数据库,并下载对应的数据集
    import tensorflow as tf
    import numpy as np 
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("/home/frr/Documents/git/my_tensorflow/MNIST_data", one_hot = True)
    
    #设置对应的训练参数
    learning_rate = 0.01
    max_samples = 400000
    batch_size = 128
    display_step = 10
    
    n_input = 28
    n_steps = 28
    n_hidden = 256
    n_classes = 10
    
    #创建输入x和学习目标y的placeholder,这里我们的样本被理解为一个时间序列,第一个维度是时间点n_step,第二个维度是每个时间点的数据n_inpt。同时,在最后创建Softmax层的权重和偏差
    x = tf.placeholder("float", [None, n_steps, n_input])
    y = tf.placeholder("float", [None, n_classes])
    
    weights = tf.Variable(tf.random_normal([2 * n_hidden, n_classes]))
    biases = tf.Variable(tf.random_normal([n_classes]))
    
    #定义Bidirectional LSTM网络的生成函数
    def BiRNN(x, weights, biases):
    
        x = tf.transpose(x, [1, 0, 2])
        x = tf.reshape(x, [-1, n_input])
        x = tf.split(x, n_steps)
    
        lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias = 1.0)
        lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias = 1.0)
    
        outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstm_fw_cell,
                                                                lstm_bw_cell, x,
                                                                dtype = tf.float32)
        return tf.matmul(outputs[-1], weights) + biases
    
    #使用tf.nn.softmax_cross_entropy_with_logits进行softmax处理并计算损失
    pred = BiRNN(x, weights, biases)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = pred, labels = y))
    optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost)
    
    correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    init = tf.global_variables_initializer()
    
    #开始执行训练和测试操作
    with tf.Session() as sess:
        sess.run(init)
        step = 1
        while step * batch_size < max_samples:
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            batch_x = batch_x.reshape((batch_size, n_steps, n_input))
            sess.run(optimizer, feed_dict = {x: batch_x, y: batch_y})
            if step % display_step == 0:
                acc = sess.run(accuracy, feed_dict = {x: batch_x, y: batch_y})
                loss = sess.run(cost, feed_dict = {x: batch_x, y: batch_y})
                print("Iter" + str(step * batch_size) + ", Minibatch Loss = " + 
                    "{:.6f}".format(loss) + ", Training Accuracy = " + 
                    "{:.5f}".format(acc))
            step += 1
        print("Optimization Finished!")
    
        test_len = 10000
        test_data = mnist.test.images[:test_len].reshape((-1, n_steps, n_input))
        test_label = mnist.test.labels[:test_len]
        print("Testing Accuracy:", sess.run(accuracy, feed_dict = {x: test_data, y: test_label}))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    Bidirectional LSTM Classifier在MNIST数据集上的表现虽然不如卷积神经网络,但也达到了一个很不错的水平,LZ亲测正确率在0.980左右哦O(∩_∩)O

  • 相关阅读:
    批量清理java源码的target目录
    前端移动node_modules到其他位置
    oracle物化视图和视图的数据不一致
    百词斩英语单词素材提取、听力练习
    2048自动游戏AI, 最高可以玩出一二十个2048
    switcheroo: Alt+Tab的替代工具、窗口搜索
    为知笔记wiz.editor.md增强
    腾讯北极星 Polaris 试用
    [分布式] 分布式事务、seata
    Mysql查询所有的表名和查询表中所有的字段名
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/9531788.html
Copyright © 2011-2022 走看看