In [1]:
%pylab inline
import os
import numpy as np
import pandas as pd
from scipy.misc import imread
from sklearn.metrics import accuracy_score

import tensorflow as tf
import keras

# Get data from here: https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-digits/


Populating the interactive namespace from numpy and matplotlib
Using TensorFlow backend.

In [4]:
seed = 410
rng = np.random.RandomState(seed)

In [5]:
train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')

train.head()


Out[5]:
filename label
0 0.png 4
1 1.png 9
2 2.png 1
3 3.png 7
4 4.png 3

In [51]:
img_name = rng.choice(train.filename)
training_image_path = 'data/Images/train/' + img_name

training_img = imread(training_image_path, flatten=True)

pylab.imshow(training_img, cmap='gray')
pylab.axis('off')
pylab.show()



In [12]:
# Each image is represented as numpy array

training_img


Out[12]:
array([[   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,   10.,   59.,
          59.,   67.,  119.,  156.,  194.,  194.,  156.,  156.,  141.,
          14.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,   62.,  185.,  220.,  253.,
         254.,  253.,  253.,  253.,  253.,  249.,  233.,  239.,  253.,
         185.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,   23.,  229.,  253.,  253.,  253.,
         175.,   92.,   78.,   78.,   78.,   60.,    0.,   48.,  245.,
         253.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,   62.,   48.,   19.,   19.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,   94.,  253.,
         200.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    8.,  205.,  253.,
          80.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,   80.,  254.,  229.,
          23.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,  200.,  253.,  168.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,  214.,  253.,   87.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,   32.,  235.,  253.,   19.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,   59.,  253.,  253.,   19.,
           0.,   23.,   52.,    0.,   76.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,   93.,  134.,  141.,  254.,  254.,  254.,
         254.,  255.,  254.,  213.,  128.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,  149.,  250.,  253.,  254.,  253.,  247.,  218.,
         135.,  113.,   39.,   12.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,   54.,  115.,   78.,  186.,  253.,  107.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,  194.,  234.,    6.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,  194.,  233.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,  255.,  234.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,  254.,  233.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,  186.,  233.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,  141.,  243.,   42.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,   36.,  223.,   18.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
           0.]], dtype=float32)

In [6]:
# store all images as numpy arrays, to make data manipulation easier

temp = []
for img_name in train.filename:
    training_image_path = 'data/Images/train/' + img_name
    training_img = imread(training_image_path, flatten=True)
    img = training_img.astype('float32')
    temp.append(img)
    
train_x = np.stack(temp)

train_x /= 255.0
train_x = train_x.reshape(-1, 784).astype('float32')

temp = []
for img_name in test.filename:
    testing_image_path = 'data/Images/test/' + img_name
    testing_img = imread(testing_image_path, flatten=True)
    img = testing_img.astype('float32')
    temp.append(img)
    
test_x = np.stack(temp)

test_x /= 255.0
test_x = test_x.reshape(-1, 784).astype('float32')

In [53]:
train_x


Out[53]:
array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]], dtype=float32)

In [7]:
train_y = keras.utils.np_utils.to_categorical(train.label.values)

In [8]:
# split into training and validation sets, 7:3

split_size = int(train_x.shape[0]*0.7)

train_x, val_x = train_x[:split_size], train_x[split_size:]
train_y, val_y = train_y[:split_size], train_y[split_size:]

In [56]:
train.label.ix[split_size:]


Out[56]:
34300    3
34301    1
34302    6
34303    8
34304    3
34305    8
34306    8
34307    9
34308    3
34309    8
34310    4
34311    6
34312    6
34313    3
34314    6
34315    7
34316    5
34317    3
34318    0
34319    3
34320    9
34321    3
34322    8
34323    8
34324    7
34325    4
34326    3
34327    8
34328    6
34329    5
        ..
48970    7
48971    5
48972    0
48973    1
48974    4
48975    1
48976    7
48977    5
48978    6
48979    5
48980    6
48981    3
48982    5
48983    5
48984    9
48985    2
48986    9
48987    0
48988    0
48989    7
48990    0
48991    1
48992    1
48993    6
48994    9
48995    2
48996    4
48997    9
48998    3
48999    0
Name: label, dtype: int64

In [57]:
from keras.models import Sequential
from keras.layers import Dense

input_num_units = 784
hidden_num_units = 50
output_num_units = 10

epochs = 5
batch_size = 100


model = Sequential([
  Dense(output_dim=hidden_num_units, input_dim=input_num_units, activation='relu'),
  Dense(output_dim=output_num_units, input_dim=hidden_num_units, activation='softmax'),
])

# compile the model with necessary attributes
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:13: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu", input_dim=784)`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:14: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=10, activation="softmax", input_dim=50)`

In [58]:
# model training

trained_model = model.fit(train_x, train_y, nb_epoch=epochs, batch_size=batch_size, validation_data=(val_x, val_y))


Train on 34300 samples, validate on 14700 samples
Epoch 1/5
34300/34300 [==============================] - 1s - loss: 0.5080 - acc: 0.8657 - val_loss: 0.2955 - val_acc: 0.9162
Epoch 2/5
34300/34300 [==============================] - 1s - loss: 0.2469 - acc: 0.9299 - val_loss: 0.2328 - val_acc: 0.9349
Epoch 3/5
34300/34300 [==============================] - 1s - loss: 0.1932 - acc: 0.9449 - val_loss: 0.1991 - val_acc: 0.9454
Epoch 4/5
34300/34300 [==============================] - 1s - loss: 0.1606 - acc: 0.9538 - val_loss: 0.1810 - val_acc: 0.9477
Epoch 5/5
34300/34300 [==============================] - 1s - loss: 0.1369 - acc: 0.9613 - val_loss: 0.1609 - val_acc: 0.9546

In [77]:
# model evaluation

pred = model.predict_classes(test_x)

img_name = rng.choice(test.filename)
testing_image_path = 'data/Images/test/' + img_name
testing_img = imread(testing_image_path, flatten=True)

test_index = int(img_name.split('.')[0]) - train.shape[0]

print "Prediction is: ", pred[test_index]

pylab.imshow(testing_img, cmap='gray')
pylab.axis('off')
pylab.show()


19296/21000 [==========================>...] - ETA: 0sPrediction is:  9

In [35]:
# Improve the model
## Add hidden layers
## add Dropout to avoid overfitting
## increase epochs to increase training potentials

from keras.layers import Dense, Activation, Dropout, Convolution2D, Flatten, MaxPooling2D, Reshape, InputLayer

input_num_units = 784
hidden1_num_units = 50
hidden2_num_units = 50
hidden3_num_units = 50
hidden4_num_units = 50
hidden5_num_units = 50
output_num_units = 10

epochs = 50
batch_size = 128
model = Sequential([
 Dense(output_dim=hidden1_num_units, input_dim=input_num_units, activation='relu'),
 Dropout(0.2),
 Dense(output_dim=hidden2_num_units, input_dim=hidden1_num_units, activation='relu'),
 Dropout(0.2),
 Dense(output_dim=hidden3_num_units, input_dim=hidden2_num_units, activation='relu'),
 Dropout(0.2),
 Dense(output_dim=hidden4_num_units, input_dim=hidden3_num_units, activation='relu'),
 Dropout(0.2),
 Dense(output_dim=hidden5_num_units, input_dim=hidden4_num_units, activation='relu'),
 Dropout(0.2),

Dense(output_dim=output_num_units, input_dim=hidden5_num_units, activation='softmax'),
])


/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:19: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu", input_dim=784)`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:21: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu", input_dim=50)`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:23: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu", input_dim=50)`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:25: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu", input_dim=50)`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:27: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu", input_dim=50)`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:30: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=10, activation="softmax", input_dim=50)`

In [36]:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_5d_with_drop_more_epochs = model.fit(train_x, train_y, nb_epoch=epochs, 
                                                   batch_size=batch_size, validation_data=(val_x, val_y))


Train on 34300 samples, validate on 14700 samples
Epoch 1/50
34300/34300 [==============================] - 2s - loss: 1.1752 - acc: 0.5934 - val_loss: 0.3836 - val_acc: 0.8929
Epoch 2/50
34300/34300 [==============================] - 1s - loss: 0.4911 - acc: 0.8594 - val_loss: 0.2781 - val_acc: 0.9224
Epoch 3/50
34300/34300 [==============================] - 2s - loss: 0.3748 - acc: 0.8993 - val_loss: 0.2298 - val_acc: 0.9364
Epoch 4/50
34300/34300 [==============================] - 1s - loss: 0.3172 - acc: 0.9155 - val_loss: 0.2131 - val_acc: 0.9420
Epoch 5/50
34300/34300 [==============================] - 1s - loss: 0.2834 - acc: 0.9243 - val_loss: 0.1953 - val_acc: 0.9471
Epoch 6/50
34300/34300 [==============================] - 1s - loss: 0.2648 - acc: 0.9296 - val_loss: 0.1901 - val_acc: 0.9488
Epoch 7/50
34300/34300 [==============================] - 1s - loss: 0.2413 - acc: 0.9371 - val_loss: 0.1849 - val_acc: 0.9504
Epoch 8/50
34300/34300 [==============================] - 2s - loss: 0.2327 - acc: 0.9383 - val_loss: 0.1664 - val_acc: 0.9543
Epoch 9/50
34300/34300 [==============================] - 1s - loss: 0.2172 - acc: 0.9426 - val_loss: 0.1712 - val_acc: 0.9537
Epoch 10/50
34300/34300 [==============================] - 1s - loss: 0.2026 - acc: 0.9466 - val_loss: 0.1734 - val_acc: 0.9544
Epoch 11/50
34300/34300 [==============================] - 1s - loss: 0.1983 - acc: 0.9481 - val_loss: 0.1543 - val_acc: 0.9576
Epoch 12/50
34300/34300 [==============================] - 1s - loss: 0.1907 - acc: 0.9516 - val_loss: 0.1627 - val_acc: 0.9564
Epoch 13/50
34300/34300 [==============================] - 1s - loss: 0.1798 - acc: 0.9522 - val_loss: 0.1694 - val_acc: 0.9548
Epoch 14/50
34300/34300 [==============================] - 1s - loss: 0.1809 - acc: 0.9526 - val_loss: 0.1548 - val_acc: 0.9582
Epoch 15/50
34300/34300 [==============================] - 2s - loss: 0.1714 - acc: 0.9551 - val_loss: 0.1620 - val_acc: 0.9575
Epoch 16/50
34300/34300 [==============================] - 1s - loss: 0.1705 - acc: 0.9543 - val_loss: 0.1528 - val_acc: 0.9578
Epoch 17/50
34300/34300 [==============================] - 1s - loss: 0.1565 - acc: 0.9584 - val_loss: 0.1563 - val_acc: 0.9587
Epoch 18/50
34300/34300 [==============================] - 1s - loss: 0.1554 - acc: 0.9595 - val_loss: 0.1562 - val_acc: 0.9595
Epoch 19/50
34300/34300 [==============================] - 1s - loss: 0.1586 - acc: 0.9585 - val_loss: 0.1518 - val_acc: 0.9595
Epoch 20/50
34300/34300 [==============================] - 2s - loss: 0.1552 - acc: 0.9578 - val_loss: 0.1516 - val_acc: 0.9591
Epoch 21/50
34300/34300 [==============================] - 2s - loss: 0.1535 - acc: 0.9600 - val_loss: 0.1505 - val_acc: 0.9607
Epoch 22/50
34300/34300 [==============================] - 2s - loss: 0.1451 - acc: 0.9619 - val_loss: 0.1513 - val_acc: 0.9620
Epoch 23/50
34300/34300 [==============================] - 2s - loss: 0.1453 - acc: 0.9608 - val_loss: 0.1465 - val_acc: 0.9624
Epoch 24/50
34300/34300 [==============================] - 2s - loss: 0.1360 - acc: 0.9633 - val_loss: 0.1464 - val_acc: 0.9610
Epoch 25/50
34300/34300 [==============================] - 1s - loss: 0.1308 - acc: 0.9651 - val_loss: 0.1384 - val_acc: 0.9636
Epoch 26/50
34300/34300 [==============================] - 1s - loss: 0.1362 - acc: 0.9641 - val_loss: 0.1544 - val_acc: 0.9610
Epoch 27/50
34300/34300 [==============================] - 1s - loss: 0.1329 - acc: 0.9644 - val_loss: 0.1464 - val_acc: 0.9629
Epoch 28/50
34300/34300 [==============================] - 2s - loss: 0.1256 - acc: 0.9671 - val_loss: 0.1495 - val_acc: 0.9627
Epoch 29/50
34300/34300 [==============================] - 1s - loss: 0.1275 - acc: 0.9666 - val_loss: 0.1477 - val_acc: 0.9622
Epoch 30/50
34300/34300 [==============================] - 2s - loss: 0.1304 - acc: 0.9644 - val_loss: 0.1435 - val_acc: 0.9635
Epoch 31/50
34300/34300 [==============================] - 2s - loss: 0.1254 - acc: 0.9671 - val_loss: 0.1431 - val_acc: 0.9629
Epoch 32/50
34300/34300 [==============================] - 2s - loss: 0.1255 - acc: 0.9665 - val_loss: 0.1437 - val_acc: 0.9631
Epoch 33/50
34300/34300 [==============================] - 2s - loss: 0.1193 - acc: 0.9674 - val_loss: 0.1463 - val_acc: 0.9642
Epoch 34/50
34300/34300 [==============================] - 2s - loss: 0.1202 - acc: 0.9682 - val_loss: 0.1442 - val_acc: 0.9646
Epoch 35/50
34300/34300 [==============================] - 2s - loss: 0.1217 - acc: 0.9678 - val_loss: 0.1515 - val_acc: 0.9610
Epoch 36/50
34300/34300 [==============================] - 2s - loss: 0.1185 - acc: 0.9683 - val_loss: 0.1464 - val_acc: 0.9631
Epoch 37/50
34300/34300 [==============================] - 2s - loss: 0.1187 - acc: 0.9679 - val_loss: 0.1473 - val_acc: 0.9630
Epoch 38/50
34300/34300 [==============================] - 2s - loss: 0.1146 - acc: 0.9693 - val_loss: 0.1501 - val_acc: 0.9645
Epoch 39/50
34300/34300 [==============================] - 2s - loss: 0.1112 - acc: 0.9701 - val_loss: 0.1442 - val_acc: 0.9641
Epoch 40/50
34300/34300 [==============================] - 2s - loss: 0.1110 - acc: 0.9697 - val_loss: 0.1424 - val_acc: 0.9656
Epoch 41/50
34300/34300 [==============================] - 2s - loss: 0.1143 - acc: 0.9685 - val_loss: 0.1429 - val_acc: 0.9626
Epoch 42/50
34300/34300 [==============================] - 2s - loss: 0.1133 - acc: 0.9695 - val_loss: 0.1444 - val_acc: 0.9635
Epoch 43/50
34300/34300 [==============================] - 2s - loss: 0.1049 - acc: 0.9716 - val_loss: 0.1462 - val_acc: 0.9635
Epoch 44/50
34300/34300 [==============================] - 2s - loss: 0.1062 - acc: 0.9717 - val_loss: 0.1443 - val_acc: 0.9656
Epoch 45/50
34300/34300 [==============================] - 2s - loss: 0.1032 - acc: 0.9727 - val_loss: 0.1418 - val_acc: 0.9645
Epoch 46/50
34300/34300 [==============================] - 2s - loss: 0.1038 - acc: 0.9719 - val_loss: 0.1504 - val_acc: 0.9638
Epoch 47/50
34300/34300 [==============================] - 2s - loss: 0.1049 - acc: 0.9718 - val_loss: 0.1546 - val_acc: 0.9623
Epoch 48/50
34300/34300 [==============================] - 2s - loss: 0.1075 - acc: 0.9710 - val_loss: 0.1453 - val_acc: 0.9643
Epoch 49/50
34300/34300 [==============================] - 2s - loss: 0.1080 - acc: 0.9707 - val_loss: 0.1506 - val_acc: 0.9631
Epoch 50/50
34300/34300 [==============================] - 2s - loss: 0.1047 - acc: 0.9717 - val_loss: 0.1471 - val_acc: 0.9652

In [11]:
# The above is using NN type 1 - MLP (multi-layer perceptrons)
# NN type 2 - CNN
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Convolution2D, Flatten, MaxPooling2D, Reshape, InputLayer

# reshape data
## each given image here is 28*28
train_x_temp = train_x.reshape(-1, 28, 28, 1)
val_x_temp = val_x.reshape(-1, 28, 28, 1)


# define vars
input_shape = (784,)
input_reshape = (28, 28, 1)

conv_num_filters = 5
conv_filter_size = 5

pool_size = (2, 2)

hidden_num_units = 50
output_num_units = 10

epochs = 7
batch_size = 128

model = Sequential([
 InputLayer(input_shape=input_reshape),

 Convolution2D(25, 5, 5, activation='relu'),
 MaxPooling2D(pool_size=pool_size),

 Convolution2D(25, 5, 5, activation='relu'),
 MaxPooling2D(pool_size=pool_size),

 Convolution2D(25, 4, 4, activation='relu'),

 Flatten(),

 Dense(output_dim=hidden_num_units, activation='relu'),

 Dense(output_dim=output_num_units, input_dim=hidden_num_units, activation='softmax'),
])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

trained_model_conv = model.fit(train_x_temp, train_y, nb_epoch=epochs, batch_size=batch_size, 
                               validation_data=(val_x_temp, val_y))


/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:30: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(25, (5, 5), activation="relu")`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:33: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(25, (5, 5), activation="relu")`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:36: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(25, (4, 4), activation="relu")`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:40: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=50, activation="relu")`
/Library/Python/2.7/site-packages/ipykernel-4.2.1-py2.7.egg/ipykernel/__main__.py:42: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=10, activation="softmax", input_dim=50)`
/Library/Python/2.7/site-packages/Keras-2.0.5-py2.7.egg/keras/models.py:851: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.
  warnings.warn('The `nb_epoch` argument in `fit` '
Train on 34300 samples, validate on 14700 samples
Epoch 1/7
34300/34300 [==============================] - 31s - loss: 0.4916 - acc: 0.8520 - val_loss: 0.1888 - val_acc: 0.9435
Epoch 2/7
34300/34300 [==============================] - 33s - loss: 0.1330 - acc: 0.9592 - val_loss: 0.1178 - val_acc: 0.9642
Epoch 3/7
34300/34300 [==============================] - 29s - loss: 0.0881 - acc: 0.9727 - val_loss: 0.0877 - val_acc: 0.9737
Epoch 4/7
34300/34300 [==============================] - 32s - loss: 0.0680 - acc: 0.9785 - val_loss: 0.0703 - val_acc: 0.9785
Epoch 5/7
34300/34300 [==============================] - 31s - loss: 0.0543 - acc: 0.9818 - val_loss: 0.0674 - val_acc: 0.9788
Epoch 6/7
34300/34300 [==============================] - 31s - loss: 0.0441 - acc: 0.9856 - val_loss: 0.0609 - val_acc: 0.9820
Epoch 7/7
34300/34300 [==============================] - 29s - loss: 0.0398 - acc: 0.9873 - val_loss: 0.0533 - val_acc: 0.9846

In [17]:
# Predict with CNN trained model

test_x_temp = test_x.reshape(-1, 28, 28, 1)
pred = model.predict_classes(test_x_temp)

img_name = rng.choice(test.filename)
testing_image_path = 'data/Images/test/' + img_name
testing_img = imread(testing_image_path, flatten=True)

test_index = int(img_name.split('.')[0]) - train.shape[0]

print "Prediction is: ", pred[test_index]

pylab.imshow(testing_img, cmap='gray')
pylab.axis('off')
pylab.show()


20896/21000 [============================>.] - ETA: 0sPrediction is:  7