AITS Journal
Published in

AITS Journal

Kannada MNIST using NN

Photo by Alexandra on Dribbble

MNIST like dataset for Kannada handwritten digits

The goal of this competition is to provide a simple extension to the classic MNIST competition we’re all familiar with. Instead of using Arabic numerals, it uses a recently-released dataset of Kannada digits.

Kannada is a language spoken predominantly by the people of Karnataka in southwestern India. The language has roughly 45 million native speakers and is written using the Kannada script. Wikipedia

This competition uses the same format as the MNIST competition in terms of how the data is structured, but it’s different in that it is a synchronous re-run Kernels competition. You write your code in a Kaggle Notebook, and when you submit the results, your code is scored on both the public test set, as well as a private (unseen) test set.

Technical Information

All details of the dataset curation have been captured in the paper titled: Prabhu, Vinay Uday. “Kannada-MNIST: A new handwritten digits dataset for the Kannada language.” arXiv preprint arXiv:1908.01242 (2019)

The GitHub repo of the author can be found here.

On the originally posted dataset, the author suggests some interesting questions you may be interested in exploring. Please note, although this dataset has been released in full, the purpose of this competition is for practice, not to find the labels to submit a perfect score.

In addition to the main dataset, the author also disseminated an additional real-world handwritten dataset (with 10k images), termed as the ‘Dig-MNIST dataset’ that can serve as an out-of-domain test dataset. It was created with the help of volunteers that were non-native users of the language, authored on a smaller sheet, and scanned with different scanner settings compared to the main dataset. This ‘dig-MNIST’ dataset serves as a more difficult test-set (An accuracy of 76.1% was reported in the paper cited above) and achieving ~98+% accuracy on this test dataset would be rather commendable.

Importing Libraries

Import Data

Data Preprocessing

Index(['id', 'pixel0', 'pixel1', 'pixel2', 'pixel3', 'pixel4', 'pixel5',
'pixel6', 'pixel7', 'pixel8',
...
'pixel774', 'pixel775', 'pixel776', 'pixel777', 'pixel778', 'pixel779',
'pixel780', 'pixel781', 'pixel782', 'pixel783'],
dtype='object', length=785)

Train Test Split

(48000, 28, 28)
(48000,)
(12000, 28, 28)
(12000,)
(5000, 28, 28)

Model Architecture

Model: "functional_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28, 1)] 0
_________________________________________________________________
conv1 (Conv2D) (None, 28, 28, 16) 160
_________________________________________________________________
batch1 (BatchNormalization) (None, 28, 28, 16) 64
_________________________________________________________________
relu1 (Activation) (None, 28, 28, 16) 0
_________________________________________________________________
dropout (Dropout) (None, 28, 28, 16) 0
_________________________________________________________________
conv2 (Conv2D) (None, 28, 28, 32) 4640
_________________________________________________________________
batch2 (BatchNormalization) (None, 28, 28, 32) 128
_________________________________________________________________
relu2 (Activation) (None, 28, 28, 32) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 28, 28, 32) 0
_________________________________________________________________
max2 (MaxPooling2D) (None, 14, 14, 32) 0
_________________________________________________________________
conv3 (Conv2D) (None, 14, 14, 64) 51264
_________________________________________________________________
batch3 (BatchNormalization) (None, 14, 14, 64) 256
_________________________________________________________________
relu3 (Activation) (None, 14, 14, 64) 0
_________________________________________________________________
max3 (MaxPooling2D) (None, 7, 7, 64) 0
_________________________________________________________________
conv4 (Conv2D) (None, 7, 7, 64) 102464
_________________________________________________________________
batch4 (BatchNormalization) (None, 7, 7, 64) 256
_________________________________________________________________
relu4 (Activation) (None, 7, 7, 64) 0
_________________________________________________________________
dropout_2 (Dropout) (None, 7, 7, 64) 0
_________________________________________________________________
conv5 (Conv2D) (None, 7, 7, 32) 18464
_________________________________________________________________
batch5 (BatchNormalization) (None, 7, 7, 32) 128
_________________________________________________________________
relu5 (Activation) (None, 7, 7, 32) 0
_________________________________________________________________
dropout_3 (Dropout) (None, 7, 7, 32) 0
_________________________________________________________________
conv6 (Conv2D) (None, 7, 7, 16) 4624
_________________________________________________________________
batch6 (BatchNormalization) (None, 7, 7, 16) 64
_________________________________________________________________
relu6 (Activation) (None, 7, 7, 16) 0
_________________________________________________________________
dropout_4 (Dropout) (None, 7, 7, 16) 0
_________________________________________________________________
flatten (Flatten) (None, 784) 0
_________________________________________________________________
Dense1 (Dense) (None, 50) 39250
_________________________________________________________________
relu7 (Activation) (None, 50) 0
_________________________________________________________________
dropout_5 (Dropout) (None, 50) 0
_________________________________________________________________
Dense2 (Dense) (None, 25) 1275
_________________________________________________________________
relu8 (Activation) (None, 25) 0
_________________________________________________________________
dropout_6 (Dropout) (None, 25) 0
_________________________________________________________________
Dense3 (Dense) (None, 10) 260
_________________________________________________________________
activation (Activation) (None, 10) 0
=================================================================
Total params: 223,297
Trainable params: 222,849
Non-trainable params: 448
_________________________________________________________________
None

Training the model

Epoch 1/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0584 - accuracy: 0.9826 - val_loss: 0.0243 - val_accuracy: 0.9942
Epoch 2/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0555 - accuracy: 0.9834 - val_loss: 0.0205 - val_accuracy: 0.9943
Epoch 3/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0554 - accuracy: 0.9832 - val_loss: 0.0218 - val_accuracy: 0.9933
Epoch 4/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0478 - accuracy: 0.9857 - val_loss: 0.0123 - val_accuracy: 0.9965
Epoch 5/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0477 - accuracy: 0.9861 - val_loss: 0.0141 - val_accuracy: 0.9960
Epoch 6/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0463 - accuracy: 0.9862 - val_loss: 0.0111 - val_accuracy: 0.9966
Epoch 7/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0478 - accuracy: 0.9856 - val_loss: 0.0126 - val_accuracy: 0.9961
Epoch 8/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0446 - accuracy: 0.9865 - val_loss: 0.0163 - val_accuracy: 0.9956
Epoch 9/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0412 - accuracy: 0.9874 - val_loss: 0.0121 - val_accuracy: 0.9967
Epoch 10/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0410 - accuracy: 0.9875 - val_loss: 0.0112 - val_accuracy: 0.9968
Epoch 11/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0404 - accuracy: 0.9876 - val_loss: 0.0133 - val_accuracy: 0.9960
Epoch 12/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0386 - accuracy: 0.9881 - val_loss: 0.0113 - val_accuracy: 0.9965
Epoch 13/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0354 - accuracy: 0.9890 - val_loss: 0.0149 - val_accuracy: 0.9955
Epoch 14/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0358 - accuracy: 0.9895 - val_loss: 0.0139 - val_accuracy: 0.9964
Epoch 15/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0331 - accuracy: 0.9894 - val_loss: 0.0125 - val_accuracy: 0.9968
Epoch 16/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0360 - accuracy: 0.9885 - val_loss: 0.0116 - val_accuracy: 0.9966
Epoch 17/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 11s - loss: 0.0352 - accuracy: 0.9900 - val_loss: 0.0144 - val_accuracy: 0.9962
Epoch 18/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0322 - accuracy: 0.9904 - val_loss: 0.0104 - val_accuracy: 0.9973
Epoch 19/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0324 - accuracy: 0.9901 - val_loss: 0.0098 - val_accuracy: 0.9973
Epoch 20/20
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
1500/1500 - 10s - loss: 0.0330 - accuracy: 0.9901 - val_loss: 0.0108 - val_accuracy: 0.9967

Accuracy Loss Graphs

Result and Prediction

array([3, 0, 2, ..., 1, 6, 3])

DeepCC

[INFO]
Reading [keras model] 'model.h5'
[SUCCESS]
Saved 'model_deepC/model.onnx'
[INFO]
Reading [onnx model] 'model_deepC/model.onnx'
[INFO]
Model info:
ir_vesion : 5
doc :
[WARNING]
[ONNX]: graph-node conv1's attribute auto_pad has no meaningful data.
[WARNING]
[ONNX]: graph-node conv2's attribute auto_pad has no meaningful data.
[WARNING]
[ONNX]: graph-node conv3's attribute auto_pad has no meaningful data.
[WARNING]
[ONNX]: graph-node conv4's attribute auto_pad has no meaningful data.
[WARNING]
[ONNX]: graph-node conv5's attribute auto_pad has no meaningful data.
[WARNING]
[ONNX]: graph-node conv6's attribute auto_pad has no meaningful data.
[WARNING]
[ONNX]: terminal (input/output) input_1's shape is less than 1. Changing it to 1.
[WARNING]
[ONNX]: terminal (input/output) activation's shape is less than 1. Changing it to 1.
[INFO]
Running DNNC graph sanity check ...
[SUCCESS]
Passed sanity check.
[INFO]
Writing C++ file 'model_deepC/model.cpp'
[INFO]
deepSea model files are ready in 'model_deepC/'
[RUNNING COMMAND]
g++ -std=c++11 -O3 -fno-rtti -fno-exceptions -I. -I/opt/tljh/user/lib/python3.7/site-packages/deepC-0.13-py3.7-linux-x86_64.egg/deepC/include -isystem /opt/tljh/user/lib/python3.7/site-packages/deepC-0.13-py3.7-linux-x86_64.egg/deepC/packages/eigen-eigen-323c052e1731 "model_deepC/model.cpp" -D_AITS_MAIN -o "model_deepC/model.exe"
[RUNNING COMMAND]
size "model_deepC/model.exe"
text data bss dec hex filename
1075765 3784 760 1080309 107bf5 model_deepC/model.exe
[SUCCESS]
Saved model as executable "model_deepC/model.exe"

Notebook Link- Here

Credits: Siddharth Ganjoo

--

--

--

AI content from AITS associates with 💝. AITS is a deep learning company and lead developer of open source deep learning compiler.

Recommended from Medium

Next day rain prediction — on cAInvas

Software Developers: You’re Learning Machine Learning Upside Down

Using Deep Learning to Create a Stock Trading Bot

Document Denoising Using Deep Learning

Training Generative Adversarial Networks (GANs) for DOG using PyTorch

Gradient Descent — What, Why and How of the optimized algorithm

Understanding Few Shot Learning With Prototypical Networks

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
AI Technology & Systems

AI Technology & Systems

Simplifying AI development for EDGE devices

More from Medium

How to use facial landmarks obtained from dlib

I Converted the normal Image into cartoonish with OpenCV in Python

Real Time Object Detection with YOLO

Learning the ASL Alphabet with Computer Vision and Flask