Tensorflow-LSTM RNN 例子

一些 RNN相关资料
  这次使用 RNN 来进行分类的训练 (Classification). 会继续使用到手写数字 MNIST 数据集. 让 RNN 从每张图片的第一行像素读到最后一行, 然后再进行分类判断.
  定义 RNN 主体结构在这个这个 RNN 总共有 3 个组成部分 ( input_layer, cell, output_layer). 大概就是这些,demo 看下面:

#coding:utf-8
import tensorflow as tf 
from tensorflow.contrib import rnn
import input_data

mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# Training Parameters
learning_rate = 0.001
training_steps = 1000
batch_size = 128
display_step = 100

num_input = 28 # MNIST data input (img shape: 28*28)
timesteps = 28 # time steps
num_hidden = 128 # hidden layer num of features
num_classes = 10 # MNIST total classes (0-9 digits)

# tf Draph input
X = tf.placeholder(tf.float32,[None,timesteps,num_input])
Y = tf.placeholder(tf.float32,[None,num_classes])

# Define weights
weights = {
    # (28,128)
    'in': tf.Variable(tf.random_normal([num_input,num_hidden])),

    #(128,10)
    'out': tf.Variable(tf.random_normal([num_hidden,num_classes]))
}

biases = {
    #(128,)
    'in':tf.Variable(tf.constant(0.1,shape = [num_hidden,])),

    #(10,)
    'out':tf.Variable(tf.constant(0.1,shape = [num_classes,]))
}

# Define RNN

def RNN(X, weights, biases):
    #### hidden layer for input to  cell #####

    #改变输入的shape X ==> (128 batch * 28 steps, 28 inputs)
    X = tf.reshape(X,[-1,num_input])
    X_in = tf.matmul(X,weights['in']+biases['in'])
    # X_in ==> (128 batch, 28 steps, 128 hidden)
    X_in = tf.reshape(X_in,[-1,timesteps,num_hidden])


    ######################cell##########################
    cell = rnn.BasicLSTMCell(num_hidden)
    #一个lstm cell 有两部分 c_state, h_state
    init_state = cell.zero_state(batch_size, dtype=tf.float32)
    outputs, final_state = tf.nn.dynamic_rnn(cell, X_in, initial_state=init_state, time_major=False)

    #### hindden layer for output as final results ####
    # # way 1
    # outputs = tf.unstack(tf.transpose(outputs, [1,0,2]))
    # result = tf.matmul(outputs[-1], weights['out']) + biases['out']    #调用最后一个 outputs
    #or
    # way 2
    result = tf.matmul(final_state[1], weights['out']) + biases['out'] #直接调用final_state 中的 h_state (final_state[1]) 来进行运算
    return result  #shape = (128, 10)


# Define loss and optimizer
pred = RNN(X, weights, biases)
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=Y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op =  optimizer.minimize(loss_op)


# Evaluate model (with test logits, for dropout to be disabled)
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

#start
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(1, training_steps+1):
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        # Reshape data to get 28 seq of 28 elements
        batch_x = batch_x.reshape((batch_size, timesteps, num_input))
        # Run optimization op (backprop)
        sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
        if step % display_step == 0 or step == 1:
            loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x,Y: batch_y})
            print("Step " + str(step) + ", 小批量损失 = " + \
                  "{:.4f}".format(loss) + ", 训练准确度 = " + \
                  "{:.3f}".format(acc))
    print("优化完成")
    # Calculate accuracy for 128 mnist test images
    test_len = 128
    test_data = mnist.test.images[:test_len].reshape((-1, timesteps, num_input))
    test_label = mnist.test.labels[:test_len]
    print("测试精度为 :", sess.run(accuracy, feed_dict={X: test_data, Y: test_label}))

运行结果看下图建议在GPU上运行 ,cpu太耗时了:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值