DEV Community 👩‍💻👨‍💻

Cover image for Hand Digit Prediction using Neural Networks and Tensorflow
Rohith ND
Rohith ND

Posted on

Hand Digit Prediction using Neural Networks and Tensorflow

In this blog, I'll show you how to train a neural network model using the MNIST dataset, as well as how to predict the digits in them using images.

Make sure you have the Tensorflow package installed, as it will be utilised as a Deep Learning library here.

Let's import all packages which are necessary for us

import os  
import cv2 
import matplotlib.pyplot as plt 
import tensorflow as tf 
import numpy as np
Enter fullscreen mode Exit fullscreen mode

After we've imported all of the essential packages, we'll need to import the MNIST dataset, which will let us train our model. We'll split the dataset into training and testing after it's imported.

mnist = tf.keras.datasets.mnist 
(x_train , y_train) , (x_test , y_test) = mnist.load_data() 
x_train = tf.keras.utils.normalize(x_train , axis = 1)
x_test = tf.keras.utils.normalize(x_test , axis=1) 
Enter fullscreen mode Exit fullscreen mode

It's now time to put our neural network model together. Let's make our Network model with Keras.

We'll use a Flatten layer to reshape our image's dimensions to a single dimension. A Dense layer of 128 neurons , 128 neurons and 64 neurons will constitute the second , third and fourth layers, respectively. The final output layer is the Dense layer, which has 10 neurons because our MNIST dataset has ten different classes.

model = tf.keras.Sequential() 
model.add(tf.keras.layers.Flatten(input_shape = (28 , 28))) 
model.add(tf.keras.layers.Dense(128 , activation='relu'))
model.add(tf.keras.layers.Dense(128 , activation='relu'))
model.add(tf.keras.layers.Dense(64 , activation='relu'))
model.add(tf.keras.layers.Dense(10 , activation='softmax')) 
Enter fullscreen mode Exit fullscreen mode

Later let's compile the network model by specifying adam for optimizer , accuracy for metrices and sparse_categorical_crossentropy for loss

model.compile(optimizer='adam' , loss='sparse_categorical_crossentropy' , metrics=['accuracy']) 
Enter fullscreen mode Exit fullscreen mode

Finally, we'll use the fit function to train our model.


We must test our model after it has been trained. We'll be providing input images that were generated with figma.
Let's make a folder called digits and then put our digit images within it as digit1.png, digit2.png, and so on.

def predict_img(model):  
    image_number = 1
    while os.path.isfile(f"digits/digit{image_number}.png"):
        img = cv2.imread(f"digits/digit{image_number}.png")[:,:,0] 
        img = cv2.resize(img,(28 , 28))     
        img = np.invert(np.array([img]))
        prediction = model.predict(img) 
        print(f"This digit is probably a {np.argmax(prediction)}") 
        plt.imshow(img[0] , cmap =  
        image_number += 1 
Enter fullscreen mode Exit fullscreen mode

Let's use the model as a parameter to call this function.

Enter fullscreen mode Exit fullscreen mode

As a result, you'll get a series of photos like the ones below

digit 1

digit 2

Now, let's try in a different approach by saving our model as hand_digit.h5 and using that model to make our predictions.'hand_digit.h5')

loaded_model = tf.keras.models.load_model('hand_digit.h5') 

loss , accuracy = model.evaluate(x_test , y_test ) 

Enter fullscreen mode Exit fullscreen mode

As a result, our final output will look like this



As a result, I've developed other networks and worked on them. The jupyter file can be found on my github repository.

Github Repo :

Hope i think this blog helps you to create your own CNN model for Hand Digit Recognition

Top comments (0)

Timeless DEV post...

How to write a kickass README

Arguably the single most important piece of documentation for any open source project is the README. A good README not only informs people what the project does and who it is for but also how they use and contribute to it.

If you write a README without sufficient explanation of what your project does or how people can use it then it pretty much defeats the purpose of being open source as other developers are less likely to engage with or contribute towards it.