In [67]:
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (7,7) # Make the figures a bit bigger

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.utils import np_utils

In [68]:
nb_classes = 10

# the data, shuffled and split between tran and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print("X_train original shape", X_train.shape)
print("y_train original shape", y_train.shape)

In [ ]:


In [69]:
for i in range(9):
    plt.subplot(3, 3, i + 1)
    plt.imshow(X_train[i], cmap='gray', interpolation='none')
    plt.title("Class {}".format(y_train[i]))



In [78]:
X_train = X_train.reshape(60000, 784).astype(np.float32) / 255
X_test = X_test.reshape(10000, 784).astype(np.float32) / 255
print("Training matrix shape", X_train.shape)
print("Testing matrix shape", X_test.shape)


Training matrix shape (60000, 784)
Testing matrix shape (10000, 784)

In [79]:
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

In [80]:
model = Sequential()
model.add(Dense(512, input_shape=(784,)))
model.add(Activation('relu'))                           
model.add(Dropout(0.3))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.3))
model.add(Dense(10))
model.add(Activation('softmax'))

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


____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
dense_10 (Dense)                 (None, 512)           401920      dense_input_4[0][0]              
____________________________________________________________________________________________________
activation_10 (Activation)       (None, 512)           0           dense_10[0][0]                   
____________________________________________________________________________________________________
dropout_7 (Dropout)              (None, 512)           0           activation_10[0][0]              
____________________________________________________________________________________________________
dense_11 (Dense)                 (None, 512)           262656      dropout_7[0][0]                  
____________________________________________________________________________________________________
activation_11 (Activation)       (None, 512)           0           dense_11[0][0]                   
____________________________________________________________________________________________________
dropout_8 (Dropout)              (None, 512)           0           activation_11[0][0]              
____________________________________________________________________________________________________
dense_12 (Dense)                 (None, 10)            5130        dropout_8[0][0]                  
____________________________________________________________________________________________________
activation_12 (Activation)       (None, 10)            0           dense_12[0][0]                   
====================================================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
____________________________________________________________________________________________________
None

In [82]:
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), nb_epoch=8, batch_size=128, verbose=1)


Train on 60000 samples, validate on 10000 samples
Epoch 1/8
60000/60000 [==============================] - 3s - loss: 0.2707 - acc: 0.9185 - val_loss: 0.1090 - val_acc: 0.9641 - ETA: 2s - loss: 0.4190 - acc: 0.8741 - ETA: 0s - loss: 0.3186 - acc: 0.9041 - ETA: 0s - loss: 0.2934 - acc: 0.9114
Epoch 2/8
60000/60000 [==============================] - 2s - loss: 0.1171 - acc: 0.9646 - val_loss: 0.0857 - val_acc: 0.9747 - ETA: 2s - loss: 0.1288 - acc: 0.9620 - ETA: 1s - loss: 0.1220 - acc: 0.9631 - ETA: 0s - loss: 0.1199 - acc: 0.9637
Epoch 3/8
60000/60000 [==============================] - 2s - loss: 0.0853 - acc: 0.9740 - val_loss: 0.0759 - val_acc: 0.9776 - ETA: 0s - loss: 0.0843 - acc: 0.9743
Epoch 4/8
60000/60000 [==============================] - 2s - loss: 0.0696 - acc: 0.9778 - val_loss: 0.0686 - val_acc: 0.9794 - ETA: 1s - loss: 0.0702 - acc: 0.9783 - ETA: 0s - loss: 0.0704 - acc: 0.9778
Epoch 5/8
60000/60000 [==============================] - 2s - loss: 0.0587 - acc: 0.9814 - val_loss: 0.0632 - val_acc: 0.9806 - ETA: 1s - loss: 0.0557 - acc: 0.9826 - ETA: 0s - loss: 0.0577 - acc: 0.9821 - ETA: 0s - loss: 0.0582 - acc: 0.9817 - ETA: 0s - loss: 0.0586 - acc: 0.9816
Epoch 6/8
60000/60000 [==============================] - 2s - loss: 0.0533 - acc: 0.9827 - val_loss: 0.0664 - val_acc: 0.9797 - ETA: 1s - loss: 0.0512 - acc: 0.9837
Epoch 7/8
60000/60000 [==============================] - 2s - loss: 0.0426 - acc: 0.9863 - val_loss: 0.0646 - val_acc: 0.9817 - ETA: 1s - loss: 0.0404 - acc: 0.9873 - ETA: 0s - loss: 0.0435 - acc: 0.9865 - ETA: 0s - loss: 0.0429 - acc: 0.9867 - ETA: 0s - loss: 0.0425 - acc: 0.9866
Epoch 8/8
60000/60000 [==============================] - 2s - loss: 0.0413 - acc: 0.9862 - val_loss: 0.0777 - val_acc: 0.9796
Out[82]:
<keras.callbacks.History at 0x7fe7968bfdd8>

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

In [76]:
# The predict_classes function outputs the highest probability class
# according to the trained classifier for each input example.
predicted_classes = model.predict_classes(X_test)

# Check which items we got right / wrong
correct_indices = np.nonzero(predicted_classes == y_test)[0]
incorrect_indices = np.nonzero(predicted_classes != y_test)[0]


10000/10000 [==============================] - 0s       - ETA: 0s

In [77]:
plt.figure()
for i, correct in enumerate(correct_indices[:9]):
    plt.subplot(3,3,i+1)
    plt.imshow(X_test[correct].reshape(28,28), cmap='gray', interpolation='none')
    plt.title("Predicted {}, Class {}".format(predicted_classes[correct], y_test[correct]))
    
plt.figure()
for i, incorrect in enumerate(incorrect_indices[:9]):
    plt.subplot(3,3,i+1)
    plt.imshow(X_test[incorrect].reshape(28,28), cmap='gray', interpolation='none')
    plt.title("Predicted {}, Class {}".format(predicted_classes[incorrect], y_test[incorrect]))



In [ ]: