Building a single-layer neural network with TensorFlow
Let us build a single-layer neural net with TensorFlow step by step. In this example, we'll be using the MNIST dataset. This dataset is a set of 28 x 28 pixel grayscale images of hand written digits. This dataset consists of 55,000 training data, 10,000 test data, and 5,000 validation data. Every MNIST data point has two parts: an image of a handwritten digit and a corresponding label. The following code block loads data. one_hot=True means that the labels are one-hot encoded vectors instead of actual digits of the label. For example, if the label is 2, you will see [0,0,1,0,0,0,0,0,0,0]. This allows us to directly use it in the output layer of the network:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
Setting up placeholders and variables is done as follows:
# All the pixels in the image (28 * 28 = 784) features_count = 784 # there are 10 digits i.e labels labels_count = 10 batch_size = 128 epochs = 10 learning_rate = 0.5 features = tf.placeholder(tf.float32, [None,features_count]) labels = tf.placeholder(tf.float32, [None, labels_count]) #Set the weights and biases tensors weights = tf.Variable(tf.truncated_normal((features_count, labels_count))) biases = tf.Variable(tf.zeros(labels_count),name='biases')
Let's set up the optimizer in TensorFlow:
loss,
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
Before we begin training, let's set up the variable initialization operation and an operation to measure the accuracy of our predictions, as follows:
# Linear Function WX + b logits = tf.add(tf.matmul(features, weights),biases) prediction = tf.nn.softmax(logits) # Cross entropy cross_entropy = -tf.reduce_sum(labels * tf.log(prediction), reduction_indices=1) # Training loss loss = tf.reduce_mean(cross_entropy) # Initializing all variables init = tf.global_variables_initializer() # Determining if the predictions are accurate is_correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(labels, 1)) # Calculating prediction accuracy accuracy = tf.reduce_mean(tf.cast(is_correct_prediction, tf.float32))
Now we can begin training the model, as shown in the following code snippet:
#Beginning the session with tf.Session() as sess: # initializing all the variables sess.run(init) total_batch = int(len(mnist.train.labels) / batch_size) for epoch in range(epochs): avg_cost = 0 for i in range(total_batch): batch_x, batch_y = mnist.train.next_batch(batch_size=batch_size) _, c = sess.run([optimizer,loss], feed_dict={features: batch_x, labels: batch_y}) avg_cost += c / total_batch print("Epoch:", (epoch + 1), "cost =", "{:.3f}".format(avg_cost)) print(sess.run(accuracy, feed_dict={features: mnist.test.images, labels: mnist.test.labels}))