In [1]:
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils


Using Theano backend.

In [2]:
#Loading the training and testing data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
img_rows, img_cols = 28, 28
X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

In [3]:
print(X_train.shape)


(60000, 1, 28, 28)

In [4]:
#Seed for reproducibilty
np.random.seed(1338)

#Selecting 6000 random examples from the test data
test_rows = np.random.randint(0,X_test.shape[0],6000)
X_test = X_test[test_rows]
Y = y_test[test_rows]
#Converting the output to binary classification(Six=1,Not Six=0)
Y_test = Y == 6
Y_test = Y_test.astype(int)

#Selecting the 5918 examples where the output is 6
X_six = X_train[y_train == 6]
Y_six = y_train[y_train == 6]
#Selecting the examples where the output is not 6
X_not_six = X_train[y_train != 6]
Y_not_six = y_train[y_train != 6]

#Selecting 6000 random examples from the data that contains only the data where the output is not 6
random_rows = np.random.randint(0,X_not_six.shape[0],6000)
X_not_six = X_not_six[random_rows]
Y_not_six = Y_not_six[random_rows]

In [5]:
#Appending the data with output as 6 and data with output as not six
X_train = np.append(X_six,X_not_six)
#Reshaping the appended data to appropraite form
X_train = X_train.reshape(X_six.shape[0] + X_not_six.shape[0], 1, img_rows, img_cols)
#Appending the labels and converting the labels to binary classification(Six=1,Not Six=0)
Y_labels = np.append(Y_six,Y_not_six)
Y_train = Y_labels == 6 
Y_train = Y_train.astype(int)

In [6]:
#Converting the classes to its binary categorical form
nb_classes = 2
Y_train = np_utils.to_categorical(Y_train, nb_classes)
Y_test = np_utils.to_categorical(Y_test, nb_classes)

In [11]:
#Initializing the values for the convolution neural network
nb_epoch = 12
batch_size = 128
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
nb_pool = [2,3,4]
#nb_pool = 2
# convolution kernel size
nb_conv = 3
#Activation Functions
activations = ['relu','tanh','sigmoid']

In [8]:
#Function for constructing the convolution neural network
def build_model(nb_pool,activation):
    
    np.random.seed(1338)
    model = Sequential()
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
                        border_mode='valid',
                        input_shape=(1, img_rows, img_cols)))
    model.add(Activation(activation))
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
    model.add(Activation(activation))
    model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    model.add(Dropout(0.25))
    
    model.add(Flatten())
    model.add(Dense(128))
    model.add(Activation(activation))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))
    
    model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])

    model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,verbose=1,
              validation_data=(X_test, Y_test))
          

    score = model.evaluate(X_test, Y_test, verbose=0)
    print('Test score:', score[0])
    print('Test accuracy:', score[1])

In [9]:
for i in activations:
    print('ACTIVATION',i,'\n')
    %timeit -n1 -r1 build_model(2,i)
    print('\n')


ACTIVATION relu 

Train on 11918 samples, validate on 6000 samples
Epoch 1/12
11918/11918 [==============================] - 27s - loss: 0.1442 - acc: 0.9535 - val_loss: 0.1519 - val_acc: 0.9440
Epoch 2/12
11918/11918 [==============================] - 31s - loss: 0.0346 - acc: 0.9883 - val_loss: 0.0294 - val_acc: 0.9907
Epoch 3/12
11918/11918 [==============================] - 60s - loss: 0.0204 - acc: 0.9930 - val_loss: 0.0191 - val_acc: 0.9932
Epoch 4/12
11918/11918 [==============================] - 61s - loss: 0.0154 - acc: 0.9939 - val_loss: 0.0455 - val_acc: 0.9820
Epoch 5/12
11918/11918 [==============================] - 61s - loss: 0.0121 - acc: 0.9956 - val_loss: 0.0263 - val_acc: 0.9912
Epoch 6/12
11918/11918 [==============================] - 56s - loss: 0.0113 - acc: 0.9960 - val_loss: 0.0191 - val_acc: 0.9935
Epoch 7/12
11918/11918 [==============================] - 64s - loss: 0.0089 - acc: 0.9962 - val_loss: 0.0209 - val_acc: 0.9945
Epoch 8/12
11918/11918 [==============================] - 55s - loss: 0.0071 - acc: 0.9972 - val_loss: 0.0294 - val_acc: 0.9910
Epoch 9/12
11918/11918 [==============================] - 28s - loss: 0.0080 - acc: 0.9971 - val_loss: 0.0236 - val_acc: 0.9937
Epoch 10/12
11918/11918 [==============================] - 28s - loss: 0.0054 - acc: 0.9982 - val_loss: 0.0174 - val_acc: 0.9947
Epoch 11/12
11918/11918 [==============================] - 28s - loss: 0.0050 - acc: 0.9985 - val_loss: 0.0292 - val_acc: 0.9918
Epoch 12/12
11918/11918 [==============================] - 28s - loss: 0.0031 - acc: 0.9989 - val_loss: 0.0173 - val_acc: 0.9962
Test score: 0.0173432658147
Test accuracy: 0.996166666667
1 loop, best of 1: 8min 57s per loop


ACTIVATION tanh 

Train on 11918 samples, validate on 6000 samples
Epoch 1/12
11918/11918 [==============================] - 43s - loss: 0.1996 - acc: 0.9466 - val_loss: 0.3305 - val_acc: 0.8812
Epoch 2/12
11918/11918 [==============================] - 48s - loss: 0.0511 - acc: 0.9824 - val_loss: 0.0567 - val_acc: 0.9790
Epoch 3/12
11918/11918 [==============================] - 46s - loss: 0.0299 - acc: 0.9884 - val_loss: 0.0235 - val_acc: 0.9927
Epoch 4/12
11918/11918 [==============================] - 47s - loss: 0.0224 - acc: 0.9920 - val_loss: 0.0663 - val_acc: 0.9777
Epoch 5/12
11918/11918 [==============================] - 48s - loss: 0.0171 - acc: 0.9930 - val_loss: 0.0355 - val_acc: 0.9888
Epoch 6/12
11918/11918 [==============================] - 42s - loss: 0.0123 - acc: 0.9958 - val_loss: 0.0253 - val_acc: 0.9927
Epoch 7/12
11918/11918 [==============================] - 42s - loss: 0.0109 - acc: 0.9959 - val_loss: 0.0317 - val_acc: 0.9928
Epoch 8/12
11918/11918 [==============================] - 42s - loss: 0.0114 - acc: 0.9957 - val_loss: 0.0471 - val_acc: 0.9857
Epoch 9/12
11918/11918 [==============================] - 42s - loss: 0.0078 - acc: 0.9971 - val_loss: 0.0258 - val_acc: 0.9925
Epoch 10/12
11918/11918 [==============================] - 45s - loss: 0.0081 - acc: 0.9971 - val_loss: 0.0308 - val_acc: 0.9917
Epoch 11/12
11918/11918 [==============================] - 42s - loss: 0.0058 - acc: 0.9976 - val_loss: 0.0326 - val_acc: 0.9930
Epoch 12/12
11918/11918 [==============================] - 43s - loss: 0.0063 - acc: 0.9977 - val_loss: 0.0222 - val_acc: 0.9943
Test score: 0.0222055547351
Test accuracy: 0.994333333333
1 loop, best of 1: 9min 9s per loop


ACTIVATION sigmoid 

Train on 11918 samples, validate on 6000 samples
Epoch 1/12
11918/11918 [==============================] - 43s - loss: 0.7940 - acc: 0.5111 - val_loss: 1.0980 - val_acc: 0.0990
Epoch 2/12
11918/11918 [==============================] - 43s - loss: 0.4463 - acc: 0.7594 - val_loss: 0.2560 - val_acc: 0.8947
Epoch 3/12
11918/11918 [==============================] - 43s - loss: 0.1374 - acc: 0.9513 - val_loss: 0.0583 - val_acc: 0.9792
Epoch 4/12
11918/11918 [==============================] - 43s - loss: 0.1057 - acc: 0.9623 - val_loss: 0.0924 - val_acc: 0.9687
Epoch 5/12
11918/11918 [==============================] - 43s - loss: 0.0935 - acc: 0.9666 - val_loss: 0.0529 - val_acc: 0.9817
Epoch 6/12
11918/11918 [==============================] - 46s - loss: 0.0907 - acc: 0.9682 - val_loss: 0.0736 - val_acc: 0.9722
Epoch 7/12
11918/11918 [==============================] - 88s - loss: 0.0793 - acc: 0.9713 - val_loss: 0.0538 - val_acc: 0.9813
Epoch 8/12
11918/11918 [==============================] - 93s - loss: 0.0782 - acc: 0.9729 - val_loss: 0.0577 - val_acc: 0.9777
Epoch 9/12
11918/11918 [==============================] - 87s - loss: 0.0697 - acc: 0.9763 - val_loss: 0.0424 - val_acc: 0.9858
Epoch 10/12
11918/11918 [==============================] - 84s - loss: 0.0641 - acc: 0.9766 - val_loss: 0.0319 - val_acc: 0.9903
Epoch 11/12
11918/11918 [==============================] - 78s - loss: 0.0579 - acc: 0.9789 - val_loss: 0.0628 - val_acc: 0.9758
Epoch 12/12
11918/11918 [==============================] - 78s - loss: 0.0537 - acc: 0.9810 - val_loss: 0.0284 - val_acc: 0.9910
Test score: 0.0283893372539
Test accuracy: 0.991
1 loop, best of 1: 13min 12s per loop



In [12]:
for i in nb_pool:
    print('MAX POOL',i,'\n')
    %timeit -n1 -r1 build_model(i,'relu')
    print('\n')


MAX POOL 2 

Train on 11918 samples, validate on 6000 samples
Epoch 1/12
11918/11918 [==============================] - 67s - loss: 0.1442 - acc: 0.9535 - val_loss: 0.1519 - val_acc: 0.9440
Epoch 2/12
11918/11918 [==============================] - 69s - loss: 0.0346 - acc: 0.9883 - val_loss: 0.0294 - val_acc: 0.9907
Epoch 3/12
11918/11918 [==============================] - 69s - loss: 0.0204 - acc: 0.9930 - val_loss: 0.0191 - val_acc: 0.9932
Epoch 4/12
11918/11918 [==============================] - 63s - loss: 0.0154 - acc: 0.9939 - val_loss: 0.0455 - val_acc: 0.9820
Epoch 5/12
11918/11918 [==============================] - 60s - loss: 0.0121 - acc: 0.9956 - val_loss: 0.0263 - val_acc: 0.9912
Epoch 6/12
11918/11918 [==============================] - 55s - loss: 0.0113 - acc: 0.9960 - val_loss: 0.0191 - val_acc: 0.9935
Epoch 7/12
11918/11918 [==============================] - 58s - loss: 0.0089 - acc: 0.9962 - val_loss: 0.0209 - val_acc: 0.9945
Epoch 8/12
11918/11918 [==============================] - 55s - loss: 0.0071 - acc: 0.9972 - val_loss: 0.0294 - val_acc: 0.9910
Epoch 9/12
11918/11918 [==============================] - 55s - loss: 0.0080 - acc: 0.9971 - val_loss: 0.0236 - val_acc: 0.9937
Epoch 10/12
11918/11918 [==============================] - 50s - loss: 0.0054 - acc: 0.9982 - val_loss: 0.0174 - val_acc: 0.9947
Epoch 11/12
11918/11918 [==============================] - 49s - loss: 0.0050 - acc: 0.9985 - val_loss: 0.0292 - val_acc: 0.9918
Epoch 12/12
11918/11918 [==============================] - 51s - loss: 0.0031 - acc: 0.9989 - val_loss: 0.0173 - val_acc: 0.9962
Test score: 0.0173432658147
Test accuracy: 0.996166666667
1 loop, best of 1: 11min 58s per loop


MAX POOL 3 

Train on 11918 samples, validate on 6000 samples
Epoch 1/12
11918/11918 [==============================] - 46s - loss: 0.1352 - acc: 0.9544 - val_loss: 0.0196 - val_acc: 0.9948
Epoch 2/12
11918/11918 [==============================] - 58s - loss: 0.0350 - acc: 0.9877 - val_loss: 0.0171 - val_acc: 0.9945
Epoch 3/12
11918/11918 [==============================] - 28s - loss: 0.0256 - acc: 0.9909 - val_loss: 0.0257 - val_acc: 0.9922
Epoch 4/12
11918/11918 [==============================] - 30s - loss: 0.0214 - acc: 0.9925 - val_loss: 0.0167 - val_acc: 0.9940
Epoch 5/12
11918/11918 [==============================] - 28s - loss: 0.0175 - acc: 0.9944 - val_loss: 0.0168 - val_acc: 0.9955
Epoch 6/12
11918/11918 [==============================] - 29s - loss: 0.0113 - acc: 0.9959 - val_loss: 0.0128 - val_acc: 0.9967
Epoch 7/12
11918/11918 [==============================] - 27s - loss: 0.0133 - acc: 0.9952 - val_loss: 0.0206 - val_acc: 0.9918
Epoch 8/12
11918/11918 [==============================] - 27s - loss: 0.0081 - acc: 0.9971 - val_loss: 0.0140 - val_acc: 0.9963
Epoch 9/12
11918/11918 [==============================] - 27s - loss: 0.0095 - acc: 0.9968 - val_loss: 0.0185 - val_acc: 0.9930
Epoch 10/12
11918/11918 [==============================] - 27s - loss: 0.0081 - acc: 0.9970 - val_loss: 0.0178 - val_acc: 0.9953
Epoch 11/12
11918/11918 [==============================] - 27s - loss: 0.0064 - acc: 0.9981 - val_loss: 0.0193 - val_acc: 0.9943
Epoch 12/12
11918/11918 [==============================] - 27s - loss: 0.0045 - acc: 0.9987 - val_loss: 0.0422 - val_acc: 0.9895
Test score: 0.0421693664664
Test accuracy: 0.9895
1 loop, best of 1: 6min 39s per loop


MAX POOL 4 

Train on 11918 samples, validate on 6000 samples
Epoch 1/12
11918/11918 [==============================] - 26s - loss: 0.1588 - acc: 0.9416 - val_loss: 0.0319 - val_acc: 0.9895
Epoch 2/12
11918/11918 [==============================] - 26s - loss: 0.0433 - acc: 0.9861 - val_loss: 0.0419 - val_acc: 0.9860
Epoch 3/12
11918/11918 [==============================] - 26s - loss: 0.0315 - acc: 0.9889 - val_loss: 0.0287 - val_acc: 0.9898
Epoch 4/12
11918/11918 [==============================] - 26s - loss: 0.0223 - acc: 0.9927 - val_loss: 0.0164 - val_acc: 0.9938
Epoch 5/12
11918/11918 [==============================] - 29s - loss: 0.0219 - acc: 0.9926 - val_loss: 0.0233 - val_acc: 0.9907
Epoch 6/12
11918/11918 [==============================] - 27s - loss: 0.0165 - acc: 0.9937 - val_loss: 0.0129 - val_acc: 0.9960
Epoch 7/12
11918/11918 [==============================] - 27s - loss: 0.0143 - acc: 0.9948 - val_loss: 0.0124 - val_acc: 0.9965
Epoch 8/12
11918/11918 [==============================] - 27s - loss: 0.0115 - acc: 0.9961 - val_loss: 0.0216 - val_acc: 0.9913
Epoch 9/12
11918/11918 [==============================] - 27s - loss: 0.0097 - acc: 0.9967 - val_loss: 0.0265 - val_acc: 0.9898
Epoch 10/12
11918/11918 [==============================] - 28s - loss: 0.0109 - acc: 0.9963 - val_loss: 0.0164 - val_acc: 0.9938
Epoch 11/12
11918/11918 [==============================] - 43s - loss: 0.0087 - acc: 0.9966 - val_loss: 0.0147 - val_acc: 0.9960
Epoch 12/12
11918/11918 [==============================] - 45s - loss: 0.0079 - acc: 0.9977 - val_loss: 0.0169 - val_acc: 0.9942
Test score: 0.0168953994454
Test accuracy: 0.994166666667
1 loop, best of 1: 6min 10s per loop



In [ ]:
#Timing how long it takes to build the model and test it.

#%timeit -n1 -r1 build_model()

In [ ]:


In [ ]:


In [ ]: