In [1]:
# importing requirements
from __future__ import print_function
from keras.datasets import cifar100
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils
from matplotlib import pyplot
from scipy.misc import toimage
%matplotlib inline


Using Theano backend.
Using gpu device 0: Quadro M6000 (CNMeM is enabled with initial size: 95.0% of memory, cuDNN not available)

In [5]:
# keras is having some in built mechanism to download test data and load it
# load data
(X_train, y_train), (X_test, y_test) = cifar100.load_data()

In [41]:
# lets print data size of all four section
print ("X_train Size: ", len(X_train)," y_train Size :" ,len(y_train)," X_test Size : ",len(X_test)," y_testSize : ",len(y_test))


X_train Size:  50000  y_train Size : 50000  X_test Size :  10000  y_testSize :  10000

In [14]:
pyplot.imshow(toimage(X_train[0])) #showing first image
pyplot.show()
pyplot.imshow(toimage(X_train[1])) #showing second image
pyplot.show()
pyplot.imshow(toimage(X_train[2])) #showing third image
pyplot.show()



In [15]:
batch_size = 500 # take only this many samples in gpu
nb_classes = 100 # number of output classes
nb_epoch = 25 # run for 25 epoches
data_augmentation = True

In [25]:
# convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

In [18]:
Y_test[0]


Out[18]:
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.,  1.,  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.])

In [19]:
model = Sequential()

model.add(Convolution2D(32, 3, 3, border_mode='same',
                        input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.summary()


____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution2d_1 (Convolution2D)  (None, 32, 32, 32)    896         convolution2d_input_1[0][0]      
____________________________________________________________________________________________________
activation_1 (Activation)        (None, 32, 32, 32)    0           convolution2d_1[0][0]            
____________________________________________________________________________________________________
convolution2d_2 (Convolution2D)  (None, 30, 30, 32)    9248        activation_1[0][0]               
____________________________________________________________________________________________________
activation_2 (Activation)        (None, 30, 30, 32)    0           convolution2d_2[0][0]            
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 15, 15, 32)    0           activation_2[0][0]               
____________________________________________________________________________________________________
dropout_1 (Dropout)              (None, 15, 15, 32)    0           maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
convolution2d_3 (Convolution2D)  (None, 15, 15, 64)    18496       dropout_1[0][0]                  
____________________________________________________________________________________________________
activation_3 (Activation)        (None, 15, 15, 64)    0           convolution2d_3[0][0]            
____________________________________________________________________________________________________
convolution2d_4 (Convolution2D)  (None, 13, 13, 64)    36928       activation_3[0][0]               
____________________________________________________________________________________________________
activation_4 (Activation)        (None, 13, 13, 64)    0           convolution2d_4[0][0]            
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 6, 6, 64)      0           activation_4[0][0]               
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 6, 6, 64)      0           maxpooling2d_2[0][0]             
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 2304)          0           dropout_2[0][0]                  
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 512)           1180160     flatten_1[0][0]                  
____________________________________________________________________________________________________
activation_5 (Activation)        (None, 512)           0           dense_1[0][0]                    
____________________________________________________________________________________________________
dropout_3 (Dropout)              (None, 512)           0           activation_5[0][0]               
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 100)           51300       dropout_3[0][0]                  
____________________________________________________________________________________________________
activation_6 (Activation)        (None, 100)           0           dense_2[0][0]                    
====================================================================================================
Total params: 1,297,028
Trainable params: 1,297,028
Non-trainable params: 0
____________________________________________________________________________________________________

In [20]:
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))


Train on 50000 samples, validate on 10000 samples
Epoch 1/25
50000/50000 [==============================] - 49s - loss: 7.0231 - acc: 0.0112 - val_loss: 4.5859 - val_acc: 0.0209
Epoch 2/25
50000/50000 [==============================] - 49s - loss: 4.5330 - acc: 0.0230 - val_loss: 4.4896 - val_acc: 0.0343
Epoch 3/25
50000/50000 [==============================] - 49s - loss: 4.4621 - acc: 0.0320 - val_loss: 4.4044 - val_acc: 0.0551
Epoch 4/25
50000/50000 [==============================] - 49s - loss: 4.3738 - acc: 0.0479 - val_loss: 4.2837 - val_acc: 0.0786
Epoch 5/25
50000/50000 [==============================] - 50s - loss: 4.2673 - acc: 0.0659 - val_loss: 4.1325 - val_acc: 0.0962
Epoch 6/25
50000/50000 [==============================] - 49s - loss: 4.1399 - acc: 0.0818 - val_loss: 4.0388 - val_acc: 0.1147
Epoch 7/25
50000/50000 [==============================] - 50s - loss: 4.0048 - acc: 0.0983 - val_loss: 3.7763 - val_acc: 0.1454
Epoch 8/25
50000/50000 [==============================] - 50s - loss: 3.8417 - acc: 0.1210 - val_loss: 3.5852 - val_acc: 0.1790
Epoch 9/25
50000/50000 [==============================] - 49s - loss: 3.6742 - acc: 0.1478 - val_loss: 3.4381 - val_acc: 0.2047
Epoch 10/25
50000/50000 [==============================] - 50s - loss: 3.5365 - acc: 0.1710 - val_loss: 3.4163 - val_acc: 0.2092
Epoch 11/25
50000/50000 [==============================] - 50s - loss: 3.4346 - acc: 0.1873 - val_loss: 3.2489 - val_acc: 0.2378
Epoch 12/25
50000/50000 [==============================] - 50s - loss: 3.3458 - acc: 0.2043 - val_loss: 3.2213 - val_acc: 0.2506
Epoch 13/25
50000/50000 [==============================] - 50s - loss: 3.2515 - acc: 0.2207 - val_loss: 3.1132 - val_acc: 0.2634
Epoch 14/25
50000/50000 [==============================] - 50s - loss: 3.1595 - acc: 0.2371 - val_loss: 3.1586 - val_acc: 0.2446
Epoch 15/25
50000/50000 [==============================] - 50s - loss: 3.0912 - acc: 0.2491 - val_loss: 2.9864 - val_acc: 0.2873
Epoch 16/25
50000/50000 [==============================] - 50s - loss: 3.0257 - acc: 0.2603 - val_loss: 2.9378 - val_acc: 0.2915
Epoch 17/25
50000/50000 [==============================] - 50s - loss: 2.9642 - acc: 0.2734 - val_loss: 2.8241 - val_acc: 0.3126
Epoch 18/25
50000/50000 [==============================] - 50s - loss: 2.8988 - acc: 0.2864 - val_loss: 2.7963 - val_acc: 0.3136
Epoch 19/25
50000/50000 [==============================] - 50s - loss: 2.8449 - acc: 0.2963 - val_loss: 2.8024 - val_acc: 0.3152
Epoch 20/25
50000/50000 [==============================] - 50s - loss: 2.7879 - acc: 0.3062 - val_loss: 2.7066 - val_acc: 0.3346
Epoch 21/25
50000/50000 [==============================] - 50s - loss: 2.7364 - acc: 0.3147 - val_loss: 2.7002 - val_acc: 0.3310
Epoch 22/25
50000/50000 [==============================] - 50s - loss: 2.6878 - acc: 0.3241 - val_loss: 2.6159 - val_acc: 0.3535
Epoch 23/25
50000/50000 [==============================] - 50s - loss: 2.6527 - acc: 0.3328 - val_loss: 2.6264 - val_acc: 0.3586
Epoch 24/25
50000/50000 [==============================] - 50s - loss: 2.6021 - acc: 0.3444 - val_loss: 2.5937 - val_acc: 0.3539
Epoch 25/25
50000/50000 [==============================] - 50s - loss: 2.5571 - acc: 0.3522 - val_loss: 2.5712 - val_acc: 0.3596
Test score: 2.57119269905
Test accuracy: 0.3596

In [23]:
# saving the model
model.save_weights("cifar_trained_for_tutorial.h5")

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


Test score: 2.57119269905
Test accuracy: 0.3596

In [32]:
# finally lets predict on the test dataset using previously built model
score = (model.predict_classes(X_test, batch_size=32, verbose=1))


10000/10000 [==============================] - 2s     

In [35]:
# printing classes and lenght 
print (score), len(score)


[49 33 24 ..., 33 42 70]
Out[35]:
(None, 10000)

In [39]:
# lets see whats there in first few images
pyplot.imshow(toimage(X_test[0])) #showing first image
pyplot.show()
pyplot.imshow(toimage(X_test[1])) #showing first image
pyplot.show()