In [1]:
from __future__ import division, print_function
%matplotlib inline
from importlib import reload  # Python 3
import utils; reload(utils)
from utils import *


Using cuDNN version 5105 on context None
Mapped name None to device cuda0: GeForce GTX TITAN X (0000:04:00.0)
Using Theano backend.

Setup


In [2]:
path = "data/dogscats/"
# path = "data/dogscats/sample/"
model_path = path + 'models/'
if not os.path.exists(model_path): os.mkdir(model_path)

batch_size=128
# batch_size=1

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


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

In [4]:
(val_classes, trn_classes, val_labels, trn_labels, 
    val_filenames, filenames, test_filenames) = get_classes(path)


Found 23000 images belonging to 2 classes.
Found 2000 images belonging to 2 classes.
Found 12500 images belonging to 1 classes.

In this notebook we're going to create an ensemble of models and use their average as our predictions. For each ensemble, we're going to follow our usual fine-tuning steps:

1) Create a model that retrains just the last layer 2) Add this to a model containing all VGG layers except the last layer 3) Fine-tune just the dense layers of this model (pre-computing the convolutional layers) 4) Add data augmentation, fine-tuning the dense layers without pre-computation.

So first, we need to create our VGG model and pre-compute the output of the conv layers:


In [5]:
model = Vgg16().model
conv_layers,fc_layers = split_at(model, Convolution2D)

In [6]:
conv_model = Sequential(conv_layers)

In [7]:
val_features = conv_model.predict_generator(val_batches, int(np.ceil(val_batches.samples/batch_size)))
trn_features = conv_model.predict_generator(batches, int(np.ceil(batches.samples/batch_size)))

In [8]:
save_array(model_path + 'train_convlayer_features.bc', trn_features)
save_array(model_path + 'valid_convlayer_features.bc', val_features)

In the future we can just load these precomputed features:


In [9]:
trn_features = load_array(model_path+'train_convlayer_features.bc')
val_features = load_array(model_path+'valid_convlayer_features.bc')

We can also save some time by pre-computing the training and validation arrays with the image decoding and resizing already done:


In [10]:
trn = get_data(path+'train')
val = get_data(path+'valid')


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

In [11]:
save_array(model_path+'train_data.bc', trn)
save_array(model_path+'valid_data.bc', val)

In the future we can just load these resized images:


In [12]:
trn = load_array(model_path+'train_data.bc')
val = load_array(model_path+'valid_data.bc')

Finally, we can precompute the output of all but the last dropout and dense layers, for creating the first stage of the model:


In [13]:
model.pop()
model.pop()

In [14]:
ll_val_feat = model.predict_generator(val_batches, int(np.ceil(val_batches.samples/batch_size)))
ll_feat = model.predict_generator(batches, int(np.ceil(batches.samples/batch_size)))

In [15]:
save_array(model_path + 'train_ll_feat.bc', ll_feat)
save_array(model_path + 'valid_ll_feat.bc', ll_val_feat)

In [16]:
ll_feat = load_array(model_path+ 'train_ll_feat.bc')
ll_val_feat = load_array(model_path + 'valid_ll_feat.bc')

...and let's also grab the test data, for when we need to submit:


In [17]:
test = get_data(path+'test')
save_array(model_path+'test_data.bc', test)


Found 12500 images belonging to 1 classes.

In [18]:
test = load_array(model_path+'test_data.bc')

Last layer

The functions automate creating a model that trains the last layer from scratch, and then adds those new layers on to the main model.


In [19]:
def get_ll_layers():
    return [ 
        BatchNormalization(input_shape=(4096,)),
        Dropout(0.5),
        Dense(2, activation='softmax') 
        ]

In [20]:
def train_last_layer(i):
    ll_layers = get_ll_layers()
    ll_model = Sequential(ll_layers)
    ll_model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    ll_model.optimizer.lr=1e-5
    ll_model.fit(ll_feat, trn_labels, validation_data=(ll_val_feat, val_labels), epochs=12)
    ll_model.optimizer.lr=1e-7
    ll_model.fit(ll_feat, trn_labels, validation_data=(ll_val_feat, val_labels), epochs=1)
    ll_model.save_weights(model_path+'ll_bn' + i + '.h5')

    vgg = Vgg16BN()
    model = vgg.model
    model.pop(); model.pop(); model.pop()
    for layer in model.layers: layer.trainable=False
    model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])

    ll_layers = get_ll_layers()
    for layer in ll_layers: model.add(layer)
    for l1,l2 in zip(ll_model.layers, model.layers[-3:]):
        l2.set_weights(l1.get_weights())
    model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    model.save_weights(model_path+'bn' + i + '.h5')
    return model

Dense model


In [21]:
def get_conv_model(model):
    layers = model.layers
    last_conv_idx = [index for index,layer in enumerate(layers) 
                         if type(layer) is Convolution2D][-1]

    conv_layers = layers[:last_conv_idx+1]
    conv_model = Sequential(conv_layers)
    fc_layers = layers[last_conv_idx+1:]
    return conv_model, fc_layers, last_conv_idx

In [22]:
def get_fc_layers(p, in_shape):
    return [
        MaxPooling2D(input_shape=in_shape),
        Flatten(),
        Dense(4096, activation='relu'),
        BatchNormalization(),
        Dropout(p),
        Dense(4096, activation='relu'),
        BatchNormalization(),
        Dropout(p),
        Dense(2, activation='softmax')
        ]

In [23]:
def train_dense_layers(i, model):
    conv_model, fc_layers, last_conv_idx = get_conv_model(model)
    conv_shape = conv_model.output_shape[1:]
    fc_model = Sequential(get_fc_layers(0.5, conv_shape))
    for l1,l2 in zip(fc_model.layers, fc_layers): 
        weights = l2.get_weights()
        l1.set_weights(weights)
    fc_model.compile(optimizer=Adam(1e-5), loss='categorical_crossentropy', 
                     metrics=['accuracy'])
    fc_model.fit(trn_features, trn_labels, epochs=2, 
         batch_size=batch_size, validation_data=(val_features, val_labels))

    # width_zoom_range removed from the following because not available in Keras2
    gen = image.ImageDataGenerator(rotation_range=10, width_shift_range=0.05, zoom_range=0.05,
       channel_shift_range=10, height_shift_range=0.05, shear_range=0.05, horizontal_flip=True)
    batches = gen.flow(trn, trn_labels, batch_size=batch_size)
    val_batches = image.ImageDataGenerator().flow(val, val_labels, 
                      shuffle=False, batch_size=batch_size)

    for layer in conv_model.layers: layer.trainable = False
    for layer in get_fc_layers(0.5, conv_shape): conv_model.add(layer)
    for l1,l2 in zip(conv_model.layers[last_conv_idx+1:], fc_model.layers): 
        l1.set_weights(l2.get_weights())

    steps_per_epoch = int(np.ceil(batches.n/batch_size))
    validation_steps = int(np.ceil(val_batches.n/batch_size))

    conv_model.compile(optimizer=Adam(1e-5), loss='categorical_crossentropy', 
                       metrics=['accuracy'])
    conv_model.save_weights(model_path+'no_dropout_bn' + i + '.h5')
    conv_model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1, 
                            validation_data=val_batches, validation_steps=validation_steps)
    for layer in conv_model.layers[16:]: layer.trainable = True
    conv_model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=8, 
                            validation_data=val_batches, validation_steps=validation_steps)

    conv_model.optimizer.lr = 1e-7
    conv_model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=10, 
                            validation_data=val_batches, validation_steps=validation_steps)
    conv_model.save_weights(model_path + 'aug' + i + '.h5')

Build ensemble


In [24]:
for i in range(5):
    i = str(i)
    model = train_last_layer(i)
    train_dense_layers(i, model)


Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s - loss: 0.8578 - acc: 0.6804 - val_loss: 2.2534 - val_acc: 0.3120
Epoch 2/12
23000/23000 [==============================] - 1s - loss: 0.6839 - acc: 0.7794 - val_loss: 2.4996 - val_acc: 0.2990
Epoch 3/12
23000/23000 [==============================] - 1s - loss: 0.6496 - acc: 0.7960 - val_loss: 2.4651 - val_acc: 0.2970
Epoch 4/12
23000/23000 [==============================] - 1s - loss: 0.6391 - acc: 0.7963 - val_loss: 2.4541 - val_acc: 0.2965
Epoch 5/12
23000/23000 [==============================] - 1s - loss: 0.6348 - acc: 0.8000 - val_loss: 2.4300 - val_acc: 0.2945
Epoch 6/12
23000/23000 [==============================] - 1s - loss: 0.6146 - acc: 0.7994 - val_loss: 2.3874 - val_acc: 0.2950
Epoch 7/12
23000/23000 [==============================] - 1s - loss: 0.6045 - acc: 0.8013 - val_loss: 2.3943 - val_acc: 0.2920
Epoch 8/12
23000/23000 [==============================] - 1s - loss: 0.5854 - acc: 0.8081 - val_loss: 2.3667 - val_acc: 0.2930
Epoch 9/12
23000/23000 [==============================] - 1s - loss: 0.5955 - acc: 0.8052 - val_loss: 2.3389 - val_acc: 0.2930
Epoch 10/12
23000/23000 [==============================] - 1s - loss: 0.5776 - acc: 0.8110 - val_loss: 2.2973 - val_acc: 0.2920
Epoch 11/12
23000/23000 [==============================] - 1s - loss: 0.5655 - acc: 0.8106 - val_loss: 2.2377 - val_acc: 0.2935
Epoch 12/12
23000/23000 [==============================] - 1s - loss: 0.5638 - acc: 0.8119 - val_loss: 2.2357 - val_acc: 0.2895
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s - loss: 0.5568 - acc: 0.8107 - val_loss: 2.2523 - val_acc: 0.2910
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 9s - loss: 0.0881 - acc: 0.9671 - val_loss: 0.0441 - val_acc: 0.9855
Epoch 2/2
23000/23000 [==============================] - 9s - loss: 0.0414 - acc: 0.9862 - val_loss: 0.0419 - val_acc: 0.9850
Epoch 1/1
180/180 [==============================] - 194s - loss: 0.0536 - acc: 0.9815 - val_loss: 0.0425 - val_acc: 0.9850
Epoch 1/8
180/180 [==============================] - 191s - loss: 0.0429 - acc: 0.9835 - val_loss: 0.0487 - val_acc: 0.9830
Epoch 2/8
180/180 [==============================] - 189s - loss: 0.0344 - acc: 0.9876 - val_loss: 0.0471 - val_acc: 0.9860
Epoch 3/8
180/180 [==============================] - 188s - loss: 0.0242 - acc: 0.9913 - val_loss: 0.0460 - val_acc: 0.9855
Epoch 4/8
180/180 [==============================] - 188s - loss: 0.0293 - acc: 0.9881 - val_loss: 0.0475 - val_acc: 0.9845
Epoch 5/8
180/180 [==============================] - 188s - loss: 0.0209 - acc: 0.9923 - val_loss: 0.0500 - val_acc: 0.9840
Epoch 6/8
180/180 [==============================] - 188s - loss: 0.0166 - acc: 0.9941 - val_loss: 0.0509 - val_acc: 0.9850
Epoch 7/8
180/180 [==============================] - 188s - loss: 0.0147 - acc: 0.9949 - val_loss: 0.0517 - val_acc: 0.9835
Epoch 8/8
180/180 [==============================] - 188s - loss: 0.0152 - acc: 0.9943 - val_loss: 0.0535 - val_acc: 0.9840
Epoch 1/10
180/180 [==============================] - 189s - loss: 0.0130 - acc: 0.9953 - val_loss: 0.0537 - val_acc: 0.9835
Epoch 2/10
180/180 [==============================] - 188s - loss: 0.0141 - acc: 0.9949 - val_loss: 0.0550 - val_acc: 0.9840
Epoch 3/10
180/180 [==============================] - 188s - loss: 0.0111 - acc: 0.9961 - val_loss: 0.0555 - val_acc: 0.9855
Epoch 4/10
180/180 [==============================] - 188s - loss: 0.0109 - acc: 0.9958 - val_loss: 0.0581 - val_acc: 0.9840
Epoch 5/10
180/180 [==============================] - 188s - loss: 0.0080 - acc: 0.9968 - val_loss: 0.0632 - val_acc: 0.9845
Epoch 6/10
180/180 [==============================] - 189s - loss: 0.0088 - acc: 0.9964 - val_loss: 0.0583 - val_acc: 0.9850
Epoch 7/10
180/180 [==============================] - 189s - loss: 0.0071 - acc: 0.9975 - val_loss: 0.0610 - val_acc: 0.9840
Epoch 8/10
180/180 [==============================] - 189s - loss: 0.0077 - acc: 0.9977 - val_loss: 0.0571 - val_acc: 0.9855
Epoch 9/10
180/180 [==============================] - 188s - loss: 0.0057 - acc: 0.9978 - val_loss: 0.0604 - val_acc: 0.9845
Epoch 10/10
180/180 [==============================] - 189s - loss: 0.0058 - acc: 0.9977 - val_loss: 0.0643 - val_acc: 0.9855
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s - loss: 0.8303 - acc: 0.6877 - val_loss: 2.2061 - val_acc: 0.3115
Epoch 2/12
23000/23000 [==============================] - 1s - loss: 0.6640 - acc: 0.7842 - val_loss: 2.4278 - val_acc: 0.3025
Epoch 3/12
23000/23000 [==============================] - 1s - loss: 0.6406 - acc: 0.7919 - val_loss: 2.4346 - val_acc: 0.2975
Epoch 4/12
23000/23000 [==============================] - 1s - loss: 0.6319 - acc: 0.7983 - val_loss: 2.4229 - val_acc: 0.2950
Epoch 5/12
23000/23000 [==============================] - 1s - loss: 0.6217 - acc: 0.8004 - val_loss: 2.3945 - val_acc: 0.2945
Epoch 6/12
23000/23000 [==============================] - 1s - loss: 0.6077 - acc: 0.8027 - val_loss: 2.3483 - val_acc: 0.2935
Epoch 7/12
23000/23000 [==============================] - 1s - loss: 0.6033 - acc: 0.8017 - val_loss: 2.3561 - val_acc: 0.2930
Epoch 8/12
23000/23000 [==============================] - 1s - loss: 0.5905 - acc: 0.8072 - val_loss: 2.3143 - val_acc: 0.2910
Epoch 9/12
23000/23000 [==============================] - 1s - loss: 0.5934 - acc: 0.8039 - val_loss: 2.2917 - val_acc: 0.2880
Epoch 10/12
23000/23000 [==============================] - 1s - loss: 0.5747 - acc: 0.8090 - val_loss: 2.3198 - val_acc: 0.2890
Epoch 11/12
23000/23000 [==============================] - 1s - loss: 0.5741 - acc: 0.8102 - val_loss: 2.2705 - val_acc: 0.2875
Epoch 12/12
23000/23000 [==============================] - 1s - loss: 0.5653 - acc: 0.8133 - val_loss: 2.2241 - val_acc: 0.2875
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s - loss: 0.5566 - acc: 0.8143 - val_loss: 2.2264 - val_acc: 0.2890
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 9s - loss: 0.0887 - acc: 0.9655 - val_loss: 0.0397 - val_acc: 0.9845
Epoch 2/2
23000/23000 [==============================] - 9s - loss: 0.0392 - acc: 0.9859 - val_loss: 0.0395 - val_acc: 0.9875
Epoch 1/1
180/180 [==============================] - 195s - loss: 0.0522 - acc: 0.9817 - val_loss: 0.0386 - val_acc: 0.9875
Epoch 1/8
180/180 [==============================] - 192s - loss: 0.0397 - acc: 0.9866 - val_loss: 0.0397 - val_acc: 0.9875
Epoch 2/8
180/180 [==============================] - 190s - loss: 0.0338 - acc: 0.9882 - val_loss: 0.0425 - val_acc: 0.9865
Epoch 3/8
180/180 [==============================] - 190s - loss: 0.0278 - acc: 0.9893 - val_loss: 0.0424 - val_acc: 0.9855
Epoch 4/8
180/180 [==============================] - 190s - loss: 0.0252 - acc: 0.9912 - val_loss: 0.0437 - val_acc: 0.9860
Epoch 5/8
180/180 [==============================] - 190s - loss: 0.0223 - acc: 0.9926 - val_loss: 0.0418 - val_acc: 0.9845
Epoch 6/8
180/180 [==============================] - 189s - loss: 0.0176 - acc: 0.9936 - val_loss: 0.0448 - val_acc: 0.9845
Epoch 7/8
180/180 [==============================] - 190s - loss: 0.0164 - acc: 0.9941 - val_loss: 0.0456 - val_acc: 0.9860
Epoch 8/8
180/180 [==============================] - 190s - loss: 0.0140 - acc: 0.9950 - val_loss: 0.0479 - val_acc: 0.9855
Epoch 1/10
180/180 [==============================] - 190s - loss: 0.0130 - acc: 0.9957 - val_loss: 0.0510 - val_acc: 0.9835
Epoch 2/10
180/180 [==============================] - 190s - loss: 0.0111 - acc: 0.9962 - val_loss: 0.0510 - val_acc: 0.9850
Epoch 3/10
180/180 [==============================] - 190s - loss: 0.0117 - acc: 0.9962 - val_loss: 0.0485 - val_acc: 0.9870
Epoch 4/10
180/180 [==============================] - 190s - loss: 0.0120 - acc: 0.9963 - val_loss: 0.0450 - val_acc: 0.9890
Epoch 5/10
180/180 [==============================] - 190s - loss: 0.0082 - acc: 0.9973 - val_loss: 0.0459 - val_acc: 0.9865
Epoch 6/10
180/180 [==============================] - 190s - loss: 0.0084 - acc: 0.9971 - val_loss: 0.0535 - val_acc: 0.9855
Epoch 7/10
180/180 [==============================] - 190s - loss: 0.0066 - acc: 0.9976 - val_loss: 0.0523 - val_acc: 0.9860
Epoch 8/10
180/180 [==============================] - 190s - loss: 0.0073 - acc: 0.9976 - val_loss: 0.0535 - val_acc: 0.9855
Epoch 9/10
180/180 [==============================] - 190s - loss: 0.0077 - acc: 0.9971 - val_loss: 0.0560 - val_acc: 0.9855
Epoch 10/10
180/180 [==============================] - 190s - loss: 0.0084 - acc: 0.9976 - val_loss: 0.0556 - val_acc: 0.9855
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s - loss: 0.8412 - acc: 0.6823 - val_loss: 2.1991 - val_acc: 0.3060
Epoch 2/12
23000/23000 [==============================] - 1s - loss: 0.6874 - acc: 0.7768 - val_loss: 2.4586 - val_acc: 0.3010
Epoch 3/12
23000/23000 [==============================] - 1s - loss: 0.6574 - acc: 0.7957 - val_loss: 2.4415 - val_acc: 0.2980
Epoch 4/12
23000/23000 [==============================] - 1s - loss: 0.6379 - acc: 0.7957 - val_loss: 2.4440 - val_acc: 0.2935
Epoch 5/12
23000/23000 [==============================] - 1s - loss: 0.6262 - acc: 0.7996 - val_loss: 2.4113 - val_acc: 0.2910
Epoch 6/12
23000/23000 [==============================] - 1s - loss: 0.6145 - acc: 0.8032 - val_loss: 2.3883 - val_acc: 0.2895
Epoch 7/12
23000/23000 [==============================] - 1s - loss: 0.6072 - acc: 0.8072 - val_loss: 2.3196 - val_acc: 0.2895
Epoch 8/12
23000/23000 [==============================] - 1s - loss: 0.6018 - acc: 0.8054 - val_loss: 2.3292 - val_acc: 0.2905
Epoch 9/12
23000/23000 [==============================] - 1s - loss: 0.5941 - acc: 0.8071 - val_loss: 2.2962 - val_acc: 0.2895
Epoch 10/12
23000/23000 [==============================] - 1s - loss: 0.5850 - acc: 0.8074 - val_loss: 2.2776 - val_acc: 0.2890
Epoch 11/12
23000/23000 [==============================] - 1s - loss: 0.5698 - acc: 0.8134 - val_loss: 2.2468 - val_acc: 0.2885
Epoch 12/12
23000/23000 [==============================] - 1s - loss: 0.5631 - acc: 0.8119 - val_loss: 2.2374 - val_acc: 0.2890
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s - loss: 0.5538 - acc: 0.8135 - val_loss: 2.2233 - val_acc: 0.2895
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 9s - loss: 0.0885 - acc: 0.9681 - val_loss: 0.0356 - val_acc: 0.9875
Epoch 2/2
23000/23000 [==============================] - 9s - loss: 0.0411 - acc: 0.9853 - val_loss: 0.0365 - val_acc: 0.9870
Epoch 1/1
180/180 [==============================] - 195s - loss: 0.0515 - acc: 0.9824 - val_loss: 0.0356 - val_acc: 0.9865
Epoch 1/8
180/180 [==============================] - 192s - loss: 0.0361 - acc: 0.9864 - val_loss: 0.0382 - val_acc: 0.9855
Epoch 2/8
180/180 [==============================] - 190s - loss: 0.0331 - acc: 0.9879 - val_loss: 0.0393 - val_acc: 0.9865
Epoch 3/8
180/180 [==============================] - 190s - loss: 0.0288 - acc: 0.9895 - val_loss: 0.0387 - val_acc: 0.9865
Epoch 4/8
180/180 [==============================] - 190s - loss: 0.0266 - acc: 0.9904 - val_loss: 0.0412 - val_acc: 0.9875
Epoch 5/8
180/180 [==============================] - 190s - loss: 0.0198 - acc: 0.9929 - val_loss: 0.0419 - val_acc: 0.9870
Epoch 6/8
180/180 [==============================] - 190s - loss: 0.0166 - acc: 0.9936 - val_loss: 0.0421 - val_acc: 0.9865
Epoch 7/8
180/180 [==============================] - 190s - loss: 0.0139 - acc: 0.9947 - val_loss: 0.0426 - val_acc: 0.9880
Epoch 8/8
180/180 [==============================] - 190s - loss: 0.0125 - acc: 0.9955 - val_loss: 0.0447 - val_acc: 0.9890
Epoch 1/10
180/180 [==============================] - 190s - loss: 0.0147 - acc: 0.9948 - val_loss: 0.0465 - val_acc: 0.9880
Epoch 2/10
180/180 [==============================] - 190s - loss: 0.0120 - acc: 0.9956 - val_loss: 0.0505 - val_acc: 0.9870
Epoch 3/10
180/180 [==============================] - 190s - loss: 0.0103 - acc: 0.9962 - val_loss: 0.0509 - val_acc: 0.9875
Epoch 4/10
180/180 [==============================] - 189s - loss: 0.0106 - acc: 0.9962 - val_loss: 0.0502 - val_acc: 0.9875
Epoch 5/10
180/180 [==============================] - 190s - loss: 0.0079 - acc: 0.9970 - val_loss: 0.0515 - val_acc: 0.9870
Epoch 6/10
180/180 [==============================] - 189s - loss: 0.0073 - acc: 0.9977 - val_loss: 0.0518 - val_acc: 0.9880
Epoch 7/10
180/180 [==============================] - 189s - loss: 0.0070 - acc: 0.9972 - val_loss: 0.0485 - val_acc: 0.9865
Epoch 8/10
180/180 [==============================] - 189s - loss: 0.0065 - acc: 0.9975 - val_loss: 0.0546 - val_acc: 0.9860
Epoch 9/10
180/180 [==============================] - 189s - loss: 0.0062 - acc: 0.9978 - val_loss: 0.0551 - val_acc: 0.9855
Epoch 10/10
180/180 [==============================] - 189s - loss: 0.0067 - acc: 0.9975 - val_loss: 0.0572 - val_acc: 0.9875
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s - loss: 0.8589 - acc: 0.6734 - val_loss: 2.1607 - val_acc: 0.3215
Epoch 2/12
23000/23000 [==============================] - 1s - loss: 0.6750 - acc: 0.7772 - val_loss: 2.4255 - val_acc: 0.3075
Epoch 3/12
23000/23000 [==============================] - 1s - loss: 0.6531 - acc: 0.7947 - val_loss: 2.4741 - val_acc: 0.3050
Epoch 4/12
23000/23000 [==============================] - 1s - loss: 0.6389 - acc: 0.7968 - val_loss: 2.4259 - val_acc: 0.3015
Epoch 5/12
23000/23000 [==============================] - 1s - loss: 0.6368 - acc: 0.7971 - val_loss: 2.4019 - val_acc: 0.3000
Epoch 6/12
23000/23000 [==============================] - 1s - loss: 0.6133 - acc: 0.8034 - val_loss: 2.4132 - val_acc: 0.2975
Epoch 7/12
23000/23000 [==============================] - 1s - loss: 0.6134 - acc: 0.8041 - val_loss: 2.3946 - val_acc: 0.2965
Epoch 8/12
23000/23000 [==============================] - 1s - loss: 0.5964 - acc: 0.8073 - val_loss: 2.3359 - val_acc: 0.2970
Epoch 9/12
23000/23000 [==============================] - 1s - loss: 0.5894 - acc: 0.8072 - val_loss: 2.2916 - val_acc: 0.2965
Epoch 10/12
23000/23000 [==============================] - 1s - loss: 0.5713 - acc: 0.8126 - val_loss: 2.3110 - val_acc: 0.2960
Epoch 11/12
23000/23000 [==============================] - 1s - loss: 0.5836 - acc: 0.8102 - val_loss: 2.2848 - val_acc: 0.2935
Epoch 12/12
23000/23000 [==============================] - 1s - loss: 0.5640 - acc: 0.8156 - val_loss: 2.2374 - val_acc: 0.2940
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s - loss: 0.5658 - acc: 0.8117 - val_loss: 2.2397 - val_acc: 0.2935
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 9s - loss: 0.0854 - acc: 0.9671 - val_loss: 0.0485 - val_acc: 0.9820
Epoch 2/2
23000/23000 [==============================] - 9s - loss: 0.0373 - acc: 0.9875 - val_loss: 0.0438 - val_acc: 0.9845
Epoch 1/1
180/180 [==============================] - 195s - loss: 0.0497 - acc: 0.9823 - val_loss: 0.0421 - val_acc: 0.9855
Epoch 1/8
180/180 [==============================] - 192s - loss: 0.0429 - acc: 0.9853 - val_loss: 0.0445 - val_acc: 0.9870
Epoch 2/8
180/180 [==============================] - 191s - loss: 0.0324 - acc: 0.9883 - val_loss: 0.0470 - val_acc: 0.9855
Epoch 3/8
180/180 [==============================] - 190s - loss: 0.0309 - acc: 0.9896 - val_loss: 0.0489 - val_acc: 0.9845
Epoch 4/8
180/180 [==============================] - 190s - loss: 0.0222 - acc: 0.9925 - val_loss: 0.0469 - val_acc: 0.9855
Epoch 5/8
180/180 [==============================] - 190s - loss: 0.0210 - acc: 0.9929 - val_loss: 0.0482 - val_acc: 0.9850
Epoch 6/8
180/180 [==============================] - 190s - loss: 0.0189 - acc: 0.9932 - val_loss: 0.0478 - val_acc: 0.9850
Epoch 7/8
180/180 [==============================] - 190s - loss: 0.0162 - acc: 0.9941 - val_loss: 0.0537 - val_acc: 0.9850
Epoch 8/8
180/180 [==============================] - 190s - loss: 0.0140 - acc: 0.9952 - val_loss: 0.0532 - val_acc: 0.9855
Epoch 1/10
180/180 [==============================] - 191s - loss: 0.0142 - acc: 0.9954 - val_loss: 0.0530 - val_acc: 0.9870
Epoch 2/10
180/180 [==============================] - 190s - loss: 0.0131 - acc: 0.9957 - val_loss: 0.0544 - val_acc: 0.9865
Epoch 3/10
180/180 [==============================] - 190s - loss: 0.0125 - acc: 0.9956 - val_loss: 0.0573 - val_acc: 0.9870
Epoch 4/10
180/180 [==============================] - 190s - loss: 0.0102 - acc: 0.9962 - val_loss: 0.0582 - val_acc: 0.9855
Epoch 5/10
180/180 [==============================] - 190s - loss: 0.0097 - acc: 0.9967 - val_loss: 0.0603 - val_acc: 0.9870
Epoch 6/10
180/180 [==============================] - 190s - loss: 0.0068 - acc: 0.9975 - val_loss: 0.0587 - val_acc: 0.9860
Epoch 7/10
180/180 [==============================] - 190s - loss: 0.0084 - acc: 0.9968 - val_loss: 0.0574 - val_acc: 0.9865
Epoch 8/10
180/180 [==============================] - 190s - loss: 0.0065 - acc: 0.9978 - val_loss: 0.0590 - val_acc: 0.9865
Epoch 9/10
180/180 [==============================] - 190s - loss: 0.0077 - acc: 0.9973 - val_loss: 0.0582 - val_acc: 0.9870
Epoch 10/10
180/180 [==============================] - 190s - loss: 0.0060 - acc: 0.9977 - val_loss: 0.0574 - val_acc: 0.9865
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s - loss: 0.9131 - acc: 0.6537 - val_loss: 2.0994 - val_acc: 0.3305
Epoch 2/12
23000/23000 [==============================] - 1s - loss: 0.6903 - acc: 0.7715 - val_loss: 2.3648 - val_acc: 0.3140
Epoch 3/12
23000/23000 [==============================] - 1s - loss: 0.6595 - acc: 0.7897 - val_loss: 2.4040 - val_acc: 0.3130
Epoch 4/12
23000/23000 [==============================] - 1s - loss: 0.6486 - acc: 0.7928 - val_loss: 2.4055 - val_acc: 0.3090
Epoch 5/12
23000/23000 [==============================] - 1s - loss: 0.6353 - acc: 0.7966 - val_loss: 2.3692 - val_acc: 0.3075
Epoch 6/12
23000/23000 [==============================] - 1s - loss: 0.6194 - acc: 0.8024 - val_loss: 2.3367 - val_acc: 0.3060
Epoch 7/12
23000/23000 [==============================] - 1s - loss: 0.6058 - acc: 0.8050 - val_loss: 2.3045 - val_acc: 0.3030
Epoch 8/12
23000/23000 [==============================] - 1s - loss: 0.5981 - acc: 0.8070 - val_loss: 2.2835 - val_acc: 0.3000
Epoch 9/12
23000/23000 [==============================] - 1s - loss: 0.5824 - acc: 0.8097 - val_loss: 2.2697 - val_acc: 0.2990
Epoch 10/12
23000/23000 [==============================] - 1s - loss: 0.5752 - acc: 0.8097 - val_loss: 2.2390 - val_acc: 0.2980
Epoch 11/12
23000/23000 [==============================] - 1s - loss: 0.5702 - acc: 0.8128 - val_loss: 2.1972 - val_acc: 0.2995
Epoch 12/12
23000/23000 [==============================] - 1s - loss: 0.5630 - acc: 0.8120 - val_loss: 2.1957 - val_acc: 0.2960
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s - loss: 0.5530 - acc: 0.8130 - val_loss: 2.1798 - val_acc: 0.2960
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 9s - loss: 0.0872 - acc: 0.9678 - val_loss: 0.0453 - val_acc: 0.9835
Epoch 2/2
23000/23000 [==============================] - 9s - loss: 0.0370 - acc: 0.9866 - val_loss: 0.0459 - val_acc: 0.9825
Epoch 1/1
180/180 [==============================] - 194s - loss: 0.0490 - acc: 0.9816 - val_loss: 0.0495 - val_acc: 0.9835
Epoch 1/8
180/180 [==============================] - 193s - loss: 0.0357 - acc: 0.9870 - val_loss: 0.0466 - val_acc: 0.9840
Epoch 2/8
180/180 [==============================] - 191s - loss: 0.0312 - acc: 0.9893 - val_loss: 0.0475 - val_acc: 0.9850
Epoch 3/8
180/180 [==============================] - 190s - loss: 0.0271 - acc: 0.9901 - val_loss: 0.0489 - val_acc: 0.9855
Epoch 4/8
180/180 [==============================] - 190s - loss: 0.0236 - acc: 0.9910 - val_loss: 0.0478 - val_acc: 0.9855
Epoch 5/8
180/180 [==============================] - 191s - loss: 0.0194 - acc: 0.9926 - val_loss: 0.0459 - val_acc: 0.9840
Epoch 6/8
180/180 [==============================] - 190s - loss: 0.0147 - acc: 0.9949 - val_loss: 0.0475 - val_acc: 0.9835
Epoch 7/8
180/180 [==============================] - 190s - loss: 0.0160 - acc: 0.9951 - val_loss: 0.0507 - val_acc: 0.9850
Epoch 8/8
180/180 [==============================] - 190s - loss: 0.0141 - acc: 0.9956 - val_loss: 0.0519 - val_acc: 0.9830
Epoch 1/10
180/180 [==============================] - 191s - loss: 0.0137 - acc: 0.9949 - val_loss: 0.0516 - val_acc: 0.9860
Epoch 2/10
180/180 [==============================] - 191s - loss: 0.0117 - acc: 0.9957 - val_loss: 0.0511 - val_acc: 0.9860
Epoch 3/10
180/180 [==============================] - 191s - loss: 0.0094 - acc: 0.9969 - val_loss: 0.0530 - val_acc: 0.9845
Epoch 4/10
180/180 [==============================] - 191s - loss: 0.0100 - acc: 0.9966 - val_loss: 0.0565 - val_acc: 0.9855
Epoch 5/10
180/180 [==============================] - 191s - loss: 0.0106 - acc: 0.9963 - val_loss: 0.0550 - val_acc: 0.9865
Epoch 6/10
180/180 [==============================] - 191s - loss: 0.0078 - acc: 0.9972 - val_loss: 0.0574 - val_acc: 0.9875
Epoch 7/10
180/180 [==============================] - 190s - loss: 0.0082 - acc: 0.9970 - val_loss: 0.0595 - val_acc: 0.9855
Epoch 8/10
180/180 [==============================] - 191s - loss: 0.0074 - acc: 0.9976 - val_loss: 0.0584 - val_acc: 0.9845
Epoch 9/10
180/180 [==============================] - 191s - loss: 0.0062 - acc: 0.9976 - val_loss: 0.0630 - val_acc: 0.9850
Epoch 10/10
180/180 [==============================] - 191s - loss: 0.0073 - acc: 0.9978 - val_loss: 0.0592 - val_acc: 0.9850

Combine ensemble and test


In [25]:
ens_model = vgg_ft_bn(2)
for layer in ens_model.layers: layer.trainable=True

In [26]:
def get_ens_pred(arr, fname):
    ens_pred = []
    for i in range(5):
        i = str(i)
        ens_model.load_weights('{}{}{}.h5'.format(model_path, fname, i))
        preds = ens_model.predict(arr, batch_size=batch_size)
        ens_pred.append(preds)
    return ens_pred

In [27]:
val_pred2 = get_ens_pred(val, 'aug')

In [28]:
val_avg_preds2 = np.stack(val_pred2).mean(axis=0)

In [29]:
categorical_accuracy(val_labels, val_avg_preds2).eval().mean()


Out[29]:
0.98650002

In [ ]: