In [1]:
from utils import *
from vgg16 import Vgg16


Using TensorFlow backend.

In [2]:
vgg = Vgg16()
model = vgg.model

In [3]:
# model.summary()

In [4]:
layers = model.layers

In [5]:
last_conv_idx = [
    index for index, layer in enumerate(layers)
        if type(layer) is Convolution2D
][-1]

In [6]:
last_conv_idx


Out[6]:
30

In [7]:
layers[last_conv_idx]


Out[7]:
<keras.layers.convolutional.Convolution2D at 0x7f3e1fb525c0>

In [8]:
conv_layers = layers[:last_conv_idx+1]
#conv_layers

In [9]:
fc_layers = layers[last_conv_idx+1:]
#fc_layers

In [10]:
# path = 'data/redux/'
path = 'data/redux/sample/'
BATCH_SIZE = 8

In [11]:
batches = get_batches(path + 'train', shuffle=False, batch_size=BATCH_SIZE)
val_batches = get_batches(path + 'valid', shuffle=False, batch_size=BATCH_SIZE)


Found 200 images belonging to 2 classes.
Found 50 images belonging to 2 classes.

In [12]:
val_labels = onehot(val_batches.classes)
trn_labels = onehot(batches.classes)

In [13]:
conv_model = Sequential(conv_layers)
# conv_model

In [14]:
val_features = conv_model.predict_generator(val_batches, val_batches.nb_sample)

In [15]:
trn_features = conv_model.predict_generator(batches, batches.nb_sample)

In [16]:
trn_features.shape


Out[16]:
(200, 512, 14, 14)

In [17]:
batches.class_indices


Out[17]:
{'cats': 0, 'dogs': 1}

In [18]:
# layers = zip(model.layers, fc_layers)
# for l1, l2 in layers:
#     print('L1: {}'.format(l1))
#     # print('L2: {}'.format(l2))

In [19]:
# model.layers
opt = RMSprop(lr=.00001, rho=.7)

In [20]:
def get_fc_model():
    model = Sequential(
        [
            MaxPooling2D(input_shape=conv_layers[-1].output_shape[1:]),
            Flatten(),
            Dense(4096, activation='relu'),
            Dropout(0.),
            Dense(4096, activation='relu'),
            Dropout(0.),
            Dense(2, activation='softmax')
        ]
    )
    
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    return model

In [21]:
fc_model = get_fc_model()

In [22]:
fc_model.fit(trn_features, trn_labels, nb_epoch=1, batch_size=1, validation_data=(val_features, val_labels))


Train on 200 samples, validate on 50 samples
Epoch 1/1
200/200 [==============================] - 275s - loss: 2.2950 - acc: 0.7000 - val_loss: 0.3810 - val_acc: 0.9000
Out[22]:
<keras.callbacks.History at 0x7f3e1e3530b8>

In [23]:
vgg.model.summary()


____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
lambda_1 (Lambda)                (None, 3, 224, 224)   0           lambda_input_1[0][0]             
____________________________________________________________________________________________________
zeropadding2d_1 (ZeroPadding2D)  (None, 3, 226, 226)   0           lambda_1[0][0]                   
                                                                   lambda_1[0][0]                   
____________________________________________________________________________________________________
convolution2d_1 (Convolution2D)  (None, 64, 224, 224)  1792        zeropadding2d_1[0][0]            
                                                                   zeropadding2d_1[1][0]            
____________________________________________________________________________________________________
zeropadding2d_2 (ZeroPadding2D)  (None, 64, 226, 226)  0           convolution2d_1[0][0]            
                                                                   convolution2d_1[1][0]            
____________________________________________________________________________________________________
convolution2d_2 (Convolution2D)  (None, 64, 224, 224)  36928       zeropadding2d_2[0][0]            
                                                                   zeropadding2d_2[1][0]            
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 64, 112, 112)  0           convolution2d_2[0][0]            
                                                                   convolution2d_2[1][0]            
____________________________________________________________________________________________________
zeropadding2d_3 (ZeroPadding2D)  (None, 64, 114, 114)  0           maxpooling2d_1[0][0]             
                                                                   maxpooling2d_1[1][0]             
____________________________________________________________________________________________________
convolution2d_3 (Convolution2D)  (None, 128, 112, 112) 73856       zeropadding2d_3[0][0]            
                                                                   zeropadding2d_3[1][0]            
____________________________________________________________________________________________________
zeropadding2d_4 (ZeroPadding2D)  (None, 128, 114, 114) 0           convolution2d_3[0][0]            
                                                                   convolution2d_3[1][0]            
____________________________________________________________________________________________________
convolution2d_4 (Convolution2D)  (None, 128, 112, 112) 147584      zeropadding2d_4[0][0]            
                                                                   zeropadding2d_4[1][0]            
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 128, 56, 56)   0           convolution2d_4[0][0]            
                                                                   convolution2d_4[1][0]            
____________________________________________________________________________________________________
zeropadding2d_5 (ZeroPadding2D)  (None, 128, 58, 58)   0           maxpooling2d_2[0][0]             
                                                                   maxpooling2d_2[1][0]             
____________________________________________________________________________________________________
convolution2d_5 (Convolution2D)  (None, 256, 56, 56)   295168      zeropadding2d_5[0][0]            
                                                                   zeropadding2d_5[1][0]            
____________________________________________________________________________________________________
zeropadding2d_6 (ZeroPadding2D)  (None, 256, 58, 58)   0           convolution2d_5[0][0]            
                                                                   convolution2d_5[1][0]            
____________________________________________________________________________________________________
convolution2d_6 (Convolution2D)  (None, 256, 56, 56)   590080      zeropadding2d_6[0][0]            
                                                                   zeropadding2d_6[1][0]            
____________________________________________________________________________________________________
zeropadding2d_7 (ZeroPadding2D)  (None, 256, 58, 58)   0           convolution2d_6[0][0]            
                                                                   convolution2d_6[1][0]            
____________________________________________________________________________________________________
convolution2d_7 (Convolution2D)  (None, 256, 56, 56)   590080      zeropadding2d_7[0][0]            
                                                                   zeropadding2d_7[1][0]            
____________________________________________________________________________________________________
maxpooling2d_3 (MaxPooling2D)    (None, 256, 28, 28)   0           convolution2d_7[0][0]            
                                                                   convolution2d_7[1][0]            
____________________________________________________________________________________________________
zeropadding2d_8 (ZeroPadding2D)  (None, 256, 30, 30)   0           maxpooling2d_3[0][0]             
                                                                   maxpooling2d_3[1][0]             
____________________________________________________________________________________________________
convolution2d_8 (Convolution2D)  (None, 512, 28, 28)   1180160     zeropadding2d_8[0][0]            
                                                                   zeropadding2d_8[1][0]            
____________________________________________________________________________________________________
zeropadding2d_9 (ZeroPadding2D)  (None, 512, 30, 30)   0           convolution2d_8[0][0]            
                                                                   convolution2d_8[1][0]            
____________________________________________________________________________________________________
convolution2d_9 (Convolution2D)  (None, 512, 28, 28)   2359808     zeropadding2d_9[0][0]            
                                                                   zeropadding2d_9[1][0]            
____________________________________________________________________________________________________
zeropadding2d_10 (ZeroPadding2D) (None, 512, 30, 30)   0           convolution2d_9[0][0]            
                                                                   convolution2d_9[1][0]            
____________________________________________________________________________________________________
convolution2d_10 (Convolution2D) (None, 512, 28, 28)   2359808     zeropadding2d_10[0][0]           
                                                                   zeropadding2d_10[1][0]           
____________________________________________________________________________________________________
maxpooling2d_4 (MaxPooling2D)    (None, 512, 14, 14)   0           convolution2d_10[0][0]           
                                                                   convolution2d_10[1][0]           
____________________________________________________________________________________________________
zeropadding2d_11 (ZeroPadding2D) (None, 512, 16, 16)   0           maxpooling2d_4[0][0]             
                                                                   maxpooling2d_4[1][0]             
____________________________________________________________________________________________________
convolution2d_11 (Convolution2D) (None, 512, 14, 14)   2359808     zeropadding2d_11[0][0]           
                                                                   zeropadding2d_11[1][0]           
____________________________________________________________________________________________________
zeropadding2d_12 (ZeroPadding2D) (None, 512, 16, 16)   0           convolution2d_11[0][0]           
                                                                   convolution2d_11[1][0]           
____________________________________________________________________________________________________
convolution2d_12 (Convolution2D) (None, 512, 14, 14)   2359808     zeropadding2d_12[0][0]           
                                                                   zeropadding2d_12[1][0]           
____________________________________________________________________________________________________
zeropadding2d_13 (ZeroPadding2D) (None, 512, 16, 16)   0           convolution2d_12[0][0]           
                                                                   convolution2d_12[1][0]           
____________________________________________________________________________________________________
convolution2d_13 (Convolution2D) (None, 512, 14, 14)   2359808     zeropadding2d_13[0][0]           
                                                                   zeropadding2d_13[1][0]           
____________________________________________________________________________________________________
maxpooling2d_5 (MaxPooling2D)    (None, 512, 7, 7)     0           convolution2d_13[0][0]           
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 25088)         0           maxpooling2d_5[0][0]             
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 4096)          102764544   flatten_1[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 (Dense)                  (None, 1000)          4097000     dropout_2[0][0]                  
====================================================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
____________________________________________________________________________________________________

In [ ]:
# 1.batch_normalization
# 2.ensembling
# 3.data augmentation