双向循环神经网络tensorflow实现

来源:互联网 发布:西游记解读知乎 编辑:程序博客网 时间:2024/06/06 04:15

双向循环神经网络不仅能捕获当前状态与之前状态的联系,也能捕获与之后的状态的联系。

#coding:utf-8import tensorflow as tfimport numpy as np from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets('/tmp/data',one_hot = True)learning_rate = 0.01max_samples = 400000batch_size = 128display_step = 10n_input = 28 #图像的宽度n_steps = 28 #LSTM的展开步数,图像的高n_hidden = 256n_classes = 10x = tf.placeholder('float',[None,n_steps,n_input])#none 高度 宽度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]))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)+biasespred = 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 "step",step,"    acc = ",acc,"   lost = ",loss        step += 1    print "finished!"