数据集
from __future__ import print_function
import tensorflow as tf
from tensorflow. contrib import rnn
# Import MNIST data
from tensorflow. examples. tutorials. mnist import input_data
mnist = input_data. read_data_sets ( "/tmp/data/" , one_hot= True)
参数设置
# Training Parameters
learning_rate = 0.001
training_steps = 10000
batch_size = 128
display_step = 200
# Network Parameters
num_input = 28 # MNIST data input ( img shape: 28 * 28 )
timesteps = 28 # timesteps
num_hidden = 128 # hidden layer num of features
num_classes = 10 # MNIST total classes ( 0 - 9 digits)
占位符,w, b
# tf Graph input
X = tf. placeholder ( "float" , [ None, timesteps, num_input] )
Y = tf. placeholder ( "float" , [ None, num_classes] )
# Define weights
weights = {
'out' : tf. Variable ( tf. random_normal ( [ num_hidden, num_classes] ) )
}
biases = {
'out' : tf. Variable ( tf. random_normal ( [ num_classes] ) )
}
网络
def RNN ( x, weights, biases) :
# Prepare data shape to match `rnn` function requirements
# Current data input shape: ( batch_size, timesteps, n_input)
# Required shape: 'timesteps' tensors list of shape ( batch_size, n_input)
# Unstack to get a list of 'timesteps' tensors of shape ( batch_size, n_input)
x = tf. unstack ( x, timesteps, 1 )
# tf. unstack将给定维数的秩- r张量展开成秩- ( R - 1 ) 张量
# Define a lstm cell with tensorflow
lstm_cell = rnn. BasicLSTMCell ( num_hidden, forget_bias= 1.0 )
#tf. compat. v1. nn. rnn_cell. BasicLSTMCell ( num_units, forget_bias= 1.0 , state_is_tuple= True, activation= None, reuse= None, name= None, dtype= None, ** kwargs)
# Get lstm cell output
outputs, states = rnn. static_rnn ( lstm_cell, x, dtype= tf. float32)
# tf. compat. v1. nn. static_rnn ( cell, inputs, initial_state= None, dtype= None, sequence_length= None, scope= None)
# Linear activation, using rnn inner loop last output
return tf. matmul ( outputs[ - 1 ] , weights[ 'out' ] ) + biases[ 'out' ]
loss, optimizer, acc,
logits = RNN ( X , weights, biases)
prediction = tf. nn. softmax ( logits)
# Define loss and optimizer
loss_op = tf. reduce_mean ( tf. nn. softmax_cross_entropy_with_logits (
logits= logits, labels= Y ) )
optimizer = tf. train. GradientDescentOptimizer ( 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 ( prediction, 1 ) , tf. argmax ( Y , 1 ) )
accuracy = tf. reduce_mean ( tf. cast ( correct_pred, tf. float32) )
初始化,训练,测试
# Initialize the variables ( i. e. assign their default value)
init = tf. global_variables_initializer ( )
# Start training
with tf. Session ( ) as sess:
# Run the initializer
sess. run ( init)
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 :
# Calculate batch loss and accuracy
loss, acc = sess. run ( [ loss_op, accuracy] , feed_dict= { X : batch_x,
Y : batch_y} )
print ( "Step " + str ( step) + ", Minibatch Loss= " + \
"{:.4f}" . format ( loss) + ", Training Accuracy= " + \
"{:.3f}" . format ( acc) )
print ( "Optimization Finished!" )
# 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 ( "Testing Accuracy:" , \
sess. run ( accuracy, feed_dict= { X : test_data, Y : test_label} ) )