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 6021 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=32
# 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
        
    #- added again the compile instruction in order to avoid a Keras 2.1 warning message
    conv_model.compile(optimizer=Adam(1e-5), loss='categorical_crossentropy', 
                       metrics=['accuracy'])
    
    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 37us/step - loss: 0.5620 - acc: 0.7707 - val_loss: 0.1551 - val_acc: 0.9425
Epoch 2/12
23000/23000 [==============================] - 1s 36us/step - loss: 0.2222 - acc: 0.9180 - val_loss: 0.1001 - val_acc: 0.9650
Epoch 3/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1679 - acc: 0.9416 - val_loss: 0.0812 - val_acc: 0.9710
Epoch 4/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1311 - acc: 0.9546 - val_loss: 0.0729 - val_acc: 0.9755
Epoch 5/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1156 - acc: 0.9581 - val_loss: 0.0684 - val_acc: 0.9760
Epoch 6/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.1169 - acc: 0.9606 - val_loss: 0.0653 - val_acc: 0.9790
Epoch 7/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1096 - acc: 0.9644 - val_loss: 0.0635 - val_acc: 0.9805
Epoch 8/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1078 - acc: 0.9643 - val_loss: 0.0616 - val_acc: 0.9820
Epoch 9/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0983 - acc: 0.9670 - val_loss: 0.0603 - val_acc: 0.9835
Epoch 10/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0961 - acc: 0.9687 - val_loss: 0.0598 - val_acc: 0.9825
Epoch 11/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0891 - acc: 0.9696 - val_loss: 0.0589 - val_acc: 0.9825
Epoch 12/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.0909 - acc: 0.9693 - val_loss: 0.0585 - val_acc: 0.9825
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s 41us/step - loss: 0.0836 - acc: 0.9717 - val_loss: 0.0581 - val_acc: 0.9825
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 29s 1ms/step - loss: 0.0973 - acc: 0.9662 - val_loss: 0.0467 - val_acc: 0.9830
Epoch 2/2
23000/23000 [==============================] - 29s 1ms/step - loss: 0.0533 - acc: 0.9827 - val_loss: 0.0502 - val_acc: 0.9850
Epoch 1/1
719/719 [==============================] - 219s 304ms/step - loss: 0.0747 - acc: 0.9768 - val_loss: 0.0526 - val_acc: 0.9845
Epoch 1/8
719/719 [==============================] - 447s 622ms/step - loss: 0.0827 - acc: 0.9730 - val_loss: 0.0760 - val_acc: 0.9790
Epoch 2/8
719/719 [==============================] - 439s 610ms/step - loss: 0.0818 - acc: 0.9741 - val_loss: 0.1589 - val_acc: 0.9585
Epoch 3/8
719/719 [==============================] - 438s 609ms/step - loss: 0.0761 - acc: 0.9747 - val_loss: 0.0759 - val_acc: 0.9815
Epoch 4/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0591 - acc: 0.9798 - val_loss: 0.0604 - val_acc: 0.9845
Epoch 5/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0698 - acc: 0.9773 - val_loss: 0.0640 - val_acc: 0.9825
Epoch 6/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0549 - acc: 0.9819 - val_loss: 0.0560 - val_acc: 0.9840
Epoch 7/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0511 - acc: 0.9838 - val_loss: 0.0592 - val_acc: 0.9860
Epoch 8/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0444 - acc: 0.9846 - val_loss: 0.0441 - val_acc: 0.9885
Epoch 1/10
719/719 [==============================] - 438s 609ms/step - loss: 0.0465 - acc: 0.9848 - val_loss: 0.0703 - val_acc: 0.9785
Epoch 2/10
719/719 [==============================] - 437s 607ms/step - loss: 0.0461 - acc: 0.9839 - val_loss: 0.0414 - val_acc: 0.9895
Epoch 3/10
719/719 [==============================] - 437s 607ms/step - loss: 0.0353 - acc: 0.9873 - val_loss: 0.0609 - val_acc: 0.9825
Epoch 4/10
719/719 [==============================] - 437s 607ms/step - loss: 0.0319 - acc: 0.9888 - val_loss: 0.0482 - val_acc: 0.9895
Epoch 5/10
719/719 [==============================] - 436s 607ms/step - loss: 0.0262 - acc: 0.9914 - val_loss: 0.0526 - val_acc: 0.9890
Epoch 6/10
719/719 [==============================] - 436s 607ms/step - loss: 0.0262 - acc: 0.9917 - val_loss: 0.0630 - val_acc: 0.9850
Epoch 7/10
719/719 [==============================] - 437s 607ms/step - loss: 0.0238 - acc: 0.9916 - val_loss: 0.0619 - val_acc: 0.9845
Epoch 8/10
719/719 [==============================] - 436s 607ms/step - loss: 0.0236 - acc: 0.9914 - val_loss: 0.1653 - val_acc: 0.9605
Epoch 9/10
719/719 [==============================] - 436s 607ms/step - loss: 0.0250 - acc: 0.9923 - val_loss: 0.0419 - val_acc: 0.9875
Epoch 10/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0261 - acc: 0.9909 - val_loss: 0.1071 - val_acc: 0.9735
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.4910 - acc: 0.8033 - val_loss: 0.1437 - val_acc: 0.9515
Epoch 2/12
23000/23000 [==============================] - 1s 43us/step - loss: 0.2157 - acc: 0.9196 - val_loss: 0.0946 - val_acc: 0.9615
Epoch 3/12
23000/23000 [==============================] - 1s 43us/step - loss: 0.1555 - acc: 0.9447 - val_loss: 0.0789 - val_acc: 0.9710
Epoch 4/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1301 - acc: 0.9537 - val_loss: 0.0702 - val_acc: 0.9740
Epoch 5/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.1225 - acc: 0.9587 - val_loss: 0.0663 - val_acc: 0.9765
Epoch 6/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1128 - acc: 0.9617 - val_loss: 0.0627 - val_acc: 0.9775
Epoch 7/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1053 - acc: 0.9628 - val_loss: 0.0609 - val_acc: 0.9785
Epoch 8/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.1033 - acc: 0.9651 - val_loss: 0.0594 - val_acc: 0.9785
Epoch 9/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.0998 - acc: 0.9672 - val_loss: 0.0584 - val_acc: 0.9805
Epoch 10/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.0929 - acc: 0.9687 - val_loss: 0.0573 - val_acc: 0.9810
Epoch 11/12
23000/23000 [==============================] - 1s 44us/step - loss: 0.0938 - acc: 0.9683 - val_loss: 0.0571 - val_acc: 0.9810
Epoch 12/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.0903 - acc: 0.9700 - val_loss: 0.0558 - val_acc: 0.9825
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s 40us/step - loss: 0.0930 - acc: 0.9698 - val_loss: 0.0551 - val_acc: 0.9830
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 28s 1ms/step - loss: 0.1043 - acc: 0.9650 - val_loss: 0.0481 - val_acc: 0.9835
Epoch 2/2
23000/23000 [==============================] - 27s 1ms/step - loss: 0.0433 - acc: 0.9835 - val_loss: 0.0515 - val_acc: 0.9845
Epoch 1/1
719/719 [==============================] - 222s 308ms/step - loss: 0.0694 - acc: 0.9777 - val_loss: 0.0539 - val_acc: 0.9850
Epoch 1/8
719/719 [==============================] - 444s 618ms/step - loss: 0.0957 - acc: 0.9707 - val_loss: 0.0783 - val_acc: 0.9780
Epoch 2/8
719/719 [==============================] - 438s 609ms/step - loss: 0.1420 - acc: 0.9550 - val_loss: 0.0688 - val_acc: 0.9845
Epoch 3/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0918 - acc: 0.9691 - val_loss: 0.0587 - val_acc: 0.9800
Epoch 4/8
719/719 [==============================] - 438s 608ms/step - loss: 0.0886 - acc: 0.9703 - val_loss: 0.0834 - val_acc: 0.9795
Epoch 5/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0841 - acc: 0.9724 - val_loss: 0.0444 - val_acc: 0.9875
Epoch 6/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0669 - acc: 0.9769 - val_loss: 0.0798 - val_acc: 0.9775
Epoch 7/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0636 - acc: 0.9785 - val_loss: 0.0685 - val_acc: 0.9770
Epoch 8/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0508 - acc: 0.9823 - val_loss: 0.0542 - val_acc: 0.9855
Epoch 1/10
719/719 [==============================] - 435s 606ms/step - loss: 0.0414 - acc: 0.9855 - val_loss: 0.0921 - val_acc: 0.9765
Epoch 2/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0523 - acc: 0.9827 - val_loss: 0.0322 - val_acc: 0.9910
Epoch 3/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0459 - acc: 0.9850 - val_loss: 0.0571 - val_acc: 0.9840
Epoch 4/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0355 - acc: 0.9886 - val_loss: 0.0419 - val_acc: 0.9890
Epoch 5/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0342 - acc: 0.9871 - val_loss: 0.0384 - val_acc: 0.9855
Epoch 6/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0374 - acc: 0.9871 - val_loss: 0.0379 - val_acc: 0.9905
Epoch 7/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0284 - acc: 0.9902 - val_loss: 0.0511 - val_acc: 0.9885
Epoch 8/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0234 - acc: 0.9922 - val_loss: 0.0606 - val_acc: 0.9885
Epoch 9/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0253 - acc: 0.9916 - val_loss: 0.0445 - val_acc: 0.9900
Epoch 10/10
719/719 [==============================] - 435s 604ms/step - loss: 0.0277 - acc: 0.9907 - val_loss: 0.0479 - val_acc: 0.9840
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.5379 - acc: 0.7817 - val_loss: 0.1582 - val_acc: 0.9405
Epoch 2/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.2197 - acc: 0.9173 - val_loss: 0.0987 - val_acc: 0.9640
Epoch 3/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.1525 - acc: 0.9437 - val_loss: 0.0799 - val_acc: 0.9685
Epoch 4/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1331 - acc: 0.9527 - val_loss: 0.0705 - val_acc: 0.9715
Epoch 5/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1242 - acc: 0.9570 - val_loss: 0.0646 - val_acc: 0.9760
Epoch 6/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1104 - acc: 0.9618 - val_loss: 0.0611 - val_acc: 0.9780
Epoch 7/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.1056 - acc: 0.9640 - val_loss: 0.0582 - val_acc: 0.9795
Epoch 8/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1000 - acc: 0.9648 - val_loss: 0.0556 - val_acc: 0.9825
Epoch 9/12
23000/23000 [==============================] - 1s 42us/step - loss: 0.1009 - acc: 0.9670 - val_loss: 0.0546 - val_acc: 0.9830
Epoch 10/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.0959 - acc: 0.9671 - val_loss: 0.0538 - val_acc: 0.9835
Epoch 11/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.0865 - acc: 0.9711 - val_loss: 0.0532 - val_acc: 0.9840
Epoch 12/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.0905 - acc: 0.9700 - val_loss: 0.0522 - val_acc: 0.9840
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s 38us/step - loss: 0.0859 - acc: 0.9710 - val_loss: 0.0518 - val_acc: 0.9835
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 27s 1ms/step - loss: 0.0957 - acc: 0.9686 - val_loss: 0.0492 - val_acc: 0.9825
Epoch 2/2
23000/23000 [==============================] - 27s 1ms/step - loss: 0.0478 - acc: 0.9844 - val_loss: 0.0548 - val_acc: 0.9845
Epoch 1/1
719/719 [==============================] - 218s 303ms/step - loss: 0.0648 - acc: 0.9787 - val_loss: 0.0582 - val_acc: 0.9830
Epoch 1/8
719/719 [==============================] - 443s 616ms/step - loss: 0.1029 - acc: 0.9674 - val_loss: 0.0574 - val_acc: 0.9775
Epoch 2/8
719/719 [==============================] - 438s 609ms/step - loss: 0.0873 - acc: 0.9692 - val_loss: 0.0680 - val_acc: 0.9825
Epoch 3/8
719/719 [==============================] - 437s 608ms/step - loss: 0.0670 - acc: 0.9770 - val_loss: 0.0487 - val_acc: 0.9855
Epoch 4/8
719/719 [==============================] - 437s 607ms/step - loss: 0.0571 - acc: 0.9814 - val_loss: 0.0582 - val_acc: 0.9825
Epoch 5/8
719/719 [==============================] - 437s 607ms/step - loss: 0.0471 - acc: 0.9833 - val_loss: 0.0554 - val_acc: 0.9850
Epoch 6/8
719/719 [==============================] - 436s 607ms/step - loss: 0.0527 - acc: 0.9828 - val_loss: 0.0693 - val_acc: 0.9845
Epoch 7/8
719/719 [==============================] - 436s 607ms/step - loss: 0.0407 - acc: 0.9861 - val_loss: 0.0419 - val_acc: 0.9860
Epoch 8/8
719/719 [==============================] - 436s 607ms/step - loss: 0.0414 - acc: 0.9857 - val_loss: 0.0553 - val_acc: 0.9835
Epoch 1/10
719/719 [==============================] - 436s 607ms/step - loss: 0.0511 - acc: 0.9834 - val_loss: 0.0716 - val_acc: 0.9815
Epoch 2/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0516 - acc: 0.9822 - val_loss: 0.0519 - val_acc: 0.9850
Epoch 3/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0416 - acc: 0.9847 - val_loss: 0.0474 - val_acc: 0.9900
Epoch 4/10
719/719 [==============================] - 435s 606ms/step - loss: 0.0367 - acc: 0.9882 - val_loss: 0.0310 - val_acc: 0.9900
Epoch 5/10
719/719 [==============================] - 436s 606ms/step - loss: 0.0283 - acc: 0.9897 - val_loss: 0.0487 - val_acc: 0.9860
Epoch 6/10
719/719 [==============================] - 435s 606ms/step - loss: 0.0335 - acc: 0.9884 - val_loss: 0.0438 - val_acc: 0.9880
Epoch 7/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0295 - acc: 0.9898 - val_loss: 0.0502 - val_acc: 0.9885
Epoch 8/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0199 - acc: 0.9934 - val_loss: 0.0380 - val_acc: 0.9890
Epoch 9/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0184 - acc: 0.9937 - val_loss: 0.0547 - val_acc: 0.9875
Epoch 10/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0255 - acc: 0.9914 - val_loss: 0.0401 - val_acc: 0.9890
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.5010 - acc: 0.7968 - val_loss: 0.1422 - val_acc: 0.9540
Epoch 2/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.2050 - acc: 0.9236 - val_loss: 0.0962 - val_acc: 0.9665
Epoch 3/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.1512 - acc: 0.9463 - val_loss: 0.0820 - val_acc: 0.9705
Epoch 4/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1275 - acc: 0.9544 - val_loss: 0.0750 - val_acc: 0.9755
Epoch 5/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1198 - acc: 0.9587 - val_loss: 0.0704 - val_acc: 0.9765
Epoch 6/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.1066 - acc: 0.9645 - val_loss: 0.0684 - val_acc: 0.9780
Epoch 7/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.1062 - acc: 0.9653 - val_loss: 0.0659 - val_acc: 0.9785
Epoch 8/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.1020 - acc: 0.9661 - val_loss: 0.0653 - val_acc: 0.9780
Epoch 9/12
23000/23000 [==============================] - 1s 38us/step - loss: 0.0967 - acc: 0.9683 - val_loss: 0.0636 - val_acc: 0.9790
Epoch 10/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0982 - acc: 0.9687 - val_loss: 0.0614 - val_acc: 0.9800
Epoch 11/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0914 - acc: 0.9708 - val_loss: 0.0619 - val_acc: 0.9805
Epoch 12/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0883 - acc: 0.9697 - val_loss: 0.0603 - val_acc: 0.9805
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s 40us/step - loss: 0.0871 - acc: 0.9706 - val_loss: 0.0603 - val_acc: 0.9810
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 27s 1ms/step - loss: 0.0972 - acc: 0.9672 - val_loss: 0.0564 - val_acc: 0.9835
Epoch 2/2
23000/23000 [==============================] - 27s 1ms/step - loss: 0.0474 - acc: 0.9843 - val_loss: 0.0568 - val_acc: 0.9875
Epoch 1/1
719/719 [==============================] - 218s 303ms/step - loss: 0.0725 - acc: 0.9776 - val_loss: 0.0574 - val_acc: 0.9845
Epoch 1/8
719/719 [==============================] - 440s 612ms/step - loss: 0.0940 - acc: 0.9701 - val_loss: 0.0648 - val_acc: 0.9805
Epoch 2/8
719/719 [==============================] - 436s 606ms/step - loss: 0.0819 - acc: 0.9732 - val_loss: 0.1396 - val_acc: 0.9620
Epoch 3/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0767 - acc: 0.9753 - val_loss: 0.0548 - val_acc: 0.9850
Epoch 4/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0846 - acc: 0.9723 - val_loss: 0.0770 - val_acc: 0.9780
Epoch 5/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0565 - acc: 0.9814 - val_loss: 0.0420 - val_acc: 0.9865
Epoch 6/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0592 - acc: 0.9806 - val_loss: 0.0697 - val_acc: 0.9805
Epoch 7/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0483 - acc: 0.9826 - val_loss: 0.0572 - val_acc: 0.9880
Epoch 8/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0512 - acc: 0.9830 - val_loss: 0.0559 - val_acc: 0.9850
Epoch 1/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0600 - acc: 0.9803 - val_loss: 0.0424 - val_acc: 0.9860
Epoch 2/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0430 - acc: 0.9850 - val_loss: 0.0560 - val_acc: 0.9835
Epoch 3/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0371 - acc: 0.9877 - val_loss: 0.1074 - val_acc: 0.9730
Epoch 4/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0386 - acc: 0.9875 - val_loss: 0.0336 - val_acc: 0.9890
Epoch 5/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0305 - acc: 0.9899 - val_loss: 0.0491 - val_acc: 0.9900
Epoch 6/10
719/719 [==============================] - 435s 606ms/step - loss: 0.0300 - acc: 0.9902 - val_loss: 0.0457 - val_acc: 0.9900
Epoch 7/10
719/719 [==============================] - 435s 606ms/step - loss: 0.0258 - acc: 0.9912 - val_loss: 0.0468 - val_acc: 0.9890
Epoch 8/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0300 - acc: 0.9900 - val_loss: 0.0486 - val_acc: 0.9890
Epoch 9/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0317 - acc: 0.9895 - val_loss: 0.0428 - val_acc: 0.9895
Epoch 10/10
719/719 [==============================] - 435s 605ms/step - loss: 0.0208 - acc: 0.9927 - val_loss: 0.0363 - val_acc: 0.9910
Train on 23000 samples, validate on 2000 samples
Epoch 1/12
23000/23000 [==============================] - 1s 41us/step - loss: 0.7040 - acc: 0.7185 - val_loss: 0.1841 - val_acc: 0.9380
Epoch 2/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.2329 - acc: 0.9094 - val_loss: 0.1089 - val_acc: 0.9635
Epoch 3/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1614 - acc: 0.9417 - val_loss: 0.0885 - val_acc: 0.9665
Epoch 4/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.1423 - acc: 0.9493 - val_loss: 0.0787 - val_acc: 0.9695
Epoch 5/12
23000/23000 [==============================] - 1s 41us/step - loss: 0.1232 - acc: 0.9581 - val_loss: 0.0736 - val_acc: 0.9735
Epoch 6/12
23000/23000 [==============================] - 1s 40us/step - loss: 0.1115 - acc: 0.9620 - val_loss: 0.0701 - val_acc: 0.9760
Epoch 7/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.1100 - acc: 0.9621 - val_loss: 0.0675 - val_acc: 0.9760
Epoch 8/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0989 - acc: 0.9663 - val_loss: 0.0660 - val_acc: 0.9780
Epoch 9/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0977 - acc: 0.9668 - val_loss: 0.0641 - val_acc: 0.9790
Epoch 10/12
23000/23000 [==============================] - 1s 37us/step - loss: 0.0953 - acc: 0.9689 - val_loss: 0.0628 - val_acc: 0.9795
Epoch 11/12
23000/23000 [==============================] - 1s 39us/step - loss: 0.0924 - acc: 0.9703 - val_loss: 0.0616 - val_acc: 0.9790
Epoch 12/12
23000/23000 [==============================] - 1s 41us/step - loss: 0.0888 - acc: 0.9706 - val_loss: 0.0609 - val_acc: 0.9790
Train on 23000 samples, validate on 2000 samples
Epoch 1/1
23000/23000 [==============================] - 1s 40us/step - loss: 0.0835 - acc: 0.9724 - val_loss: 0.0602 - val_acc: 0.9800
Train on 23000 samples, validate on 2000 samples
Epoch 1/2
23000/23000 [==============================] - 23s 1ms/step - loss: 0.0948 - acc: 0.9691 - val_loss: 0.0541 - val_acc: 0.9815
Epoch 2/2
23000/23000 [==============================] - 23s 1ms/step - loss: 0.0489 - acc: 0.9831 - val_loss: 0.0434 - val_acc: 0.9840
Epoch 1/1
719/719 [==============================] - 216s 301ms/step - loss: 0.0682 - acc: 0.9782 - val_loss: 0.0512 - val_acc: 0.9840
Epoch 1/8
719/719 [==============================] - 440s 611ms/step - loss: 0.1073 - acc: 0.9663 - val_loss: 0.0955 - val_acc: 0.9715
Epoch 2/8
719/719 [==============================] - 435s 605ms/step - loss: 0.0990 - acc: 0.9691 - val_loss: 0.0763 - val_acc: 0.9840
Epoch 3/8
719/719 [==============================] - 434s 603ms/step - loss: 0.0866 - acc: 0.9724 - val_loss: 0.0775 - val_acc: 0.9775
Epoch 4/8
719/719 [==============================] - 434s 604ms/step - loss: 0.0605 - acc: 0.9797 - val_loss: 0.0448 - val_acc: 0.9865
Epoch 5/8
719/719 [==============================] - 434s 603ms/step - loss: 0.0616 - acc: 0.9801 - val_loss: 0.0460 - val_acc: 0.9850
Epoch 6/8
719/719 [==============================] - 434s 603ms/step - loss: 0.0476 - acc: 0.9839 - val_loss: 0.0638 - val_acc: 0.9830
Epoch 7/8
719/719 [==============================] - 434s 603ms/step - loss: 0.0479 - acc: 0.9844 - val_loss: 0.0441 - val_acc: 0.9880
Epoch 8/8
719/719 [==============================] - 434s 603ms/step - loss: 0.0540 - acc: 0.9819 - val_loss: 0.0574 - val_acc: 0.9805
Epoch 1/10
719/719 [==============================] - 433s 603ms/step - loss: 0.0426 - acc: 0.9854 - val_loss: 0.0830 - val_acc: 0.9805
Epoch 2/10
719/719 [==============================] - 433s 602ms/step - loss: 0.0434 - acc: 0.9850 - val_loss: 0.0514 - val_acc: 0.9865
Epoch 3/10
719/719 [==============================] - 433s 602ms/step - loss: 0.0403 - acc: 0.9864 - val_loss: 0.0419 - val_acc: 0.9880
Epoch 4/10
719/719 [==============================] - 433s 602ms/step - loss: 0.0293 - acc: 0.9899 - val_loss: 0.0776 - val_acc: 0.9825
Epoch 5/10
719/719 [==============================] - 431s 599ms/step - loss: 0.0304 - acc: 0.9899 - val_loss: 0.0773 - val_acc: 0.9765
Epoch 6/10
719/719 [==============================] - 430s 598ms/step - loss: 0.0349 - acc: 0.9878 - val_loss: 0.0517 - val_acc: 0.9850
Epoch 7/10
719/719 [==============================] - 430s 598ms/step - loss: 0.0283 - acc: 0.9902 - val_loss: 0.0362 - val_acc: 0.9915
Epoch 8/10
719/719 [==============================] - 431s 599ms/step - loss: 0.0243 - acc: 0.9923 - val_loss: 0.0458 - val_acc: 0.9905
Epoch 9/10
719/719 [==============================] - 432s 601ms/step - loss: 0.0187 - acc: 0.9938 - val_loss: 0.0457 - val_acc: 0.9900
Epoch 10/10
719/719 [==============================] - 433s 602ms/step - loss: 0.0204 - acc: 0.9932 - val_loss: 0.0597 - val_acc: 0.9820

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.98949999

In [ ]: