In this notebook, I will publish some code examples for training AlexNet, using Keras and Theano.

Software Requirements :-

  1. Theano - Follow the instructions available here http://deeplearning.net/software/theano/install.html#install
  2. Keras - Follow the instructions available here https://keras.io/#installation

We will acheive 3 objectives -

  1. Establish the baseline performance of AlexNet on our classification task
  2. Train a basic ANN/SVM as a classifier, using the features extracted from a pre-trained AlexNet model
  3. Fine-Tune the layers of the AlexNet model

In [1]:
%matplotlib inline

from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import SGD

from alexnet_base import *
from utils import *


Using Theano backend.
WARNING (theano.gof.compilelock): Overriding existing lock by dead process '22535' (I am process '24494')
Using gpu device 1: Tesla K20m (CNMeM is disabled, cuDNN 5103)
/home/rahulduggal2608/anaconda2/lib/python2.7/site-packages/theano/sandbox/cuda/__init__.py:600: UserWarning: Your cuDNN version is more recent than the one Theano officially supports. If you see any problems, try updating Theano or downgrading cuDNN to version 5.
  warnings.warn(warn)

Define some variables


In [2]:
batch_size = 16
input_size = (3,227,227)
nb_classes = 2
mean_flag = True # if False, then the mean subtraction layer is not prepended

In the cell below, we define generators which are neat ways to perform realtime data augmentation. We use only basic data augmentation such as shear, zoom and flipping.


In [3]:
#code ported from https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator()
                                  

train_generator = train_datagen.flow_from_directory(
        '../Data/Train',  
        batch_size=batch_size,
        shuffle=True,
        target_size=input_size[1:],
        class_mode='categorical')  

validation_generator = test_datagen.flow_from_directory(
        '../Data/Test',  
        batch_size=batch_size,
        target_size=input_size[1:],
        shuffle=True,
        class_mode='categorical')


Found 2000 images belonging to 2 classes.
Found 800 images belonging to 2 classes.

Task 1 : Training AlexNet from scratch

Ontain the AlexNet model object. The get_alexnet function abstracts two things

1. Implements real-time mean subtraction through prepending a custom layer
2. Specifies the initialization parameter of each layer to he_normal

In [4]:
alexnet = get_alexnet(input_size,nb_classes,mean_flag)
    
print alexnet.summary()


/home/rahulduggal2608/anaconda2/lib/python2.7/site-packages/keras/layers/core.py:577: UserWarning: `output_shape` argument not specified for layer mean_subtraction and cannot be automatically inferred with the Theano backend. Defaulting to output shape `(None, 3, 227, 227)` (same as input shape). If the expected output shape is different, specify it via the `output_shape` argument.
  .format(self.name, input_shape))
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
input_1 (InputLayer)             (None, 3, 227, 227)   0                                            
____________________________________________________________________________________________________
mean_subtraction (Lambda)        (None, 3, 227, 227)   0           input_1[0][0]                    
____________________________________________________________________________________________________
conv_1 (Convolution2D)           (None, 96, 55, 55)    34944       mean_subtraction[0][0]           
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 96, 27, 27)    0           conv_1[0][0]                     
____________________________________________________________________________________________________
convpool_1 (Lambda)              (None, 96, 27, 27)    0           maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
zeropadding2d_1 (ZeroPadding2D)  (None, 96, 31, 31)    0           convpool_1[0][0]                 
____________________________________________________________________________________________________
lambda_1 (Lambda)                (None, 48, 31, 31)    0           zeropadding2d_1[0][0]            
____________________________________________________________________________________________________
lambda_2 (Lambda)                (None, 48, 31, 31)    0           zeropadding2d_1[0][0]            
____________________________________________________________________________________________________
conv_2_1 (Convolution2D)         (None, 128, 27, 27)   153728      lambda_1[0][0]                   
____________________________________________________________________________________________________
conv_2_2 (Convolution2D)         (None, 128, 27, 27)   153728      lambda_2[0][0]                   
____________________________________________________________________________________________________
conv_2 (Merge)                   (None, 256, 27, 27)   0           conv_2_1[0][0]                   
                                                                   conv_2_2[0][0]                   
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 256, 13, 13)   0           conv_2[0][0]                     
____________________________________________________________________________________________________
lambda_3 (Lambda)                (None, 256, 13, 13)   0           maxpooling2d_2[0][0]             
____________________________________________________________________________________________________
zeropadding2d_2 (ZeroPadding2D)  (None, 256, 15, 15)   0           lambda_3[0][0]                   
____________________________________________________________________________________________________
conv_3 (Convolution2D)           (None, 384, 13, 13)   885120      zeropadding2d_2[0][0]            
____________________________________________________________________________________________________
zeropadding2d_3 (ZeroPadding2D)  (None, 384, 15, 15)   0           conv_3[0][0]                     
____________________________________________________________________________________________________
lambda_4 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_3[0][0]            
____________________________________________________________________________________________________
lambda_5 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_3[0][0]            
____________________________________________________________________________________________________
conv_4_1 (Convolution2D)         (None, 192, 13, 13)   331968      lambda_4[0][0]                   
____________________________________________________________________________________________________
conv_4_2 (Convolution2D)         (None, 192, 13, 13)   331968      lambda_5[0][0]                   
____________________________________________________________________________________________________
conv_4 (Merge)                   (None, 384, 13, 13)   0           conv_4_1[0][0]                   
                                                                   conv_4_2[0][0]                   
____________________________________________________________________________________________________
zeropadding2d_4 (ZeroPadding2D)  (None, 384, 15, 15)   0           conv_4[0][0]                     
____________________________________________________________________________________________________
lambda_6 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_4[0][0]            
____________________________________________________________________________________________________
lambda_7 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_4[0][0]            
____________________________________________________________________________________________________
conv_5_1 (Convolution2D)         (None, 128, 13, 13)   221312      lambda_6[0][0]                   
____________________________________________________________________________________________________
conv_5_2 (Convolution2D)         (None, 128, 13, 13)   221312      lambda_7[0][0]                   
____________________________________________________________________________________________________
conv_5 (Merge)                   (None, 256, 13, 13)   0           conv_5_1[0][0]                   
                                                                   conv_5_2[0][0]                   
____________________________________________________________________________________________________
convpool_5 (MaxPooling2D)        (None, 256, 6, 6)     0           conv_5[0][0]                     
____________________________________________________________________________________________________
flatten (Flatten)                (None, 9216)          0           convpool_5[0][0]                 
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 4096)          37752832    flatten[0][0]                    
____________________________________________________________________________________________________
dropout_1 (Dropout)              (None, 4096)          0           dense_1[0][0]                    
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 4096)          16781312    dropout_1[0][0]                  
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 4096)          0           dense_2[0][0]                    
____________________________________________________________________________________________________
dense_3_new (Dense)              (None, 2)             8194        dropout_2[0][0]                  
____________________________________________________________________________________________________
softmax (Activation)             (None, 2)             0           dense_3_new[0][0]                
====================================================================================================
Total params: 56,876,418
Trainable params: 56,876,418
Non-trainable params: 0
____________________________________________________________________________________________________
None

We train the AlexNet CNN using Stochastic Gradient descent for 80 epochs.


In [5]:
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
alexnet.compile(loss='mse',
              optimizer=sgd,
              metrics=['accuracy'])

history = alexnet.fit_generator(train_generator,
                        samples_per_epoch=2000,
                        validation_data=validation_generator,
                        nb_val_samples=800,
                        nb_epoch=80,
                        verbose=1)


Epoch 1/80
2000/2000 [==============================] - 45s - loss: 0.2601 - acc: 0.5410 - val_loss: 0.2468 - val_acc: 0.5513
Epoch 2/80
2000/2000 [==============================] - 42s - loss: 0.2386 - acc: 0.5940 - val_loss: 0.2248 - val_acc: 0.6312
Epoch 3/80
2000/2000 [==============================] - 42s - loss: 0.2315 - acc: 0.6200 - val_loss: 0.2173 - val_acc: 0.6450
Epoch 4/80
2000/2000 [==============================] - 43s - loss: 0.2202 - acc: 0.6530 - val_loss: 0.2127 - val_acc: 0.6637
Epoch 5/80
2000/2000 [==============================] - 44s - loss: 0.2122 - acc: 0.6775 - val_loss: 0.2001 - val_acc: 0.6975
Epoch 6/80
2000/2000 [==============================] - 44s - loss: 0.1983 - acc: 0.6940 - val_loss: 0.1892 - val_acc: 0.7200
Epoch 7/80
2000/2000 [==============================] - 42s - loss: 0.1905 - acc: 0.7175 - val_loss: 0.1857 - val_acc: 0.7225
Epoch 8/80
2000/2000 [==============================] - 41s - loss: 0.1812 - acc: 0.7360 - val_loss: 0.1794 - val_acc: 0.7488
Epoch 9/80
2000/2000 [==============================] - 42s - loss: 0.1724 - acc: 0.7565 - val_loss: 0.1805 - val_acc: 0.7225
Epoch 10/80
2000/2000 [==============================] - 41s - loss: 0.1638 - acc: 0.7630 - val_loss: 0.1603 - val_acc: 0.7725
Epoch 11/80
2000/2000 [==============================] - 41s - loss: 0.1592 - acc: 0.7635 - val_loss: 0.1603 - val_acc: 0.7638
Epoch 12/80
2000/2000 [==============================] - 43s - loss: 0.1468 - acc: 0.7920 - val_loss: 0.1533 - val_acc: 0.7800
Epoch 13/80
2000/2000 [==============================] - 42s - loss: 0.1428 - acc: 0.7945 - val_loss: 0.1613 - val_acc: 0.7662
Epoch 14/80
2000/2000 [==============================] - 41s - loss: 0.1426 - acc: 0.7890 - val_loss: 0.1548 - val_acc: 0.7638
Epoch 15/80
2000/2000 [==============================] - 42s - loss: 0.1333 - acc: 0.8165 - val_loss: 0.1426 - val_acc: 0.8025
Epoch 16/80
2000/2000 [==============================] - 41s - loss: 0.1312 - acc: 0.8175 - val_loss: 0.1675 - val_acc: 0.7638
Epoch 17/80
2000/2000 [==============================] - 42s - loss: 0.1290 - acc: 0.8305 - val_loss: 0.1524 - val_acc: 0.7775
Epoch 18/80
2000/2000 [==============================] - 41s - loss: 0.1258 - acc: 0.8240 - val_loss: 0.1506 - val_acc: 0.7937
Epoch 19/80
2000/2000 [==============================] - 41s - loss: 0.1192 - acc: 0.8400 - val_loss: 0.1470 - val_acc: 0.8025
Epoch 20/80
2000/2000 [==============================] - 42s - loss: 0.1122 - acc: 0.8435 - val_loss: 0.1473 - val_acc: 0.7950
Epoch 21/80
2000/2000 [==============================] - 42s - loss: 0.1091 - acc: 0.8490 - val_loss: 0.1370 - val_acc: 0.8025
Epoch 22/80
2000/2000 [==============================] - 41s - loss: 0.1032 - acc: 0.8650 - val_loss: 0.1448 - val_acc: 0.8063
Epoch 23/80
2000/2000 [==============================] - 41s - loss: 0.1008 - acc: 0.8675 - val_loss: 0.1471 - val_acc: 0.8037
Epoch 24/80
2000/2000 [==============================] - 40s - loss: 0.1028 - acc: 0.8625 - val_loss: 0.1416 - val_acc: 0.8113
Epoch 25/80
2000/2000 [==============================] - 41s - loss: 0.0923 - acc: 0.8790 - val_loss: 0.1430 - val_acc: 0.8050
Epoch 26/80
2000/2000 [==============================] - 41s - loss: 0.0934 - acc: 0.8750 - val_loss: 0.1573 - val_acc: 0.7825
Epoch 27/80
2000/2000 [==============================] - 42s - loss: 0.0972 - acc: 0.8675 - val_loss: 0.1356 - val_acc: 0.8287
Epoch 28/80
2000/2000 [==============================] - 41s - loss: 0.0894 - acc: 0.8770 - val_loss: 0.1382 - val_acc: 0.7963
Epoch 29/80
2000/2000 [==============================] - 41s - loss: 0.0856 - acc: 0.8900 - val_loss: 0.1394 - val_acc: 0.8100
Epoch 30/80
2000/2000 [==============================] - 41s - loss: 0.0843 - acc: 0.8855 - val_loss: 0.1382 - val_acc: 0.8137
Epoch 31/80
2000/2000 [==============================] - 43s - loss: 0.0806 - acc: 0.8920 - val_loss: 0.1487 - val_acc: 0.7937
Epoch 32/80
2000/2000 [==============================] - 41s - loss: 0.0733 - acc: 0.9055 - val_loss: 0.1388 - val_acc: 0.8087
Epoch 33/80
2000/2000 [==============================] - 41s - loss: 0.0780 - acc: 0.9030 - val_loss: 0.1540 - val_acc: 0.7950
Epoch 34/80
2000/2000 [==============================] - 41s - loss: 0.0730 - acc: 0.9030 - val_loss: 0.1447 - val_acc: 0.8113
Epoch 35/80
2000/2000 [==============================] - 41s - loss: 0.0687 - acc: 0.9105 - val_loss: 0.1404 - val_acc: 0.8275
Epoch 36/80
2000/2000 [==============================] - 41s - loss: 0.0711 - acc: 0.9070 - val_loss: 0.1356 - val_acc: 0.8213
Epoch 37/80
2000/2000 [==============================] - 42s - loss: 0.0676 - acc: 0.9075 - val_loss: 0.1418 - val_acc: 0.8137
Epoch 38/80
2000/2000 [==============================] - 41s - loss: 0.0612 - acc: 0.9130 - val_loss: 0.1353 - val_acc: 0.8250
Epoch 39/80
2000/2000 [==============================] - 43s - loss: 0.0626 - acc: 0.9145 - val_loss: 0.1295 - val_acc: 0.8187
Epoch 40/80
2000/2000 [==============================] - 43s - loss: 0.0590 - acc: 0.9235 - val_loss: 0.1322 - val_acc: 0.8263
Epoch 41/80
2000/2000 [==============================] - 42s - loss: 0.0516 - acc: 0.9330 - val_loss: 0.1362 - val_acc: 0.8187
Epoch 42/80
2000/2000 [==============================] - 42s - loss: 0.0542 - acc: 0.9315 - val_loss: 0.1627 - val_acc: 0.7975
Epoch 43/80
2000/2000 [==============================] - 41s - loss: 0.0490 - acc: 0.9375 - val_loss: 0.1469 - val_acc: 0.8150
Epoch 44/80
2000/2000 [==============================] - 41s - loss: 0.0560 - acc: 0.9225 - val_loss: 0.1579 - val_acc: 0.8087
Epoch 45/80
2000/2000 [==============================] - 42s - loss: 0.0495 - acc: 0.9375 - val_loss: 0.1374 - val_acc: 0.8163
Epoch 46/80
2000/2000 [==============================] - 43s - loss: 0.0604 - acc: 0.9205 - val_loss: 0.1418 - val_acc: 0.8063
Epoch 47/80
2000/2000 [==============================] - 42s - loss: 0.0470 - acc: 0.9395 - val_loss: 0.1443 - val_acc: 0.8150
Epoch 48/80
2000/2000 [==============================] - 42s - loss: 0.0471 - acc: 0.9375 - val_loss: 0.1450 - val_acc: 0.8150
Epoch 49/80
2000/2000 [==============================] - 41s - loss: 0.0378 - acc: 0.9500 - val_loss: 0.1303 - val_acc: 0.8263
Epoch 50/80
2000/2000 [==============================] - 41s - loss: 0.0465 - acc: 0.9400 - val_loss: 0.1500 - val_acc: 0.8075
Epoch 51/80
2000/2000 [==============================] - 43s - loss: 0.0423 - acc: 0.9460 - val_loss: 0.1381 - val_acc: 0.8350
Epoch 52/80
2000/2000 [==============================] - 43s - loss: 0.0404 - acc: 0.9480 - val_loss: 0.1342 - val_acc: 0.8175
Epoch 53/80
2000/2000 [==============================] - 42s - loss: 0.0402 - acc: 0.9475 - val_loss: 0.1280 - val_acc: 0.8325
Epoch 54/80
2000/2000 [==============================] - 41s - loss: 0.0357 - acc: 0.9535 - val_loss: 0.1591 - val_acc: 0.8075
Epoch 55/80
2000/2000 [==============================] - 41s - loss: 0.0339 - acc: 0.9565 - val_loss: 0.1524 - val_acc: 0.8113
Epoch 56/80
2000/2000 [==============================] - 41s - loss: 0.0421 - acc: 0.9475 - val_loss: 0.1431 - val_acc: 0.8275
Epoch 57/80
2000/2000 [==============================] - 42s - loss: 0.0342 - acc: 0.9570 - val_loss: 0.1507 - val_acc: 0.8125
Epoch 58/80
2000/2000 [==============================] - 41s - loss: 0.0422 - acc: 0.9445 - val_loss: 0.1550 - val_acc: 0.8125
Epoch 59/80
2000/2000 [==============================] - 42s - loss: 0.0377 - acc: 0.9505 - val_loss: 0.1497 - val_acc: 0.8100
Epoch 60/80
2000/2000 [==============================] - 42s - loss: 0.0294 - acc: 0.9625 - val_loss: 0.1544 - val_acc: 0.8163
Epoch 61/80
2000/2000 [==============================] - 42s - loss: 0.0290 - acc: 0.9605 - val_loss: 0.1419 - val_acc: 0.8313
Epoch 62/80
2000/2000 [==============================] - 43s - loss: 0.0359 - acc: 0.9535 - val_loss: 0.1312 - val_acc: 0.8387
Epoch 63/80
2000/2000 [==============================] - 43s - loss: 0.0294 - acc: 0.9630 - val_loss: 0.1402 - val_acc: 0.8263
Epoch 64/80
2000/2000 [==============================] - 43s - loss: 0.0345 - acc: 0.9555 - val_loss: 0.1517 - val_acc: 0.8200
Epoch 65/80
2000/2000 [==============================] - 44s - loss: 0.0331 - acc: 0.9565 - val_loss: 0.1438 - val_acc: 0.8275
Epoch 66/80
2000/2000 [==============================] - 43s - loss: 0.0333 - acc: 0.9540 - val_loss: 0.1373 - val_acc: 0.8337
Epoch 67/80
2000/2000 [==============================] - 43s - loss: 0.0342 - acc: 0.9570 - val_loss: 0.1387 - val_acc: 0.8313
Epoch 68/80
2000/2000 [==============================] - 41s - loss: 0.0207 - acc: 0.9745 - val_loss: 0.1678 - val_acc: 0.8013
Epoch 69/80
2000/2000 [==============================] - 42s - loss: 0.0295 - acc: 0.9615 - val_loss: 0.1452 - val_acc: 0.8250
Epoch 70/80
2000/2000 [==============================] - 41s - loss: 0.0262 - acc: 0.9670 - val_loss: 0.1398 - val_acc: 0.8400
Epoch 71/80
2000/2000 [==============================] - 42s - loss: 0.0198 - acc: 0.9745 - val_loss: 0.1524 - val_acc: 0.8263
Epoch 72/80
2000/2000 [==============================] - 42s - loss: 0.0249 - acc: 0.9690 - val_loss: 0.1495 - val_acc: 0.8187
Epoch 73/80
2000/2000 [==============================] - 42s - loss: 0.0249 - acc: 0.9685 - val_loss: 0.1471 - val_acc: 0.8387
Epoch 74/80
2000/2000 [==============================] - 41s - loss: 0.0270 - acc: 0.9640 - val_loss: 0.1410 - val_acc: 0.8363
Epoch 75/80
2000/2000 [==============================] - 43s - loss: 0.0222 - acc: 0.9695 - val_loss: 0.1390 - val_acc: 0.8350
Epoch 76/80
2000/2000 [==============================] - 42s - loss: 0.0263 - acc: 0.9660 - val_loss: 0.1448 - val_acc: 0.8275
Epoch 77/80
2000/2000 [==============================] - 41s - loss: 0.0245 - acc: 0.9670 - val_loss: 0.1328 - val_acc: 0.8438
Epoch 78/80
2000/2000 [==============================] - 42s - loss: 0.0183 - acc: 0.9760 - val_loss: 0.1382 - val_acc: 0.8413
Epoch 79/80
2000/2000 [==============================] - 43s - loss: 0.0265 - acc: 0.9660 - val_loss: 0.1338 - val_acc: 0.8400
Epoch 80/80
2000/2000 [==============================] - 41s - loss: 0.0138 - acc: 0.9830 - val_loss: 0.1325 - val_acc: 0.8387

In [6]:
plot_performance(history)


Discussion

The standard AlexNet, trained from scratch obtains ~84% accuracy. The accuracy and loss plots shown above suggest overfitting. In the next section, we will try to overcome this problem through fine-tuning.

Task 2 : Fine-Tuning Alexnet

We will follow the strategy as suggested in this paper - http://ieeexplore.ieee.org/abstract/document/7426826/?reload=true

The basic idea is to perform the training layerwise. What this means is - consider a 5 layer CNN with layers {L1,L2,L3,L4,L5}. In the first round of training, we freeze layers L1-L4 and finetune layer L5 for some epochs. In the next round, we train layers L4,L5 for some epochs. In the next round, we train L3,L4,L5 for some epochs. Essentially, the training percolates to shallow layers.


In [4]:
alexnet = get_alexnet(input_size,nb_classes,mean_flag)
alexnet.load_weights('../convnets-keras/weights/alexnet_weights.h5', by_name=True)

print alexnet.summary()


/home/rahulduggal2608/anaconda2/lib/python2.7/site-packages/keras/layers/core.py:577: UserWarning: `output_shape` argument not specified for layer mean_subtraction and cannot be automatically inferred with the Theano backend. Defaulting to output shape `(None, 3, 227, 227)` (same as input shape). If the expected output shape is different, specify it via the `output_shape` argument.
  .format(self.name, input_shape))
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
input_1 (InputLayer)             (None, 3, 227, 227)   0                                            
____________________________________________________________________________________________________
mean_subtraction (Lambda)        (None, 3, 227, 227)   0           input_1[0][0]                    
____________________________________________________________________________________________________
conv_1 (Convolution2D)           (None, 96, 55, 55)    34944       mean_subtraction[0][0]           
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 96, 27, 27)    0           conv_1[0][0]                     
____________________________________________________________________________________________________
convpool_1 (Lambda)              (None, 96, 27, 27)    0           maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
zeropadding2d_1 (ZeroPadding2D)  (None, 96, 31, 31)    0           convpool_1[0][0]                 
____________________________________________________________________________________________________
lambda_1 (Lambda)                (None, 48, 31, 31)    0           zeropadding2d_1[0][0]            
____________________________________________________________________________________________________
lambda_2 (Lambda)                (None, 48, 31, 31)    0           zeropadding2d_1[0][0]            
____________________________________________________________________________________________________
conv_2_1 (Convolution2D)         (None, 128, 27, 27)   153728      lambda_1[0][0]                   
____________________________________________________________________________________________________
conv_2_2 (Convolution2D)         (None, 128, 27, 27)   153728      lambda_2[0][0]                   
____________________________________________________________________________________________________
conv_2 (Merge)                   (None, 256, 27, 27)   0           conv_2_1[0][0]                   
                                                                   conv_2_2[0][0]                   
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 256, 13, 13)   0           conv_2[0][0]                     
____________________________________________________________________________________________________
lambda_3 (Lambda)                (None, 256, 13, 13)   0           maxpooling2d_2[0][0]             
____________________________________________________________________________________________________
zeropadding2d_2 (ZeroPadding2D)  (None, 256, 15, 15)   0           lambda_3[0][0]                   
____________________________________________________________________________________________________
conv_3 (Convolution2D)           (None, 384, 13, 13)   885120      zeropadding2d_2[0][0]            
____________________________________________________________________________________________________
zeropadding2d_3 (ZeroPadding2D)  (None, 384, 15, 15)   0           conv_3[0][0]                     
____________________________________________________________________________________________________
lambda_4 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_3[0][0]            
____________________________________________________________________________________________________
lambda_5 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_3[0][0]            
____________________________________________________________________________________________________
conv_4_1 (Convolution2D)         (None, 192, 13, 13)   331968      lambda_4[0][0]                   
____________________________________________________________________________________________________
conv_4_2 (Convolution2D)         (None, 192, 13, 13)   331968      lambda_5[0][0]                   
____________________________________________________________________________________________________
conv_4 (Merge)                   (None, 384, 13, 13)   0           conv_4_1[0][0]                   
                                                                   conv_4_2[0][0]                   
____________________________________________________________________________________________________
zeropadding2d_4 (ZeroPadding2D)  (None, 384, 15, 15)   0           conv_4[0][0]                     
____________________________________________________________________________________________________
lambda_6 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_4[0][0]            
____________________________________________________________________________________________________
lambda_7 (Lambda)                (None, 192, 15, 15)   0           zeropadding2d_4[0][0]            
____________________________________________________________________________________________________
conv_5_1 (Convolution2D)         (None, 128, 13, 13)   221312      lambda_6[0][0]                   
____________________________________________________________________________________________________
conv_5_2 (Convolution2D)         (None, 128, 13, 13)   221312      lambda_7[0][0]                   
____________________________________________________________________________________________________
conv_5 (Merge)                   (None, 256, 13, 13)   0           conv_5_1[0][0]                   
                                                                   conv_5_2[0][0]                   
____________________________________________________________________________________________________
convpool_5 (MaxPooling2D)        (None, 256, 6, 6)     0           conv_5[0][0]                     
____________________________________________________________________________________________________
flatten (Flatten)                (None, 9216)          0           convpool_5[0][0]                 
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 4096)          37752832    flatten[0][0]                    
____________________________________________________________________________________________________
dropout_1 (Dropout)              (None, 4096)          0           dense_1[0][0]                    
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 4096)          16781312    dropout_1[0][0]                  
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 4096)          0           dense_2[0][0]                    
____________________________________________________________________________________________________
dense_3_new (Dense)              (None, 2)             8194        dropout_2[0][0]                  
____________________________________________________________________________________________________
softmax (Activation)             (None, 2)             0           dense_3_new[0][0]                
====================================================================================================
Total params: 56,876,418
Trainable params: 56,876,418
Non-trainable params: 0
____________________________________________________________________________________________________
None

In [5]:
layers = ['dense_3_new','dense_2','dense_1','conv_5_1','conv_4_1','conv_3','conv_2_1','conv_1']
epochs = [10,10,10,10,10,10,10,10]
lr = [1e-2,1e-3,1e-3,1e-3,1e-3,1e-3,1e-3,1e-3]

history_finetune = []

for i,layer in enumerate(layers):
        
    alexnet = unfreeze_layer_onwards(alexnet,layer)    
   
    sgd = SGD(lr=lr[i], decay=1e-6, momentum=0.9, nesterov=True)
    alexnet.compile(loss='mse',
              optimizer=sgd,
              metrics=['accuracy'])
    
    for epoch in range(epochs[i]):    
        h = alexnet.fit_generator(train_generator,
                                        samples_per_epoch=2000,
                                        validation_data=validation_generator,
                                        nb_val_samples=800,
                                        nb_epoch=1,
                                        verbose=1)
        
        history_finetune = append_history(history_finetune,h)


Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.2274 - acc: 0.6335 - val_loss: 0.2005 - val_acc: 0.6913
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.2000 - acc: 0.6945 - val_loss: 0.1931 - val_acc: 0.7100
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1968 - acc: 0.6915 - val_loss: 0.1815 - val_acc: 0.7362
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1969 - acc: 0.7020 - val_loss: 0.1773 - val_acc: 0.7475
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1918 - acc: 0.7130 - val_loss: 0.1755 - val_acc: 0.7500
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1877 - acc: 0.7205 - val_loss: 0.1697 - val_acc: 0.7588
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1853 - acc: 0.7135 - val_loss: 0.1651 - val_acc: 0.7750
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.1881 - acc: 0.7205 - val_loss: 0.1602 - val_acc: 0.7762
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.1826 - acc: 0.7260 - val_loss: 0.1587 - val_acc: 0.7863
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1806 - acc: 0.7350 - val_loss: 0.1572 - val_acc: 0.7863
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1813 - acc: 0.7355 - val_loss: 0.1505 - val_acc: 0.7913
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1818 - acc: 0.7315 - val_loss: 0.1518 - val_acc: 0.7850
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1763 - acc: 0.7330 - val_loss: 0.1427 - val_acc: 0.8025
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1731 - acc: 0.7470 - val_loss: 0.1743 - val_acc: 0.7412
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1782 - acc: 0.7340 - val_loss: 0.1438 - val_acc: 0.8050
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1667 - acc: 0.7440 - val_loss: 0.1393 - val_acc: 0.8125
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1624 - acc: 0.7630 - val_loss: 0.1571 - val_acc: 0.7675
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1651 - acc: 0.7550 - val_loss: 0.1352 - val_acc: 0.8150
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1615 - acc: 0.7640 - val_loss: 0.1568 - val_acc: 0.7725
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1636 - acc: 0.7625 - val_loss: 0.1324 - val_acc: 0.8250
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1828 - acc: 0.7305 - val_loss: 0.1404 - val_acc: 0.8037
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1660 - acc: 0.7600 - val_loss: 0.1321 - val_acc: 0.8187
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1546 - acc: 0.7695 - val_loss: 0.1244 - val_acc: 0.8337
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1428 - acc: 0.7915 - val_loss: 0.1331 - val_acc: 0.8137
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1422 - acc: 0.7930 - val_loss: 0.1202 - val_acc: 0.8425
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1363 - acc: 0.8025 - val_loss: 0.1694 - val_acc: 0.7525
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1372 - acc: 0.8015 - val_loss: 0.1392 - val_acc: 0.8050
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1293 - acc: 0.8110 - val_loss: 0.1203 - val_acc: 0.8300
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.1284 - acc: 0.8170 - val_loss: 0.1315 - val_acc: 0.8125
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1233 - acc: 0.8305 - val_loss: 0.1177 - val_acc: 0.8488
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.1215 - acc: 0.8275 - val_loss: 0.1586 - val_acc: 0.7750
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1106 - acc: 0.8430 - val_loss: 0.1182 - val_acc: 0.8287
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.1080 - acc: 0.8445 - val_loss: 0.1109 - val_acc: 0.8475
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0962 - acc: 0.8680 - val_loss: 0.1095 - val_acc: 0.8500
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0903 - acc: 0.8810 - val_loss: 0.1077 - val_acc: 0.8525
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0848 - acc: 0.8855 - val_loss: 0.1039 - val_acc: 0.8488
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0792 - acc: 0.8915 - val_loss: 0.1032 - val_acc: 0.8625
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0717 - acc: 0.9070 - val_loss: 0.1067 - val_acc: 0.8575
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0734 - acc: 0.8985 - val_loss: 0.1183 - val_acc: 0.8375
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0719 - acc: 0.9045 - val_loss: 0.1061 - val_acc: 0.8538
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.0675 - acc: 0.9130 - val_loss: 0.1209 - val_acc: 0.8400
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0660 - acc: 0.9110 - val_loss: 0.1034 - val_acc: 0.8500
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0592 - acc: 0.9245 - val_loss: 0.1042 - val_acc: 0.8600
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0566 - acc: 0.9280 - val_loss: 0.1064 - val_acc: 0.8512
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0552 - acc: 0.9300 - val_loss: 0.1062 - val_acc: 0.8500
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0507 - acc: 0.9370 - val_loss: 0.0976 - val_acc: 0.8675
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0497 - acc: 0.9330 - val_loss: 0.0977 - val_acc: 0.8712
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0450 - acc: 0.9475 - val_loss: 0.0982 - val_acc: 0.8662
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0396 - acc: 0.9540 - val_loss: 0.1015 - val_acc: 0.8600
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0405 - acc: 0.9520 - val_loss: 0.1021 - val_acc: 0.8612
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0389 - acc: 0.9480 - val_loss: 0.1022 - val_acc: 0.8538
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0400 - acc: 0.9540 - val_loss: 0.0985 - val_acc: 0.8675
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0365 - acc: 0.9570 - val_loss: 0.0976 - val_acc: 0.8638
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0325 - acc: 0.9615 - val_loss: 0.1124 - val_acc: 0.8450
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0332 - acc: 0.9575 - val_loss: 0.0922 - val_acc: 0.8725
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.0256 - acc: 0.9720 - val_loss: 0.1066 - val_acc: 0.8562
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0298 - acc: 0.9675 - val_loss: 0.1017 - val_acc: 0.8600
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0281 - acc: 0.9660 - val_loss: 0.1047 - val_acc: 0.8550
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0246 - acc: 0.9720 - val_loss: 0.1093 - val_acc: 0.8512
Epoch 1/1
2000/2000 [==============================] - 48s - loss: 0.0218 - acc: 0.9770 - val_loss: 0.0990 - val_acc: 0.8688
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0251 - acc: 0.9690 - val_loss: 0.0947 - val_acc: 0.8662
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0229 - acc: 0.9725 - val_loss: 0.0970 - val_acc: 0.8725
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0212 - acc: 0.9745 - val_loss: 0.1003 - val_acc: 0.8688
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0196 - acc: 0.9765 - val_loss: 0.0998 - val_acc: 0.8625
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0190 - acc: 0.9795 - val_loss: 0.0883 - val_acc: 0.8888
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.0141 - acc: 0.9855 - val_loss: 0.0890 - val_acc: 0.8825
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0128 - acc: 0.9880 - val_loss: 0.1007 - val_acc: 0.8700
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.0140 - acc: 0.9875 - val_loss: 0.1030 - val_acc: 0.8550
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0107 - acc: 0.9885 - val_loss: 0.0931 - val_acc: 0.8850
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0124 - acc: 0.9885 - val_loss: 0.0989 - val_acc: 0.8775
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.0151 - acc: 0.9850 - val_loss: 0.0977 - val_acc: 0.8750
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0124 - acc: 0.9885 - val_loss: 0.1240 - val_acc: 0.8438
Epoch 1/1
2000/2000 [==============================] - 47s - loss: 0.0134 - acc: 0.9860 - val_loss: 0.0907 - val_acc: 0.8812
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0125 - acc: 0.9870 - val_loss: 0.0911 - val_acc: 0.8875
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0101 - acc: 0.9905 - val_loss: 0.0997 - val_acc: 0.8700
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0092 - acc: 0.9910 - val_loss: 0.1077 - val_acc: 0.8600
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0105 - acc: 0.9890 - val_loss: 0.1052 - val_acc: 0.8638
Epoch 1/1
2000/2000 [==============================] - 44s - loss: 0.0106 - acc: 0.9875 - val_loss: 0.0903 - val_acc: 0.8775
Epoch 1/1
2000/2000 [==============================] - 46s - loss: 0.0085 - acc: 0.9910 - val_loss: 0.0949 - val_acc: 0.8812
Epoch 1/1
2000/2000 [==============================] - 45s - loss: 0.0083 - acc: 0.9925 - val_loss: 0.0871 - val_acc: 0.8962

In [6]:
plot_performance(history_finetune)


Discussion

We get a test accuracy of ~89%. This is almost a 5% jump over the training from scratch case. This is a huge jump in test accuracy! One should not expect such a bug jump usually. We should bear in mind that the ImageNet dataset, on which AlexNet was pre-trained already contained dogs and cats among its classes. However, many papers report benefits of fine-tuning over training from scratch.

Task 3 : Using AlexNet as a feature extractor

We treat the activation maps from outout of the last convolutional layer as dense feature maps. These are flattened and fed into a single layer ANN consisting of 256 neurons.

In the cell below, we get a sliced CNN model (alexnet_convolutional_only) which will enable us to extract features from any layer specified by its name ("convpool_5" in our case)


In [7]:
alexnet = get_alexnet(input_size,nb_classes,mean_flag)
alexnet.load_weights('../convnets-keras/weights/alexnet_weights.h5', by_name=True)

alexnet_convolutional_only = Model(input=alexnet.input, output=alexnet.get_layer('convpool_5').output)

Get the output of the sliced CNN model


In [9]:
#code ported from https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

import numpy as np

generator = train_datagen.flow_from_directory(
        '../Data/Train',
        target_size=(227, 227),
        batch_size=batch_size,
        class_mode=None,  # this means our generator will only yield batches of data, no labels
        shuffle=False)  # our data will be in order, so all first 1000 images will be cats, then 1000 dogs
# the predict_generator method returns the output of a model, given
# a generator that yields batches of numpy data
train_data = alexnet_convolutional_only.predict_generator(generator, 2000)
train_labels = np.array([[1, 0]] * 1000 + [[0, 1]] * 1000)

generator = test_datagen.flow_from_directory(
        '../Data/Test',
        target_size=(227, 227),
        batch_size=batch_size,
        class_mode=None,
        shuffle=False)

validation_data = alexnet_convolutional_only.predict_generator(generator, 800)
validation_labels = np.array([[1,0]] * 400 + [[0,1]] * 400)


Found 2000 images belonging to 2 classes.
Found 800 images belonging to 2 classes.

We define and train a single layer ANN model with 256 neurons


In [10]:
from keras.models import Sequential

model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd,
              loss='mse',
              metrics=['accuracy'])

history_convpool_5 = model.fit(train_data, train_labels,
                      nb_epoch=80,
                      batch_size=batch_size,
                      validation_data=(validation_data, validation_labels),
                      verbose=2)


Train on 2000 samples, validate on 800 samples
Epoch 1/80
0s - loss: 0.2403 - acc: 0.6190 - val_loss: 0.1720 - val_acc: 0.7625
Epoch 2/80
0s - loss: 0.1821 - acc: 0.7230 - val_loss: 0.1565 - val_acc: 0.7925
Epoch 3/80
0s - loss: 0.1664 - acc: 0.7550 - val_loss: 0.1502 - val_acc: 0.8000
Epoch 4/80
0s - loss: 0.1528 - acc: 0.7830 - val_loss: 0.1508 - val_acc: 0.7987
Epoch 5/80
0s - loss: 0.1464 - acc: 0.7950 - val_loss: 0.1425 - val_acc: 0.8063
Epoch 6/80
0s - loss: 0.1350 - acc: 0.8210 - val_loss: 0.1418 - val_acc: 0.8025
Epoch 7/80
0s - loss: 0.1263 - acc: 0.8325 - val_loss: 0.1373 - val_acc: 0.8125
Epoch 8/80
0s - loss: 0.1181 - acc: 0.8425 - val_loss: 0.1354 - val_acc: 0.8125
Epoch 9/80
0s - loss: 0.1093 - acc: 0.8550 - val_loss: 0.1371 - val_acc: 0.8187
Epoch 10/80
0s - loss: 0.1027 - acc: 0.8670 - val_loss: 0.1472 - val_acc: 0.7887
Epoch 11/80
0s - loss: 0.0969 - acc: 0.8755 - val_loss: 0.1527 - val_acc: 0.7762
Epoch 12/80
0s - loss: 0.0923 - acc: 0.8795 - val_loss: 0.1466 - val_acc: 0.7900
Epoch 13/80
0s - loss: 0.0858 - acc: 0.8980 - val_loss: 0.1318 - val_acc: 0.8150
Epoch 14/80
0s - loss: 0.0792 - acc: 0.9005 - val_loss: 0.1308 - val_acc: 0.8250
Epoch 15/80
0s - loss: 0.0791 - acc: 0.9085 - val_loss: 0.1290 - val_acc: 0.8250
Epoch 16/80
0s - loss: 0.0727 - acc: 0.9145 - val_loss: 0.1323 - val_acc: 0.8213
Epoch 17/80
0s - loss: 0.0678 - acc: 0.9260 - val_loss: 0.1286 - val_acc: 0.8213
Epoch 18/80
0s - loss: 0.0680 - acc: 0.9220 - val_loss: 0.1284 - val_acc: 0.8237
Epoch 19/80
0s - loss: 0.0625 - acc: 0.9335 - val_loss: 0.1313 - val_acc: 0.8287
Epoch 20/80
0s - loss: 0.0602 - acc: 0.9375 - val_loss: 0.1310 - val_acc: 0.8137
Epoch 21/80
0s - loss: 0.0547 - acc: 0.9415 - val_loss: 0.1334 - val_acc: 0.8200
Epoch 22/80
0s - loss: 0.0540 - acc: 0.9465 - val_loss: 0.1258 - val_acc: 0.8250
Epoch 23/80
0s - loss: 0.0525 - acc: 0.9445 - val_loss: 0.1280 - val_acc: 0.8125
Epoch 24/80
0s - loss: 0.0493 - acc: 0.9495 - val_loss: 0.1356 - val_acc: 0.8163
Epoch 25/80
0s - loss: 0.0501 - acc: 0.9490 - val_loss: 0.1295 - val_acc: 0.8225
Epoch 26/80
0s - loss: 0.0432 - acc: 0.9585 - val_loss: 0.1287 - val_acc: 0.8187
Epoch 27/80
0s - loss: 0.0413 - acc: 0.9615 - val_loss: 0.1314 - val_acc: 0.8200
Epoch 28/80
0s - loss: 0.0377 - acc: 0.9665 - val_loss: 0.1273 - val_acc: 0.8213
Epoch 29/80
0s - loss: 0.0378 - acc: 0.9685 - val_loss: 0.1262 - val_acc: 0.8187
Epoch 30/80
0s - loss: 0.0350 - acc: 0.9680 - val_loss: 0.1263 - val_acc: 0.8225
Epoch 31/80
0s - loss: 0.0328 - acc: 0.9720 - val_loss: 0.1253 - val_acc: 0.8237
Epoch 32/80
0s - loss: 0.0312 - acc: 0.9700 - val_loss: 0.1286 - val_acc: 0.8163
Epoch 33/80
0s - loss: 0.0320 - acc: 0.9710 - val_loss: 0.1305 - val_acc: 0.8200
Epoch 34/80
0s - loss: 0.0295 - acc: 0.9740 - val_loss: 0.1287 - val_acc: 0.8213
Epoch 35/80
0s - loss: 0.0277 - acc: 0.9800 - val_loss: 0.1257 - val_acc: 0.8250
Epoch 36/80
0s - loss: 0.0253 - acc: 0.9810 - val_loss: 0.1270 - val_acc: 0.8175
Epoch 37/80
0s - loss: 0.0239 - acc: 0.9815 - val_loss: 0.1294 - val_acc: 0.8150
Epoch 38/80
0s - loss: 0.0237 - acc: 0.9810 - val_loss: 0.1289 - val_acc: 0.8175
Epoch 39/80
0s - loss: 0.0226 - acc: 0.9840 - val_loss: 0.1285 - val_acc: 0.8337
Epoch 40/80
0s - loss: 0.0222 - acc: 0.9840 - val_loss: 0.1316 - val_acc: 0.8187
Epoch 41/80
0s - loss: 0.0227 - acc: 0.9785 - val_loss: 0.1245 - val_acc: 0.8313
Epoch 42/80
0s - loss: 0.0201 - acc: 0.9875 - val_loss: 0.1259 - val_acc: 0.8300
Epoch 43/80
0s - loss: 0.0212 - acc: 0.9825 - val_loss: 0.1279 - val_acc: 0.8213
Epoch 44/80
0s - loss: 0.0203 - acc: 0.9845 - val_loss: 0.1281 - val_acc: 0.8275
Epoch 45/80
0s - loss: 0.0175 - acc: 0.9900 - val_loss: 0.1262 - val_acc: 0.8287
Epoch 46/80
0s - loss: 0.0171 - acc: 0.9905 - val_loss: 0.1287 - val_acc: 0.8263
Epoch 47/80
0s - loss: 0.0169 - acc: 0.9885 - val_loss: 0.1265 - val_acc: 0.8313
Epoch 48/80
0s - loss: 0.0161 - acc: 0.9885 - val_loss: 0.1306 - val_acc: 0.8163
Epoch 49/80
0s - loss: 0.0140 - acc: 0.9915 - val_loss: 0.1276 - val_acc: 0.8300
Epoch 50/80
0s - loss: 0.0142 - acc: 0.9915 - val_loss: 0.1260 - val_acc: 0.8263
Epoch 51/80
0s - loss: 0.0153 - acc: 0.9890 - val_loss: 0.1243 - val_acc: 0.8363
Epoch 52/80
0s - loss: 0.0138 - acc: 0.9925 - val_loss: 0.1251 - val_acc: 0.8325
Epoch 53/80
0s - loss: 0.0131 - acc: 0.9920 - val_loss: 0.1287 - val_acc: 0.8263
Epoch 54/80
0s - loss: 0.0125 - acc: 0.9920 - val_loss: 0.1256 - val_acc: 0.8375
Epoch 55/80
0s - loss: 0.0133 - acc: 0.9895 - val_loss: 0.1251 - val_acc: 0.8275
Epoch 56/80
0s - loss: 0.0118 - acc: 0.9925 - val_loss: 0.1272 - val_acc: 0.8325
Epoch 57/80
0s - loss: 0.0109 - acc: 0.9950 - val_loss: 0.1271 - val_acc: 0.8287
Epoch 58/80
0s - loss: 0.0109 - acc: 0.9945 - val_loss: 0.1288 - val_acc: 0.8337
Epoch 59/80
0s - loss: 0.0116 - acc: 0.9920 - val_loss: 0.1265 - val_acc: 0.8287
Epoch 60/80
0s - loss: 0.0107 - acc: 0.9940 - val_loss: 0.1260 - val_acc: 0.8287
Epoch 61/80
0s - loss: 0.0097 - acc: 0.9940 - val_loss: 0.1265 - val_acc: 0.8287
Epoch 62/80
0s - loss: 0.0093 - acc: 0.9970 - val_loss: 0.1272 - val_acc: 0.8350
Epoch 63/80
0s - loss: 0.0094 - acc: 0.9940 - val_loss: 0.1256 - val_acc: 0.8275
Epoch 64/80
0s - loss: 0.0096 - acc: 0.9930 - val_loss: 0.1250 - val_acc: 0.8325
Epoch 65/80
0s - loss: 0.0079 - acc: 0.9960 - val_loss: 0.1265 - val_acc: 0.8300
Epoch 66/80
0s - loss: 0.0069 - acc: 0.9980 - val_loss: 0.1277 - val_acc: 0.8325
Epoch 67/80
0s - loss: 0.0068 - acc: 0.9980 - val_loss: 0.1269 - val_acc: 0.8275
Epoch 68/80
0s - loss: 0.0071 - acc: 0.9970 - val_loss: 0.1282 - val_acc: 0.8287
Epoch 69/80
0s - loss: 0.0081 - acc: 0.9965 - val_loss: 0.1234 - val_acc: 0.8413
Epoch 70/80
0s - loss: 0.0081 - acc: 0.9950 - val_loss: 0.1252 - val_acc: 0.8300
Epoch 71/80
0s - loss: 0.0071 - acc: 0.9970 - val_loss: 0.1286 - val_acc: 0.8275
Epoch 72/80
0s - loss: 0.0078 - acc: 0.9950 - val_loss: 0.1282 - val_acc: 0.8313
Epoch 73/80
0s - loss: 0.0052 - acc: 0.9990 - val_loss: 0.1297 - val_acc: 0.8213
Epoch 74/80
0s - loss: 0.0076 - acc: 0.9950 - val_loss: 0.1273 - val_acc: 0.8325
Epoch 75/80
0s - loss: 0.0058 - acc: 0.9975 - val_loss: 0.1269 - val_acc: 0.8325
Epoch 76/80
0s - loss: 0.0065 - acc: 0.9970 - val_loss: 0.1289 - val_acc: 0.8287
Epoch 77/80
0s - loss: 0.0051 - acc: 0.9985 - val_loss: 0.1271 - val_acc: 0.8263
Epoch 78/80
0s - loss: 0.0063 - acc: 0.9975 - val_loss: 0.1275 - val_acc: 0.8313
Epoch 79/80
0s - loss: 0.0051 - acc: 0.9985 - val_loss: 0.1290 - val_acc: 0.8287
Epoch 80/80
0s - loss: 0.0055 - acc: 0.9975 - val_loss: 0.1281 - val_acc: 0.8263

In [11]:
plot_performance(history_convpool_5)


Discussion We obtain a classification accuracy of ~84 which seems at par with the accuracy obtained while training from scratch. The model converges in very few epochs.