ConvoNets for Mnist in Keras

"The MNIST database (Modified National Institute of Standards and Technology database) is a large database of handwritten digits that is commonly used for training various image processing systems. The database is also widely used for training and testing in the field of machine learning. It was created by "re-mixing" the samples from NIST's original datasets. The creators felt that since NIST's training dataset was taken from American Census Bureau employees, while the testing dataset was taken from American high school students, it was not well-suited for machine learning experiments.[5] Furthermore, the black and white images from NIST were normalized to fit into a 20x20 pixel bounding box and anti-aliased, which introduced grayscale levels."

https://en.wikipedia.org/wiki/MNIST_database

If you have not already installed, keras do so before proceeding by using pip:

pip install keras

Let's begin!


In [ ]:
import keras

from keras.datasets.mnist import load_data
from keras.utils.data_utils import get_file
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Dropout, Flatten

from __future__ import print_function
from keras.datasets import mnist
from keras.models import Sequential
from keras import backend as K

In [ ]:
(x_train, y_train), (x_test, y_test) = load_data()
print(x_train.shape)

This is the mnist example provided with the Keras code base.

Batch size defines number of samples that going to be propagated through the network. Batching helps the network to train faster and to use less memory.

Classes are the categories that our image data falls into; in this case, there are 10 digits.

Epoches are the number of training iterations a network goes through. In general, model accuracy improves with more epochs of training.


In [3]:
batch_size = 128
num_classes = 10
epochs = 12

# input image dimensions
img_rows, img_cols = 28, 28

In [4]:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')


x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples

In [5]:
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

In [5]:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,
          verbose=1, validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])


(60000, 28, 28)
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 164s - loss: 0.3283 - acc: 0.9010 - val_loss: 0.0839 - val_acc: 0.9729
Epoch 2/12
60000/60000 [==============================] - 182s - loss: 0.1152 - acc: 0.9651 - val_loss: 0.0559 - val_acc: 0.9815
Epoch 3/12
60000/60000 [==============================] - 187s - loss: 0.0860 - acc: 0.9749 - val_loss: 0.0453 - val_acc: 0.9847
Epoch 4/12
60000/60000 [==============================] - 213s - loss: 0.0738 - acc: 0.9777 - val_loss: 0.0431 - val_acc: 0.9857
Epoch 5/12
60000/60000 [==============================] - 197s - loss: 0.0649 - acc: 0.9809 - val_loss: 0.0367 - val_acc: 0.9876
Epoch 6/12
60000/60000 [==============================] - 169s - loss: 0.0559 - acc: 0.9831 - val_loss: 0.0321 - val_acc: 0.9893
Epoch 7/12
60000/60000 [==============================] - 173s - loss: 0.0501 - acc: 0.9849 - val_loss: 0.0305 - val_acc: 0.9890
Epoch 8/12
60000/60000 [==============================] - 188s - loss: 0.0480 - acc: 0.9857 - val_loss: 0.0326 - val_acc: 0.9891
Epoch 9/12
60000/60000 [==============================] - 191s - loss: 0.0450 - acc: 0.9863 - val_loss: 0.0293 - val_acc: 0.9898
Epoch 10/12
60000/60000 [==============================] - 177s - loss: 0.0412 - acc: 0.9876 - val_loss: 0.0287 - val_acc: 0.9905
Epoch 11/12
60000/60000 [==============================] - 179s - loss: 0.0403 - acc: 0.9881 - val_loss: 0.0304 - val_acc: 0.9902
Epoch 12/12
60000/60000 [==============================] - 184s - loss: 0.0358 - acc: 0.9889 - val_loss: 0.0282 - val_acc: 0.9906
Test loss: 0.0281902231486
Test accuracy: 0.9906