Files
pipe-segmentation/notebook.ipynb
T
2016-09-30 09:49:04 +08:00

2.3 MiB
Raw Blame History

Intro

This presents a proof of concept for a new application, pipe detection from aerial drone images.

See the readme.md for more.

In [1]:
import os
os.environ['THEANO_FLAGS']='mode=FAST_RUN,device=gpu,floatX=float32'
In [2]:
from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns


import skimage
from skimage import transform, color

from path import Path
import arrow
from tqdm import tqdm
In [3]:
%matplotlib inline
plt.rcParams['figure.figsize']=(10,10)
In [4]:
import keras
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Input, merge, Convolution2D, MaxPooling2D, UpSampling2D
from keras.optimizers import Adam
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras import backend as K
from keras.preprocessing.image import ImageDataGenerator
Using Theano backend.
Using gpu device 0: GeForce GTX 860M (CNMeM is disabled, cuDNN 4007)

Load data

Our source data are split 1:2 for testing and training. These where augumented by:

  • random rotations up to 360 degrees
  • up to 80% horizontal and vertical translations
  • zoom of 80%
  • shear of up to 10 degrees
  • jitter of 1% for each color channel

Then resized to 80x112 for training.

In [5]:
img_rows = 80
img_cols = 112
batch_size=10
seed=1
output_shape=(img_rows,img_cols)
In [6]:
dest_dir = Path('./data/augumented/train')
dest_dir_test = Path('./data/augumented/test')

# make sure image match
images=sorted(dest_dir.glob('image/*.png'))
masks=sorted(dest_dir.glob('mask/*.png'))
assert len(dest_dir.glob('image/*.png'))==len(dest_dir.glob('mask/*.png')), 'should be same number of pngs'
for i,[image,mask] in enumerate(zip(images,masks)):
    assert image.basename()==mask.basename(),'i=%s %s!=%s'%(i,image.basename(),mask.basename())
In [7]:
data_gen_args=dict(
                rotation_range=10.,
                width_shift_range=0.1,
                height_shift_range=0.1,
                shear_range=np.deg2rad(10),
                zoom_range=0.1,
                channel_shift_range=0.01,
                fill_mode='constant',
                horizontal_flip=True,
                vertical_flip=True,
                rescale=1/255.
)

datagen1 = ImageDataGenerator(**data_gen_args)
datagen2 = ImageDataGenerator(**data_gen_args)

image_gen=datagen1.flow_from_directory(dest_dir, 
                                  class_mode=None, 
                                  classes=['image'], 
                                  batch_size=batch_size, 
                                  seed=seed,
                                  target_size=output_shape,
                                 )
mask_gen=datagen2.flow_from_directory(dest_dir, 
                                  class_mode=None, 
                                  classes=['mask'], 
                                  batch_size=batch_size, 
                                  seed=seed,
                                  target_size=output_shape,
                                 )


# join the generators (converting the mask to greyscale)
def dual_gen(image_gen,mask_gen):
    for image,mask in zip(image_gen,mask_gen):
        mask=skimage.color.rgb2grey(np.transpose(mask,(0,2,3,1)))
        yield image,mask

train_gen=dual_gen(image_gen,mask_gen)

X_train, y_train=next(train_gen)
X_train.shape, y_train.shape
Out [7]:
Found 3870 images belonging to 1 classes.
Found 3870 images belonging to 1 classes.
((10, 3, 80, 112), (10, 80, 112))
In [8]:
# test gen
data_gen_args=dict(
                fill_mode='constant',
                rescale=1/255.
)

datagen_test1 = ImageDataGenerator(**data_gen_args)
datagen_test2 = ImageDataGenerator(**data_gen_args)

image_gen_test=datagen_test1.flow_from_directory(dest_dir_test, 
                                  class_mode=None, 
                                  classes=['image'], 
                                  batch_size=batch_size, 
                                  seed=seed,
                                  target_size=output_shape,
                                  shuffle=False
                                 )
mask_gen_test=datagen_test2.flow_from_directory(dest_dir_test, 
                                  class_mode=None, 
                                  classes=['mask'], 
                                  batch_size=batch_size, 
                                  seed=seed,
                                  target_size=output_shape,
                                  shuffle=False
                                 )

# join the generators
def dual_gen(image_gen,mask_gen):
    for image,mask in zip(image_gen,mask_gen):
        mask=skimage.color.rgb2grey(np.transpose(mask,(0,2,3,1)))
        yield image,mask

test_gen=dual_gen(image_gen_test,mask_gen_test)

X_test, y_test=next(test_gen)
X_test.shape, y_test.shape
Out [8]:
Found 503 images belonging to 1 classes.
Found 503 images belonging to 1 classes.
((10, 3, 80, 112), (10, 80, 112))
In [9]:
# train gen, but this time un-augumented so I can directly compare them for overfitting
data_gen_args=dict(
                fill_mode='constant',
                rescale=1/255.
)

datagen_test1b = ImageDataGenerator(**data_gen_args)
datagen_test2b = ImageDataGenerator(**data_gen_args)

image_gen_train2=datagen_test1b.flow_from_directory(dest_dir, 
                                  class_mode=None, 
                                  classes=['image'], 
                                  batch_size=batch_size, 
                                  seed=seed,
                                  target_size=output_shape,
                                  shuffle=False
                                 )
mask_gen_train2=datagen_test2b.flow_from_directory(dest_dir, 
                                  class_mode=None, 
                                  classes=['mask'], 
                                  batch_size=batch_size, 
                                  seed=seed,
                                  target_size=output_shape,
                                  shuffle=False
                                 )

# join the generators
def dual_gen(image_gen,mask_gen):
    for image,mask in zip(image_gen,mask_gen):
        mask=skimage.color.rgb2grey(np.transpose(mask,(0,2,3,1)))
        yield image,mask

train_gen_unaugumented=dual_gen(image_gen_train2,mask_gen_train2)

X_test, y_test=next(train_gen_unaugumented)
X_test.shape, y_test.shape
Out [9]:
Found 3870 images belonging to 1 classes.
Found 3870 images belonging to 1 classes.
((10, 3, 80, 112), (10, 80, 112))

Note: please check the images and mask match!

If they don't you probobly have the wrong version of keras. Use: pip install https://github.com/wassname/keras/archive/patch-1.zip

In [10]:
# View some of the data
seed=1
n=5
rows=n
cols=4

pltnb=0
plt.figure(figsize=(15,rows*2))
for i in range(n):
    X_train, y_train=next(train_gen)
    for b in range(2):
        # create a grid of 3x2
        pltnb+=1
        plt.subplot(rows,cols,pltnb)
        plt.title('i=%s batchn=%s datagen1'%(i,b))
        plt.imshow(np.transpose(X_train[b],(1,2,0)))
        plt.colorbar()
        plt.axis('off')


        pltnb+=1
        plt.subplot(rows,cols,pltnb)
        
        plt.title('i=%s batchn=%s gen2'%(i,b))
        plt.imshow(y_train[b], cmap=plt.get_cmap('gray'))
        plt.colorbar()
        plt.axis('off')
plt.tight_layout()
plt.show()
In [203]:
# show data dist
plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
sns.distplot(X_train.flatten())
plt.title('X')

plt.subplot(1,2,2)
sns.distplot(y_train.flatten())
plt.title('y')
Out [203]:
<matplotlib.text.Text at 0x7fb864bca0f0>

Metrics

We use the SørensenDice coefficient after transforming it to [0-1] and smoothing it to a ~L1 (linear) loss.

L = 1-\frac{ 2 \sum_i|A_i B_i|+ \delta}{\sum_i A_i^2 + B_i^2 + \delta}
In [11]:
# define custom loss and metric functions 

from keras import backend as K
smooth = 1

def dice_coef(y_true, y_pred, smooth=1):
    """
    Dice =  2*sum(|A*B|)/(sum(A^2)+sum(B^2))
    ref: https://arxiv.org/pdf/1606.04797v1.pdf
    """
    intersection = K.sum(K.abs(y_true * y_pred), axis=-1)
    return (2. * intersection + smooth) / (K.sum(K.square(y_true),-1) + K.sum(K.square(y_pred),-1) + smooth)

# I think the missing one was a mistake, because it made loss(y_true,y_true)=-1
def dice_coef_loss(y_true, y_pred):
    return 1-dice_coef(y_true, y_pred)

Model

model_diagram The model architecture. Each box is a inception module or convolution with the number of feature layers denotes in brackets. The output size is denoted below the box and the arrows denote differen't operation.

inception_module The inception module used in this paper, as originally proposed in 1 .


  1. https://arxiv.org/pdf/1512.00567v3.pdf "Rethinking the Inception Architecture for Computer Vision" ↩︎

In [12]:
import sys
from keras.models import Model
from keras.layers import Input, merge, Convolution2D, MaxPooling2D, UpSampling2D, Dense
from keras.layers import BatchNormalization, Dropout, Flatten, Lambda, Reshape
from keras.layers.advanced_activations import ELU, LeakyReLU
from keras import backend as K


def unet_inception_model(optimiser, img_cols=512, img_rows=512, activation='relu', dropout=0.5, init='he_normal', splitted=True):
    actv = activation == 'relu' and (lambda: LeakyReLU(0.1)) or activation == 'elu' and (lambda: ELU(1.0)) or None
        
    def inception_block(inputs, depth, batch_mode=0, splitted=False):
        """Inception block  v1 with asymetric convolutions"""
        assert depth % 16 == 0
        
        c1_1 = Convolution2D(int(depth/4), 1, 1, init=init, border_mode='same')(inputs)

        c2_1 = Convolution2D(int(depth/8*3), 1, 1, init=init, border_mode='same')(inputs)
        c2_1 = actv()(c2_1)
        if splitted:
            c2_2 = Convolution2D(int(depth/2), 1, 3, init=init, border_mode='same')(c2_1)
            c2_2 = BatchNormalization(mode=batch_mode, axis=1)(c2_2)
            c2_2 = actv()(c2_2)
            c2_3 = Convolution2D(int(depth/2), 3, 1, init=init, border_mode='same')(c2_2)
        else:
            c2_3 = Convolution2D(int(depth/2), 3, 3, init=init, border_mode='same')(c2_1)

        c3_1 = Convolution2D(int(depth/16), 1, 1, init=init, border_mode='same')(inputs)
        c3_1 = actv()(c3_1)
        if splitted:
            c3_2 = Convolution2D(int(depth/8), 1, 5, init=init, border_mode='same')(c3_1)
            c3_2 = BatchNormalization(mode=batch_mode, axis=1)(c3_2)
            c3_2 = actv()(c3_2)
            c3_3 = Convolution2D(int(depth/8), 5, 1, init=init, border_mode='same')(c3_2)
        else:
            c3_3 = Convolution2D(int(depth/8), 5, 5, init=init, border_mode='same')(c3_1)

        p4_1 = MaxPooling2D(pool_size=(3,3), strides=(1,1), border_mode='same')(inputs)
        c4_2 = Convolution2D(int(depth/8), 1, 1, init=init, border_mode='same')(p4_1)

        res = merge([c1_1, c2_3, c3_3, c4_2], mode='concat', concat_axis=1)
        res = BatchNormalization(mode=batch_mode, axis=1)(res)
        res = actv()(res)
        return res


    def residual_skip(inputs, num, depth, scale=0.1):
        """
        A skip connection with a branch to a residual block

               / 1x1conv \
        input ---------- - output
        """
        residual = Convolution2D(depth, num, num, border_mode='same')(inputs)
        residual = BatchNormalization(mode=2, axis=1)(residual)
        residual = Lambda(lambda x: x*scale)(residual)
        res = merge([inputs, residual], mode="sum")
        return actv()(res)


    def reduction_block(nb_filter, nb_row, nb_col, border_mode='same', subsample=(1, 1)):
        """Downsampling using a strided convolution followed by batchnorm and activation"""
        def f(_input):
            conv = Convolution2D(nb_filter=nb_filter, nb_row=nb_row, nb_col=nb_col, subsample=subsample,
                                  border_mode=border_mode)(_input)
            norm = BatchNormalization(mode=2, axis=1)(conv)
            return actv()(norm)

        return f

    def get_unet_inception_2head(optimizer):

        inputs = Input((3, img_rows, img_cols), name='main_input')
        conv1 = inception_block(inputs, 32, batch_mode=2, splitted=splitted)

        pool1 = reduction_block(32, 3, 3, border_mode='same', subsample=(2,2))(conv1)
        pool1 = Dropout(dropout)(pool1)

        conv2 = inception_block(pool1, 64, batch_mode=2, splitted=splitted)
        pool2 = reduction_block(64, 3, 3, border_mode='same', subsample=(2,2))(conv2)
        pool2 = Dropout(dropout)(pool2)

        conv3 = inception_block(pool2, 128, batch_mode=2, splitted=splitted)
        pool3 = reduction_block(128, 3, 3, border_mode='same', subsample=(2,2))(conv3)
        pool3 = Dropout(dropout)(pool3)

        conv4 = inception_block(pool3, 256, batch_mode=2, splitted=splitted)
        pool4 = reduction_block(256, 3, 3, border_mode='same', subsample=(2,2))(conv4)
        pool4 = Dropout(dropout)(pool4)

        conv5 = inception_block(pool4, 512, batch_mode=2, splitted=splitted)
        conv5 = Dropout(dropout)(conv5)

        after_conv4 = residual_skip(conv4, 1, 256)
        up6 = merge([UpSampling2D(size=(2, 2))(conv5), after_conv4], mode='concat', concat_axis=1)
        conv6 = inception_block(up6, 256, batch_mode=2, splitted=splitted)
        conv6 = Dropout(dropout)(conv6)

        after_conv3 = residual_skip(conv3, 1, 128)
        up7 = merge([UpSampling2D(size=(2, 2))(conv6), after_conv3], mode='concat', concat_axis=1)
        conv7 = inception_block(up7, 128, batch_mode=2, splitted=splitted)
        conv7 = Dropout(dropout)(conv7)

        after_conv2 = residual_skip(conv2, 1, 64)
        up8 = merge([UpSampling2D(size=(2, 2))(conv7), after_conv2], mode='concat', concat_axis=1)
        conv8 = inception_block(up8, 64, batch_mode=2, splitted=splitted)
        conv8 = Dropout(dropout)(conv8)

        after_conv1 = residual_skip(conv1, 1, 32)
        up9 = merge([UpSampling2D(size=(2, 2))(conv8), after_conv1], mode='concat', concat_axis=1)
        conv9 = inception_block(up9, 32, batch_mode=2, splitted=splitted)
        conv9 = Dropout(dropout)(conv9)

        conv10 = Convolution2D(1, 1, 1, init=init, activation='hard_sigmoid')(conv9)
        reshp = Reshape((img_rows,img_cols), name='main_output')(conv10)

        model = Model(input=inputs, output=reshp)
        model.compile(optimizer=optimizer,
                      loss=[dice_coef_loss],
                      metrics=['accuracy']
                     )

        return model

    return get_unet_inception_2head(optimiser)

Train

Training

In [13]:
model_name='unet_inception_inv2'
optimizer = keras.optimizers.Nadam(lr=2e-4)
model = unet_inception_model(optimizer,img_cols,img_rows,dropout=0.5)
model_checkpoint = ModelCheckpoint('models/%s_weights.hdf5'%model_name, monitor='val_acc', save_best_only=True, save_weights_only=True)
early_stopping = keras.callbacks.EarlyStopping(patience=2, monitor='val_acc')
In [14]:
model.summary()
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
main_input (InputLayer)          (None, 3, 80, 112)    0                                            
____________________________________________________________________________________________________
convolution2d_2 (Convolution2D)  (None, 12, 80, 112)   48          main_input[0][0]                 
____________________________________________________________________________________________________
convolution2d_5 (Convolution2D)  (None, 2, 80, 112)    8           main_input[0][0]                 
____________________________________________________________________________________________________
leakyrelu_1 (LeakyReLU)          (None, 12, 80, 112)   0           convolution2d_2[0][0]            
____________________________________________________________________________________________________
leakyrelu_3 (LeakyReLU)          (None, 2, 80, 112)    0           convolution2d_5[0][0]            
____________________________________________________________________________________________________
convolution2d_3 (Convolution2D)  (None, 16, 80, 112)   592         leakyrelu_1[0][0]                
____________________________________________________________________________________________________
convolution2d_6 (Convolution2D)  (None, 4, 80, 112)    44          leakyrelu_3[0][0]                
____________________________________________________________________________________________________
batchnormalization_1 (BatchNormal(None, 16, 80, 112)   32          convolution2d_3[0][0]            
____________________________________________________________________________________________________
batchnormalization_2 (BatchNormal(None, 4, 80, 112)    8           convolution2d_6[0][0]            
____________________________________________________________________________________________________
leakyrelu_2 (LeakyReLU)          (None, 16, 80, 112)   0           batchnormalization_1[0][0]       
____________________________________________________________________________________________________
leakyrelu_4 (LeakyReLU)          (None, 4, 80, 112)    0           batchnormalization_2[0][0]       
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 3, 80, 112)    0           main_input[0][0]                 
____________________________________________________________________________________________________
convolution2d_1 (Convolution2D)  (None, 8, 80, 112)    32          main_input[0][0]                 
____________________________________________________________________________________________________
convolution2d_4 (Convolution2D)  (None, 16, 80, 112)   784         leakyrelu_2[0][0]                
____________________________________________________________________________________________________
convolution2d_7 (Convolution2D)  (None, 4, 80, 112)    84          leakyrelu_4[0][0]                
____________________________________________________________________________________________________
convolution2d_8 (Convolution2D)  (None, 4, 80, 112)    16          maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
merge_1 (Merge)                  (None, 32, 80, 112)   0           convolution2d_1[0][0]            
                                                                   convolution2d_4[0][0]            
                                                                   convolution2d_7[0][0]            
                                                                   convolution2d_8[0][0]            
____________________________________________________________________________________________________
batchnormalization_3 (BatchNormal(None, 32, 80, 112)   64          merge_1[0][0]                    
____________________________________________________________________________________________________
leakyrelu_5 (LeakyReLU)          (None, 32, 80, 112)   0           batchnormalization_3[0][0]       
____________________________________________________________________________________________________
convolution2d_9 (Convolution2D)  (None, 32, 40, 56)    9248        leakyrelu_5[0][0]                
____________________________________________________________________________________________________
batchnormalization_4 (BatchNormal(None, 32, 40, 56)    64          convolution2d_9[0][0]            
____________________________________________________________________________________________________
leakyrelu_6 (LeakyReLU)          (None, 32, 40, 56)    0           batchnormalization_4[0][0]       
____________________________________________________________________________________________________
dropout_1 (Dropout)              (None, 32, 40, 56)    0           leakyrelu_6[0][0]                
____________________________________________________________________________________________________
convolution2d_11 (Convolution2D) (None, 24, 40, 56)    792         dropout_1[0][0]                  
____________________________________________________________________________________________________
convolution2d_14 (Convolution2D) (None, 4, 40, 56)     132         dropout_1[0][0]                  
____________________________________________________________________________________________________
leakyrelu_7 (LeakyReLU)          (None, 24, 40, 56)    0           convolution2d_11[0][0]           
____________________________________________________________________________________________________
leakyrelu_9 (LeakyReLU)          (None, 4, 40, 56)     0           convolution2d_14[0][0]           
____________________________________________________________________________________________________
convolution2d_12 (Convolution2D) (None, 32, 40, 56)    2336        leakyrelu_7[0][0]                
____________________________________________________________________________________________________
convolution2d_15 (Convolution2D) (None, 8, 40, 56)     168         leakyrelu_9[0][0]                
____________________________________________________________________________________________________
batchnormalization_5 (BatchNormal(None, 32, 40, 56)    64          convolution2d_12[0][0]           
____________________________________________________________________________________________________
batchnormalization_6 (BatchNormal(None, 8, 40, 56)     16          convolution2d_15[0][0]           
____________________________________________________________________________________________________
leakyrelu_8 (LeakyReLU)          (None, 32, 40, 56)    0           batchnormalization_5[0][0]       
____________________________________________________________________________________________________
leakyrelu_10 (LeakyReLU)         (None, 8, 40, 56)     0           batchnormalization_6[0][0]       
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 32, 40, 56)    0           dropout_1[0][0]                  
____________________________________________________________________________________________________
convolution2d_10 (Convolution2D) (None, 16, 40, 56)    528         dropout_1[0][0]                  
____________________________________________________________________________________________________
convolution2d_13 (Convolution2D) (None, 32, 40, 56)    3104        leakyrelu_8[0][0]                
____________________________________________________________________________________________________
convolution2d_16 (Convolution2D) (None, 8, 40, 56)     328         leakyrelu_10[0][0]               
____________________________________________________________________________________________________
convolution2d_17 (Convolution2D) (None, 8, 40, 56)     264         maxpooling2d_2[0][0]             
____________________________________________________________________________________________________
merge_2 (Merge)                  (None, 64, 40, 56)    0           convolution2d_10[0][0]           
                                                                   convolution2d_13[0][0]           
                                                                   convolution2d_16[0][0]           
                                                                   convolution2d_17[0][0]           
____________________________________________________________________________________________________
batchnormalization_7 (BatchNormal(None, 64, 40, 56)    128         merge_2[0][0]                    
____________________________________________________________________________________________________
leakyrelu_11 (LeakyReLU)         (None, 64, 40, 56)    0           batchnormalization_7[0][0]       
____________________________________________________________________________________________________
convolution2d_18 (Convolution2D) (None, 64, 20, 28)    36928       leakyrelu_11[0][0]               
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, 64, 20, 28)    128         convolution2d_18[0][0]           
____________________________________________________________________________________________________
leakyrelu_12 (LeakyReLU)         (None, 64, 20, 28)    0           batchnormalization_8[0][0]       
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 64, 20, 28)    0           leakyrelu_12[0][0]               
____________________________________________________________________________________________________
convolution2d_20 (Convolution2D) (None, 48, 20, 28)    3120        dropout_2[0][0]                  
____________________________________________________________________________________________________
convolution2d_23 (Convolution2D) (None, 8, 20, 28)     520         dropout_2[0][0]                  
____________________________________________________________________________________________________
leakyrelu_13 (LeakyReLU)         (None, 48, 20, 28)    0           convolution2d_20[0][0]           
____________________________________________________________________________________________________
leakyrelu_15 (LeakyReLU)         (None, 8, 20, 28)     0           convolution2d_23[0][0]           
____________________________________________________________________________________________________
convolution2d_21 (Convolution2D) (None, 64, 20, 28)    9280        leakyrelu_13[0][0]               
____________________________________________________________________________________________________
convolution2d_24 (Convolution2D) (None, 16, 20, 28)    656         leakyrelu_15[0][0]               
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64, 20, 28)    128         convolution2d_21[0][0]           
____________________________________________________________________________________________________
batchnormalization_10 (BatchNorma(None, 16, 20, 28)    32          convolution2d_24[0][0]           
____________________________________________________________________________________________________
leakyrelu_14 (LeakyReLU)         (None, 64, 20, 28)    0           batchnormalization_9[0][0]       
____________________________________________________________________________________________________
leakyrelu_16 (LeakyReLU)         (None, 16, 20, 28)    0           batchnormalization_10[0][0]      
____________________________________________________________________________________________________
maxpooling2d_3 (MaxPooling2D)    (None, 64, 20, 28)    0           dropout_2[0][0]                  
____________________________________________________________________________________________________
convolution2d_19 (Convolution2D) (None, 32, 20, 28)    2080        dropout_2[0][0]                  
____________________________________________________________________________________________________
convolution2d_22 (Convolution2D) (None, 64, 20, 28)    12352       leakyrelu_14[0][0]               
____________________________________________________________________________________________________
convolution2d_25 (Convolution2D) (None, 16, 20, 28)    1296        leakyrelu_16[0][0]               
____________________________________________________________________________________________________
convolution2d_26 (Convolution2D) (None, 16, 20, 28)    1040        maxpooling2d_3[0][0]             
____________________________________________________________________________________________________
merge_3 (Merge)                  (None, 128, 20, 28)   0           convolution2d_19[0][0]           
                                                                   convolution2d_22[0][0]           
                                                                   convolution2d_25[0][0]           
                                                                   convolution2d_26[0][0]           
____________________________________________________________________________________________________
batchnormalization_11 (BatchNorma(None, 128, 20, 28)   256         merge_3[0][0]                    
____________________________________________________________________________________________________
leakyrelu_17 (LeakyReLU)         (None, 128, 20, 28)   0           batchnormalization_11[0][0]      
____________________________________________________________________________________________________
convolution2d_27 (Convolution2D) (None, 128, 10, 14)   147584      leakyrelu_17[0][0]               
____________________________________________________________________________________________________
batchnormalization_12 (BatchNorma(None, 128, 10, 14)   256         convolution2d_27[0][0]           
____________________________________________________________________________________________________
leakyrelu_18 (LeakyReLU)         (None, 128, 10, 14)   0           batchnormalization_12[0][0]      
____________________________________________________________________________________________________
dropout_3 (Dropout)              (None, 128, 10, 14)   0           leakyrelu_18[0][0]               
____________________________________________________________________________________________________
convolution2d_29 (Convolution2D) (None, 96, 10, 14)    12384       dropout_3[0][0]                  
____________________________________________________________________________________________________
convolution2d_32 (Convolution2D) (None, 16, 10, 14)    2064        dropout_3[0][0]                  
____________________________________________________________________________________________________
leakyrelu_19 (LeakyReLU)         (None, 96, 10, 14)    0           convolution2d_29[0][0]           
____________________________________________________________________________________________________
leakyrelu_21 (LeakyReLU)         (None, 16, 10, 14)    0           convolution2d_32[0][0]           
____________________________________________________________________________________________________
convolution2d_30 (Convolution2D) (None, 128, 10, 14)   36992       leakyrelu_19[0][0]               
____________________________________________________________________________________________________
convolution2d_33 (Convolution2D) (None, 32, 10, 14)    2592        leakyrelu_21[0][0]               
____________________________________________________________________________________________________
batchnormalization_13 (BatchNorma(None, 128, 10, 14)   256         convolution2d_30[0][0]           
____________________________________________________________________________________________________
batchnormalization_14 (BatchNorma(None, 32, 10, 14)    64          convolution2d_33[0][0]           
____________________________________________________________________________________________________
leakyrelu_20 (LeakyReLU)         (None, 128, 10, 14)   0           batchnormalization_13[0][0]      
____________________________________________________________________________________________________
leakyrelu_22 (LeakyReLU)         (None, 32, 10, 14)    0           batchnormalization_14[0][0]      
____________________________________________________________________________________________________
maxpooling2d_4 (MaxPooling2D)    (None, 128, 10, 14)   0           dropout_3[0][0]                  
____________________________________________________________________________________________________
convolution2d_28 (Convolution2D) (None, 64, 10, 14)    8256        dropout_3[0][0]                  
____________________________________________________________________________________________________
convolution2d_31 (Convolution2D) (None, 128, 10, 14)   49280       leakyrelu_20[0][0]               
____________________________________________________________________________________________________
convolution2d_34 (Convolution2D) (None, 32, 10, 14)    5152        leakyrelu_22[0][0]               
____________________________________________________________________________________________________
convolution2d_35 (Convolution2D) (None, 32, 10, 14)    4128        maxpooling2d_4[0][0]             
____________________________________________________________________________________________________
merge_4 (Merge)                  (None, 256, 10, 14)   0           convolution2d_28[0][0]           
                                                                   convolution2d_31[0][0]           
                                                                   convolution2d_34[0][0]           
                                                                   convolution2d_35[0][0]           
____________________________________________________________________________________________________
batchnormalization_15 (BatchNorma(None, 256, 10, 14)   512         merge_4[0][0]                    
____________________________________________________________________________________________________
leakyrelu_23 (LeakyReLU)         (None, 256, 10, 14)   0           batchnormalization_15[0][0]      
____________________________________________________________________________________________________
convolution2d_36 (Convolution2D) (None, 256, 5, 7)     590080      leakyrelu_23[0][0]               
____________________________________________________________________________________________________
batchnormalization_16 (BatchNorma(None, 256, 5, 7)     512         convolution2d_36[0][0]           
____________________________________________________________________________________________________
leakyrelu_24 (LeakyReLU)         (None, 256, 5, 7)     0           batchnormalization_16[0][0]      
____________________________________________________________________________________________________
dropout_4 (Dropout)              (None, 256, 5, 7)     0           leakyrelu_24[0][0]               
____________________________________________________________________________________________________
convolution2d_38 (Convolution2D) (None, 192, 5, 7)     49344       dropout_4[0][0]                  
____________________________________________________________________________________________________
convolution2d_41 (Convolution2D) (None, 32, 5, 7)      8224        dropout_4[0][0]                  
____________________________________________________________________________________________________
leakyrelu_25 (LeakyReLU)         (None, 192, 5, 7)     0           convolution2d_38[0][0]           
____________________________________________________________________________________________________
leakyrelu_27 (LeakyReLU)         (None, 32, 5, 7)      0           convolution2d_41[0][0]           
____________________________________________________________________________________________________
convolution2d_39 (Convolution2D) (None, 256, 5, 7)     147712      leakyrelu_25[0][0]               
____________________________________________________________________________________________________
convolution2d_42 (Convolution2D) (None, 64, 5, 7)      10304       leakyrelu_27[0][0]               
____________________________________________________________________________________________________
batchnormalization_17 (BatchNorma(None, 256, 5, 7)     512         convolution2d_39[0][0]           
____________________________________________________________________________________________________
batchnormalization_18 (BatchNorma(None, 64, 5, 7)      128         convolution2d_42[0][0]           
____________________________________________________________________________________________________
leakyrelu_26 (LeakyReLU)         (None, 256, 5, 7)     0           batchnormalization_17[0][0]      
____________________________________________________________________________________________________
leakyrelu_28 (LeakyReLU)         (None, 64, 5, 7)      0           batchnormalization_18[0][0]      
____________________________________________________________________________________________________
maxpooling2d_5 (MaxPooling2D)    (None, 256, 5, 7)     0           dropout_4[0][0]                  
____________________________________________________________________________________________________
convolution2d_37 (Convolution2D) (None, 128, 5, 7)     32896       dropout_4[0][0]                  
____________________________________________________________________________________________________
convolution2d_40 (Convolution2D) (None, 256, 5, 7)     196864      leakyrelu_26[0][0]               
____________________________________________________________________________________________________
convolution2d_43 (Convolution2D) (None, 64, 5, 7)      20544       leakyrelu_28[0][0]               
____________________________________________________________________________________________________
convolution2d_44 (Convolution2D) (None, 64, 5, 7)      16448       maxpooling2d_5[0][0]             
____________________________________________________________________________________________________
merge_5 (Merge)                  (None, 512, 5, 7)     0           convolution2d_37[0][0]           
                                                                   convolution2d_40[0][0]           
                                                                   convolution2d_43[0][0]           
                                                                   convolution2d_44[0][0]           
____________________________________________________________________________________________________
convolution2d_45 (Convolution2D) (None, 256, 10, 14)   65792       leakyrelu_23[0][0]               
____________________________________________________________________________________________________
batchnormalization_19 (BatchNorma(None, 512, 5, 7)     1024        merge_5[0][0]                    
____________________________________________________________________________________________________
batchnormalization_20 (BatchNorma(None, 256, 10, 14)   512         convolution2d_45[0][0]           
____________________________________________________________________________________________________
leakyrelu_29 (LeakyReLU)         (None, 512, 5, 7)     0           batchnormalization_19[0][0]      
____________________________________________________________________________________________________
lambda_1 (Lambda)                (None, 256, 10, 14)   0           batchnormalization_20[0][0]      
____________________________________________________________________________________________________
dropout_5 (Dropout)              (None, 512, 5, 7)     0           leakyrelu_29[0][0]               
____________________________________________________________________________________________________
merge_6 (Merge)                  (None, 256, 10, 14)   0           leakyrelu_23[0][0]               
                                                                   lambda_1[0][0]                   
____________________________________________________________________________________________________
upsampling2d_1 (UpSampling2D)    (None, 512, 10, 14)   0           dropout_5[0][0]                  
____________________________________________________________________________________________________
leakyrelu_30 (LeakyReLU)         (None, 256, 10, 14)   0           merge_6[0][0]                    
____________________________________________________________________________________________________
merge_7 (Merge)                  (None, 768, 10, 14)   0           upsampling2d_1[0][0]             
                                                                   leakyrelu_30[0][0]               
____________________________________________________________________________________________________
convolution2d_47 (Convolution2D) (None, 96, 10, 14)    73824       merge_7[0][0]                    
____________________________________________________________________________________________________
convolution2d_50 (Convolution2D) (None, 16, 10, 14)    12304       merge_7[0][0]                    
____________________________________________________________________________________________________
leakyrelu_31 (LeakyReLU)         (None, 96, 10, 14)    0           convolution2d_47[0][0]           
____________________________________________________________________________________________________
leakyrelu_33 (LeakyReLU)         (None, 16, 10, 14)    0           convolution2d_50[0][0]           
____________________________________________________________________________________________________
convolution2d_48 (Convolution2D) (None, 128, 10, 14)   36992       leakyrelu_31[0][0]               
____________________________________________________________________________________________________
convolution2d_51 (Convolution2D) (None, 32, 10, 14)    2592        leakyrelu_33[0][0]               
____________________________________________________________________________________________________
batchnormalization_21 (BatchNorma(None, 128, 10, 14)   256         convolution2d_48[0][0]           
____________________________________________________________________________________________________
batchnormalization_22 (BatchNorma(None, 32, 10, 14)    64          convolution2d_51[0][0]           
____________________________________________________________________________________________________
leakyrelu_32 (LeakyReLU)         (None, 128, 10, 14)   0           batchnormalization_21[0][0]      
____________________________________________________________________________________________________
leakyrelu_34 (LeakyReLU)         (None, 32, 10, 14)    0           batchnormalization_22[0][0]      
____________________________________________________________________________________________________
maxpooling2d_6 (MaxPooling2D)    (None, 768, 10, 14)   0           merge_7[0][0]                    
____________________________________________________________________________________________________
convolution2d_46 (Convolution2D) (None, 64, 10, 14)    49216       merge_7[0][0]                    
____________________________________________________________________________________________________
convolution2d_49 (Convolution2D) (None, 128, 10, 14)   49280       leakyrelu_32[0][0]               
____________________________________________________________________________________________________
convolution2d_52 (Convolution2D) (None, 32, 10, 14)    5152        leakyrelu_34[0][0]               
____________________________________________________________________________________________________
convolution2d_53 (Convolution2D) (None, 32, 10, 14)    24608       maxpooling2d_6[0][0]             
____________________________________________________________________________________________________
merge_8 (Merge)                  (None, 256, 10, 14)   0           convolution2d_46[0][0]           
                                                                   convolution2d_49[0][0]           
                                                                   convolution2d_52[0][0]           
                                                                   convolution2d_53[0][0]           
____________________________________________________________________________________________________
convolution2d_54 (Convolution2D) (None, 128, 20, 28)   16512       leakyrelu_17[0][0]               
____________________________________________________________________________________________________
batchnormalization_23 (BatchNorma(None, 256, 10, 14)   512         merge_8[0][0]                    
____________________________________________________________________________________________________
batchnormalization_24 (BatchNorma(None, 128, 20, 28)   256         convolution2d_54[0][0]           
____________________________________________________________________________________________________
leakyrelu_35 (LeakyReLU)         (None, 256, 10, 14)   0           batchnormalization_23[0][0]      
____________________________________________________________________________________________________
lambda_2 (Lambda)                (None, 128, 20, 28)   0           batchnormalization_24[0][0]      
____________________________________________________________________________________________________
dropout_6 (Dropout)              (None, 256, 10, 14)   0           leakyrelu_35[0][0]               
____________________________________________________________________________________________________
merge_9 (Merge)                  (None, 128, 20, 28)   0           leakyrelu_17[0][0]               
                                                                   lambda_2[0][0]                   
____________________________________________________________________________________________________
upsampling2d_2 (UpSampling2D)    (None, 256, 20, 28)   0           dropout_6[0][0]                  
____________________________________________________________________________________________________
leakyrelu_36 (LeakyReLU)         (None, 128, 20, 28)   0           merge_9[0][0]                    
____________________________________________________________________________________________________
merge_10 (Merge)                 (None, 384, 20, 28)   0           upsampling2d_2[0][0]             
                                                                   leakyrelu_36[0][0]               
____________________________________________________________________________________________________
convolution2d_56 (Convolution2D) (None, 48, 20, 28)    18480       merge_10[0][0]                   
____________________________________________________________________________________________________
convolution2d_59 (Convolution2D) (None, 8, 20, 28)     3080        merge_10[0][0]                   
____________________________________________________________________________________________________
leakyrelu_37 (LeakyReLU)         (None, 48, 20, 28)    0           convolution2d_56[0][0]           
____________________________________________________________________________________________________
leakyrelu_39 (LeakyReLU)         (None, 8, 20, 28)     0           convolution2d_59[0][0]           
____________________________________________________________________________________________________
convolution2d_57 (Convolution2D) (None, 64, 20, 28)    9280        leakyrelu_37[0][0]               
____________________________________________________________________________________________________
convolution2d_60 (Convolution2D) (None, 16, 20, 28)    656         leakyrelu_39[0][0]               
____________________________________________________________________________________________________
batchnormalization_25 (BatchNorma(None, 64, 20, 28)    128         convolution2d_57[0][0]           
____________________________________________________________________________________________________
batchnormalization_26 (BatchNorma(None, 16, 20, 28)    32          convolution2d_60[0][0]           
____________________________________________________________________________________________________
leakyrelu_38 (LeakyReLU)         (None, 64, 20, 28)    0           batchnormalization_25[0][0]      
____________________________________________________________________________________________________
leakyrelu_40 (LeakyReLU)         (None, 16, 20, 28)    0           batchnormalization_26[0][0]      
____________________________________________________________________________________________________
maxpooling2d_7 (MaxPooling2D)    (None, 384, 20, 28)   0           merge_10[0][0]                   
____________________________________________________________________________________________________
convolution2d_55 (Convolution2D) (None, 32, 20, 28)    12320       merge_10[0][0]                   
____________________________________________________________________________________________________
convolution2d_58 (Convolution2D) (None, 64, 20, 28)    12352       leakyrelu_38[0][0]               
____________________________________________________________________________________________________
convolution2d_61 (Convolution2D) (None, 16, 20, 28)    1296        leakyrelu_40[0][0]               
____________________________________________________________________________________________________
convolution2d_62 (Convolution2D) (None, 16, 20, 28)    6160        maxpooling2d_7[0][0]             
____________________________________________________________________________________________________
merge_11 (Merge)                 (None, 128, 20, 28)   0           convolution2d_55[0][0]           
                                                                   convolution2d_58[0][0]           
                                                                   convolution2d_61[0][0]           
                                                                   convolution2d_62[0][0]           
____________________________________________________________________________________________________
convolution2d_63 (Convolution2D) (None, 64, 40, 56)    4160        leakyrelu_11[0][0]               
____________________________________________________________________________________________________
batchnormalization_27 (BatchNorma(None, 128, 20, 28)   256         merge_11[0][0]                   
____________________________________________________________________________________________________
batchnormalization_28 (BatchNorma(None, 64, 40, 56)    128         convolution2d_63[0][0]           
____________________________________________________________________________________________________
leakyrelu_41 (LeakyReLU)         (None, 128, 20, 28)   0           batchnormalization_27[0][0]      
____________________________________________________________________________________________________
lambda_3 (Lambda)                (None, 64, 40, 56)    0           batchnormalization_28[0][0]      
____________________________________________________________________________________________________
dropout_7 (Dropout)              (None, 128, 20, 28)   0           leakyrelu_41[0][0]               
____________________________________________________________________________________________________
merge_12 (Merge)                 (None, 64, 40, 56)    0           leakyrelu_11[0][0]               
                                                                   lambda_3[0][0]                   
____________________________________________________________________________________________________
upsampling2d_3 (UpSampling2D)    (None, 128, 40, 56)   0           dropout_7[0][0]                  
____________________________________________________________________________________________________
leakyrelu_42 (LeakyReLU)         (None, 64, 40, 56)    0           merge_12[0][0]                   
____________________________________________________________________________________________________
merge_13 (Merge)                 (None, 192, 40, 56)   0           upsampling2d_3[0][0]             
                                                                   leakyrelu_42[0][0]               
____________________________________________________________________________________________________
convolution2d_65 (Convolution2D) (None, 24, 40, 56)    4632        merge_13[0][0]                   
____________________________________________________________________________________________________
convolution2d_68 (Convolution2D) (None, 4, 40, 56)     772         merge_13[0][0]                   
____________________________________________________________________________________________________
leakyrelu_43 (LeakyReLU)         (None, 24, 40, 56)    0           convolution2d_65[0][0]           
____________________________________________________________________________________________________
leakyrelu_45 (LeakyReLU)         (None, 4, 40, 56)     0           convolution2d_68[0][0]           
____________________________________________________________________________________________________
convolution2d_66 (Convolution2D) (None, 32, 40, 56)    2336        leakyrelu_43[0][0]               
____________________________________________________________________________________________________
convolution2d_69 (Convolution2D) (None, 8, 40, 56)     168         leakyrelu_45[0][0]               
____________________________________________________________________________________________________
batchnormalization_29 (BatchNorma(None, 32, 40, 56)    64          convolution2d_66[0][0]           
____________________________________________________________________________________________________
batchnormalization_30 (BatchNorma(None, 8, 40, 56)     16          convolution2d_69[0][0]           
____________________________________________________________________________________________________
leakyrelu_44 (LeakyReLU)         (None, 32, 40, 56)    0           batchnormalization_29[0][0]      
____________________________________________________________________________________________________
leakyrelu_46 (LeakyReLU)         (None, 8, 40, 56)     0           batchnormalization_30[0][0]      
____________________________________________________________________________________________________
maxpooling2d_8 (MaxPooling2D)    (None, 192, 40, 56)   0           merge_13[0][0]                   
____________________________________________________________________________________________________
convolution2d_64 (Convolution2D) (None, 16, 40, 56)    3088        merge_13[0][0]                   
____________________________________________________________________________________________________
convolution2d_67 (Convolution2D) (None, 32, 40, 56)    3104        leakyrelu_44[0][0]               
____________________________________________________________________________________________________
convolution2d_70 (Convolution2D) (None, 8, 40, 56)     328         leakyrelu_46[0][0]               
____________________________________________________________________________________________________
convolution2d_71 (Convolution2D) (None, 8, 40, 56)     1544        maxpooling2d_8[0][0]             
____________________________________________________________________________________________________
merge_14 (Merge)                 (None, 64, 40, 56)    0           convolution2d_64[0][0]           
                                                                   convolution2d_67[0][0]           
                                                                   convolution2d_70[0][0]           
                                                                   convolution2d_71[0][0]           
____________________________________________________________________________________________________
convolution2d_72 (Convolution2D) (None, 32, 80, 112)   1056        leakyrelu_5[0][0]                
____________________________________________________________________________________________________
batchnormalization_31 (BatchNorma(None, 64, 40, 56)    128         merge_14[0][0]                   
____________________________________________________________________________________________________
batchnormalization_32 (BatchNorma(None, 32, 80, 112)   64          convolution2d_72[0][0]           
____________________________________________________________________________________________________
leakyrelu_47 (LeakyReLU)         (None, 64, 40, 56)    0           batchnormalization_31[0][0]      
____________________________________________________________________________________________________
lambda_4 (Lambda)                (None, 32, 80, 112)   0           batchnormalization_32[0][0]      
____________________________________________________________________________________________________
dropout_8 (Dropout)              (None, 64, 40, 56)    0           leakyrelu_47[0][0]               
____________________________________________________________________________________________________
merge_15 (Merge)                 (None, 32, 80, 112)   0           leakyrelu_5[0][0]                
                                                                   lambda_4[0][0]                   
____________________________________________________________________________________________________
upsampling2d_4 (UpSampling2D)    (None, 64, 80, 112)   0           dropout_8[0][0]                  
____________________________________________________________________________________________________
leakyrelu_48 (LeakyReLU)         (None, 32, 80, 112)   0           merge_15[0][0]                   
____________________________________________________________________________________________________
merge_16 (Merge)                 (None, 96, 80, 112)   0           upsampling2d_4[0][0]             
                                                                   leakyrelu_48[0][0]               
____________________________________________________________________________________________________
convolution2d_74 (Convolution2D) (None, 12, 80, 112)   1164        merge_16[0][0]                   
____________________________________________________________________________________________________
convolution2d_77 (Convolution2D) (None, 2, 80, 112)    194         merge_16[0][0]                   
____________________________________________________________________________________________________
leakyrelu_49 (LeakyReLU)         (None, 12, 80, 112)   0           convolution2d_74[0][0]           
____________________________________________________________________________________________________
leakyrelu_51 (LeakyReLU)         (None, 2, 80, 112)    0           convolution2d_77[0][0]           
____________________________________________________________________________________________________
convolution2d_75 (Convolution2D) (None, 16, 80, 112)   592         leakyrelu_49[0][0]               
____________________________________________________________________________________________________
convolution2d_78 (Convolution2D) (None, 4, 80, 112)    44          leakyrelu_51[0][0]               
____________________________________________________________________________________________________
batchnormalization_33 (BatchNorma(None, 16, 80, 112)   32          convolution2d_75[0][0]           
____________________________________________________________________________________________________
batchnormalization_34 (BatchNorma(None, 4, 80, 112)    8           convolution2d_78[0][0]           
____________________________________________________________________________________________________
leakyrelu_50 (LeakyReLU)         (None, 16, 80, 112)   0           batchnormalization_33[0][0]      
____________________________________________________________________________________________________
leakyrelu_52 (LeakyReLU)         (None, 4, 80, 112)    0           batchnormalization_34[0][0]      
____________________________________________________________________________________________________
maxpooling2d_9 (MaxPooling2D)    (None, 96, 80, 112)   0           merge_16[0][0]                   
____________________________________________________________________________________________________
convolution2d_73 (Convolution2D) (None, 8, 80, 112)    776         merge_16[0][0]                   
____________________________________________________________________________________________________
convolution2d_76 (Convolution2D) (None, 16, 80, 112)   784         leakyrelu_50[0][0]               
____________________________________________________________________________________________________
convolution2d_79 (Convolution2D) (None, 4, 80, 112)    84          leakyrelu_52[0][0]               
____________________________________________________________________________________________________
convolution2d_80 (Convolution2D) (None, 4, 80, 112)    388         maxpooling2d_9[0][0]             
____________________________________________________________________________________________________
merge_17 (Merge)                 (None, 32, 80, 112)   0           convolution2d_73[0][0]           
                                                                   convolution2d_76[0][0]           
                                                                   convolution2d_79[0][0]           
                                                                   convolution2d_80[0][0]           
____________________________________________________________________________________________________
batchnormalization_35 (BatchNorma(None, 32, 80, 112)   64          merge_17[0][0]                   
____________________________________________________________________________________________________
leakyrelu_53 (LeakyReLU)         (None, 32, 80, 112)   0           batchnormalization_35[0][0]      
____________________________________________________________________________________________________
dropout_9 (Dropout)              (None, 32, 80, 112)   0           leakyrelu_53[0][0]               
____________________________________________________________________________________________________
convolution2d_81 (Convolution2D) (None, 1, 80, 112)    33          dropout_9[0][0]                  
____________________________________________________________________________________________________
main_output (Reshape)            (None, 80, 112)       0           convolution2d_81[0][0]           
====================================================================================================
Total params: 1858475
____________________________________________________________________________________________________
In [15]:
# load pre-trained model?
# model.load_weights('models/unet_inception_inv2_20160929-10-50-26_acc-0.75_weights.hdf5')
In [16]:
# sanity test
# y_pred = model.predict(X_test)
# plt.imshow(y_pred[0]>0.5)
Out [16]:
<matplotlib.image.AxesImage at 0x7f86a3261780>
In [ ]:
model_checkpoint = ModelCheckpoint('models/%s_weights.hdf5'%model_name, monitor='val_acc', save_best_only=True, save_weights_only=True)
early_stopping = keras.callbacks.EarlyStopping(patience=2, monitor='val_acc')

history3 = model.fit_generator(train_gen, 
                               samples_per_epoch=400, 
                               nb_epoch=200, 
                               verbose=1, 
                               validation_data=test_gen,
                               nb_val_samples=170,
                               callbacks=[
                                          model_checkpoint,
#                                          early_stopping
                                         ])
Epoch 1/200
400/400 [==============================] - 64s - loss: 0.8976 - acc: 0.0242 - val_loss: 0.8691 - val_acc: 0.0461
Epoch 2/200
400/400 [==============================] - 48s - loss: 0.8535 - acc: 0.0391 - val_loss: 0.7940 - val_acc: 0.0903
Epoch 3/200
400/400 [==============================] - 47s - loss: 0.8137 - acc: 0.0565 - val_loss: 0.6822 - val_acc: 0.1158
Epoch 4/200
400/400 [==============================] - 48s - loss: 0.7147 - acc: 0.0676 - val_loss: 0.6004 - val_acc: 0.2094
Epoch 5/200
400/400 [==============================] - 50s - loss: 0.6409 - acc: 0.0751 - val_loss: 0.5747 - val_acc: 0.2436
Epoch 6/200
400/400 [==============================] - 46s - loss: 0.5866 - acc: 0.0832 - val_loss: 0.5002 - val_acc: 0.3364
Epoch 7/200
400/400 [==============================] - 47s - loss: 0.5425 - acc: 0.0929 - val_loss: 0.4716 - val_acc: 0.3748
Epoch 8/200
400/400 [==============================] - 47s - loss: 0.5224 - acc: 0.0998 - val_loss: 0.4599 - val_acc: 0.3287
Epoch 9/200
400/400 [==============================] - 48s - loss: 0.4933 - acc: 0.0944 - val_loss: 0.4340 - val_acc: 0.3628
Epoch 10/200
400/400 [==============================] - 51s - loss: 0.4633 - acc: 0.1242 - val_loss: 0.4294 - val_acc: 0.4512
Epoch 11/200
400/400 [==============================] - 62s - loss: 0.4439 - acc: 0.1253 - val_loss: 0.4066 - val_acc: 0.3927
Epoch 12/200
400/400 [==============================] - 67s - loss: 0.4327 - acc: 0.1149 - val_loss: 0.3771 - val_acc: 0.4518
Epoch 13/200
400/400 [==============================] - 65s - loss: 0.4157 - acc: 0.1326 - val_loss: 0.3651 - val_acc: 0.4161
Epoch 14/200
400/400 [==============================] - 58s - loss: 0.4019 - acc: 0.1304 - val_loss: 0.3632 - val_acc: 0.4656
Epoch 15/200
400/400 [==============================] - 46s - loss: 0.3770 - acc: 0.1416 - val_loss: 0.3683 - val_acc: 0.4424
Epoch 16/200
400/400 [==============================] - 47s - loss: 0.3605 - acc: 0.1486 - val_loss: 0.3463 - val_acc: 0.4726
Epoch 17/200
400/400 [==============================] - 49s - loss: 0.3657 - acc: 0.1323 - val_loss: 0.3414 - val_acc: 0.4780
Epoch 18/200
400/400 [==============================] - 53s - loss: 0.3621 - acc: 0.1144 - val_loss: 0.3300 - val_acc: 0.4860
Epoch 19/200
400/400 [==============================] - 57s - loss: 0.3461 - acc: 0.1278 - val_loss: 0.3072 - val_acc: 0.4566
Epoch 20/200
400/400 [==============================] - 64s - loss: 0.3209 - acc: 0.1258 - val_loss: 0.3203 - val_acc: 0.4690
Epoch 21/200
400/400 [==============================] - 65s - loss: 0.3169 - acc: 0.1272 - val_loss: 0.3037 - val_acc: 0.5291
Epoch 22/200
400/400 [==============================] - 62s - loss: 0.3132 - acc: 0.1333 - val_loss: 0.2931 - val_acc: 0.5083
Epoch 23/200
400/400 [==============================] - 62s - loss: 0.2983 - acc: 0.1288 - val_loss: 0.2845 - val_acc: 0.4930
Epoch 24/200
400/400 [==============================] - 63s - loss: 0.2919 - acc: 0.1219 - val_loss: 0.2713 - val_acc: 0.5307
Epoch 25/200
400/400 [==============================] - 63s - loss: 0.2777 - acc: 0.1442 - val_loss: 0.2819 - val_acc: 0.5411
Epoch 26/200
400/400 [==============================] - 63s - loss: 0.2662 - acc: 0.1415 - val_loss: 0.2733 - val_acc: 0.5252
Epoch 27/200
400/400 [==============================] - 63s - loss: 0.2750 - acc: 0.1280 - val_loss: 0.2503 - val_acc: 0.5768
Epoch 28/200
400/400 [==============================] - 63s - loss: 0.2610 - acc: 0.1276 - val_loss: 0.2527 - val_acc: 0.5636
Epoch 29/200
400/400 [==============================] - 62s - loss: 0.2491 - acc: 0.1574 - val_loss: 0.2477 - val_acc: 0.5587
Epoch 30/200
400/400 [==============================] - 62s - loss: 0.2429 - acc: 0.1503 - val_loss: 0.2379 - val_acc: 0.5546
Epoch 31/200
400/400 [==============================] - 60s - loss: 0.2414 - acc: 0.1466 - val_loss: 0.2297 - val_acc: 0.5554
Epoch 32/200
400/400 [==============================] - 63s - loss: 0.2325 - acc: 0.1410 - val_loss: 0.2401 - val_acc: 0.5885
Epoch 33/200
400/400 [==============================] - 64s - loss: 0.2243 - acc: 0.1575 - val_loss: 0.2275 - val_acc: 0.5656
Epoch 34/200
400/400 [==============================] - 63s - loss: 0.2307 - acc: 0.1620 - val_loss: 0.2188 - val_acc: 0.6052
Epoch 35/200
400/400 [==============================] - 63s - loss: 0.2091 - acc: 0.1659 - val_loss: 0.2278 - val_acc: 0.5789
Epoch 36/200
400/400 [==============================] - 63s - loss: 0.2172 - acc: 0.1570 - val_loss: 0.2429 - val_acc: 0.5694
Epoch 37/200
400/400 [==============================] - 57s - loss: 0.2289 - acc: 0.1496 - val_loss: 0.2197 - val_acc: 0.6003
Epoch 38/200
400/400 [==============================] - 45s - loss: 0.2216 - acc: 0.1643 - val_loss: 0.2249 - val_acc: 0.5837
Epoch 39/200
400/400 [==============================] - 45s - loss: 0.2114 - acc: 0.1434 - val_loss: 0.2176 - val_acc: 0.5786
Epoch 40/200
400/400 [==============================] - 45s - loss: 0.2140 - acc: 0.1768 - val_loss: 0.2063 - val_acc: 0.5748
Epoch 41/200
400/400 [==============================] - 46s - loss: 0.2032 - acc: 0.1706 - val_loss: 0.2133 - val_acc: 0.5989
Epoch 42/200
400/400 [==============================] - 45s - loss: 0.1952 - acc: 0.1712 - val_loss: 0.2149 - val_acc: 0.5991
Epoch 43/200
400/400 [==============================] - 46s - loss: 0.2037 - acc: 0.1804 - val_loss: 0.1951 - val_acc: 0.5945
Epoch 44/200
400/400 [==============================] - 45s - loss: 0.1884 - acc: 0.1687 - val_loss: 0.1950 - val_acc: 0.5952
Epoch 45/200
400/400 [==============================] - 45s - loss: 0.1810 - acc: 0.1843 - val_loss: 0.1940 - val_acc: 0.6044
Epoch 46/200
400/400 [==============================] - 45s - loss: 0.1838 - acc: 0.1929 - val_loss: 0.1934 - val_acc: 0.5667
Epoch 47/200
400/400 [==============================] - 45s - loss: 0.1878 - acc: 0.1637 - val_loss: 0.1950 - val_acc: 0.6043
Epoch 48/200
400/400 [==============================] - 45s - loss: 0.1828 - acc: 0.1908 - val_loss: 0.1956 - val_acc: 0.5937
Epoch 49/200
400/400 [==============================] - 45s - loss: 0.1798 - acc: 0.1806 - val_loss: 0.1930 - val_acc: 0.5938
Epoch 50/200
400/400 [==============================] - 45s - loss: 0.1707 - acc: 0.2049 - val_loss: 0.1992 - val_acc: 0.5914
Epoch 51/200
400/400 [==============================] - 46s - loss: 0.1746 - acc: 0.1924 - val_loss: 0.1804 - val_acc: 0.6095
Epoch 52/200
400/400 [==============================] - 46s - loss: 0.1757 - acc: 0.2042 - val_loss: 0.1849 - val_acc: 0.5947
Epoch 53/200
400/400 [==============================] - 46s - loss: 0.1736 - acc: 0.1910 - val_loss: 0.1705 - val_acc: 0.6392
Epoch 54/200
400/400 [==============================] - 45s - loss: 0.1621 - acc: 0.1900 - val_loss: 0.1706 - val_acc: 0.6276
Epoch 55/200
400/400 [==============================] - 45s - loss: 0.1525 - acc: 0.2265 - val_loss: 0.1786 - val_acc: 0.6127
Epoch 56/200
400/400 [==============================] - 45s - loss: 0.1675 - acc: 0.2018 - val_loss: 0.1821 - val_acc: 0.6111
Epoch 57/200
400/400 [==============================] - 46s - loss: 0.1686 - acc: 0.2186 - val_loss: 0.1803 - val_acc: 0.6488
Epoch 58/200
400/400 [==============================] - 45s - loss: 0.1526 - acc: 0.2383 - val_loss: 0.1712 - val_acc: 0.6116
Epoch 59/200
400/400 [==============================] - 46s - loss: 0.1491 - acc: 0.2261 - val_loss: 0.1570 - val_acc: 0.6540
Epoch 60/200
400/400 [==============================] - 45s - loss: 0.1467 - acc: 0.2538 - val_loss: 0.1585 - val_acc: 0.6419
Epoch 61/200
400/400 [==============================] - 45s - loss: 0.1451 - acc: 0.2390 - val_loss: 0.1669 - val_acc: 0.6358
Epoch 62/200
400/400 [==============================] - 45s - loss: 0.1479 - acc: 0.2691 - val_loss: 0.1689 - val_acc: 0.6348
Epoch 63/200
400/400 [==============================] - 45s - loss: 0.1526 - acc: 0.2562 - val_loss: 0.1534 - val_acc: 0.6486
Epoch 64/200
400/400 [==============================] - 45s - loss: 0.1355 - acc: 0.2591 - val_loss: 0.1697 - val_acc: 0.6414
Epoch 65/200
400/400 [==============================] - 46s - loss: 0.1422 - acc: 0.2656 - val_loss: 0.1687 - val_acc: 0.6411
Epoch 66/200
400/400 [==============================] - 45s - loss: 0.1441 - acc: 0.2725 - val_loss: 0.1553 - val_acc: 0.6459
Epoch 67/200
400/400 [==============================] - 45s - loss: 0.1473 - acc: 0.3032 - val_loss: 0.1615 - val_acc: 0.6451
Epoch 68/200
400/400 [==============================] - 46s - loss: 0.1298 - acc: 0.2947 - val_loss: 0.1548 - val_acc: 0.6403
Epoch 69/200
400/400 [==============================] - 45s - loss: 0.1381 - acc: 0.3289 - val_loss: 0.1738 - val_acc: 0.6184
Epoch 70/200
400/400 [==============================] - 46s - loss: 0.1340 - acc: 0.3133 - val_loss: 0.1502 - val_acc: 0.6812
Epoch 71/200
400/400 [==============================] - 45s - loss: 0.1305 - acc: 0.3283 - val_loss: 0.1550 - val_acc: 0.6514
Epoch 72/200
400/400 [==============================] - 46s - loss: 0.1406 - acc: 0.3216 - val_loss: 0.1620 - val_acc: 0.6479
Epoch 73/200
400/400 [==============================] - 45s - loss: 0.1255 - acc: 0.3382 - val_loss: 0.1491 - val_acc: 0.6600
Epoch 74/200
400/400 [==============================] - 45s - loss: 0.1248 - acc: 0.3691 - val_loss: 0.1636 - val_acc: 0.6396
Epoch 75/200
400/400 [==============================] - 46s - loss: 0.1386 - acc: 0.3614 - val_loss: 0.1614 - val_acc: 0.6606
Epoch 76/200
400/400 [==============================] - 45s - loss: 0.1357 - acc: 0.3647 - val_loss: 0.1688 - val_acc: 0.6499
Epoch 77/200
400/400 [==============================] - 45s - loss: 0.1308 - acc: 0.3723 - val_loss: 0.1448 - val_acc: 0.6740
Epoch 78/200
400/400 [==============================] - 46s - loss: 0.1244 - acc: 0.3867 - val_loss: 0.1686 - val_acc: 0.6552
Epoch 79/200
400/400 [==============================] - 45s - loss: 0.1244 - acc: 0.4033 - val_loss: 0.1441 - val_acc: 0.6774
Epoch 80/200
400/400 [==============================] - 46s - loss: 0.1265 - acc: 0.3965 - val_loss: 0.1735 - val_acc: 0.6404
Epoch 81/200
400/400 [==============================] - 45s - loss: 0.1294 - acc: 0.4201 - val_loss: 0.1467 - val_acc: 0.6740
Epoch 82/200
400/400 [==============================] - 45s - loss: 0.1253 - acc: 0.4094 - val_loss: 0.1491 - val_acc: 0.6709
Epoch 83/200
400/400 [==============================] - 45s - loss: 0.1250 - acc: 0.4023 - val_loss: 0.1479 - val_acc: 0.6671
Epoch 84/200
400/400 [==============================] - 45s - loss: 0.1231 - acc: 0.4369 - val_loss: 0.1588 - val_acc: 0.6470
Epoch 85/200
400/400 [==============================] - 46s - loss: 0.1292 - acc: 0.4111 - val_loss: 0.1449 - val_acc: 0.6659
Epoch 86/200
400/400 [==============================] - 46s - loss: 0.1278 - acc: 0.4072 - val_loss: 0.1458 - val_acc: 0.6816
Epoch 87/200
400/400 [==============================] - 46s - loss: 0.1201 - acc: 0.4188 - val_loss: 0.1668 - val_acc: 0.6390
Epoch 88/200
400/400 [==============================] - 46s - loss: 0.1255 - acc: 0.4212 - val_loss: 0.1160 - val_acc: 0.7185
Epoch 89/200
400/400 [==============================] - 46s - loss: 0.1204 - acc: 0.4218 - val_loss: 0.1563 - val_acc: 0.6661
Epoch 90/200
400/400 [==============================] - 46s - loss: 0.1170 - acc: 0.4045 - val_loss: 0.1513 - val_acc: 0.6672
Epoch 91/200
400/400 [==============================] - 46s - loss: 0.1178 - acc: 0.4285 - val_loss: 0.1528 - val_acc: 0.6588
Epoch 92/200
400/400 [==============================] - 45s - loss: 0.1212 - acc: 0.4222 - val_loss: 0.1493 - val_acc: 0.6752
Epoch 93/200
400/400 [==============================] - 45s - loss: 0.1166 - acc: 0.4376 - val_loss: 0.1420 - val_acc: 0.6649
Epoch 94/200
400/400 [==============================] - 46s - loss: 0.1152 - acc: 0.4473 - val_loss: 0.1341 - val_acc: 0.6732
Epoch 95/200
400/400 [==============================] - 46s - loss: 0.1226 - acc: 0.4325 - val_loss: 0.1495 - val_acc: 0.6823
Epoch 96/200
400/400 [==============================] - 45s - loss: 0.1195 - acc: 0.4617 - val_loss: 0.1624 - val_acc: 0.6500
Epoch 97/200
400/400 [==============================] - 46s - loss: 0.1032 - acc: 0.4879 - val_loss: 0.1274 - val_acc: 0.6939
Epoch 98/200
400/400 [==============================] - 46s - loss: 0.1146 - acc: 0.4973 - val_loss: 0.1437 - val_acc: 0.6609
Epoch 99/200
400/400 [==============================] - 45s - loss: 0.1114 - acc: 0.4925 - val_loss: 0.1457 - val_acc: 0.6714
Epoch 100/200
400/400 [==============================] - 46s - loss: 0.1161 - acc: 0.4809 - val_loss: 0.1316 - val_acc: 0.6991
Epoch 101/200
400/400 [==============================] - 45s - loss: 0.1233 - acc: 0.4772 - val_loss: 0.1332 - val_acc: 0.6864
Epoch 102/200
400/400 [==============================] - 46s - loss: 0.1058 - acc: 0.5083 - val_loss: 0.1435 - val_acc: 0.6796
Epoch 103/200
400/400 [==============================] - 46s - loss: 0.1128 - acc: 0.4975 - val_loss: 0.1285 - val_acc: 0.6976
Epoch 104/200
400/400 [==============================] - 45s - loss: 0.1093 - acc: 0.5009 - val_loss: 0.1459 - val_acc: 0.6673
Epoch 105/200
400/400 [==============================] - 46s - loss: 0.1149 - acc: 0.4936 - val_loss: 0.1291 - val_acc: 0.6972
Epoch 106/200
400/400 [==============================] - 46s - loss: 0.1092 - acc: 0.5133 - val_loss: 0.1353 - val_acc: 0.6876
Epoch 107/200
400/400 [==============================] - 46s - loss: 0.1052 - acc: 0.5086 - val_loss: 0.1441 - val_acc: 0.6811
Epoch 108/200
400/400 [==============================] - 46s - loss: 0.1080 - acc: 0.5245 - val_loss: 0.1384 - val_acc: 0.6886
Epoch 109/200
400/400 [==============================] - 45s - loss: 0.1021 - acc: 0.5110 - val_loss: 0.1342 - val_acc: 0.6875
Epoch 110/200
400/400 [==============================] - 46s - loss: 0.1068 - acc: 0.5161 - val_loss: 0.1310 - val_acc: 0.7084
Epoch 111/200
400/400 [==============================] - 45s - loss: 0.1092 - acc: 0.5135 - val_loss: 0.1357 - val_acc: 0.6808
Epoch 112/200
400/400 [==============================] - 45s - loss: 0.1102 - acc: 0.5186 - val_loss: 0.1469 - val_acc: 0.6822
Epoch 113/200
400/400 [==============================] - 46s - loss: 0.1035 - acc: 0.5442 - val_loss: 0.1286 - val_acc: 0.6944
Epoch 114/200
400/400 [==============================] - 45s - loss: 0.1146 - acc: 0.5257 - val_loss: 0.1314 - val_acc: 0.7166
Epoch 115/200
400/400 [==============================] - 46s - loss: 0.1112 - acc: 0.5127 - val_loss: 0.1430 - val_acc: 0.6656
Epoch 116/200
400/400 [==============================] - 46s - loss: 0.1047 - acc: 0.5454 - val_loss: 0.1233 - val_acc: 0.6918
Epoch 117/200
400/400 [==============================] - 46s - loss: 0.1062 - acc: 0.5380 - val_loss: 0.1225 - val_acc: 0.6897
Epoch 118/200
400/400 [==============================] - 45s - loss: 0.1068 - acc: 0.5373 - val_loss: 0.1389 - val_acc: 0.6831
Epoch 119/200
400/400 [==============================] - 46s - loss: 0.1005 - acc: 0.5513 - val_loss: 0.1280 - val_acc: 0.7044
Epoch 120/200
400/400 [==============================] - 46s - loss: 0.1016 - acc: 0.5531 - val_loss: 0.1124 - val_acc: 0.7217
Epoch 121/200
400/400 [==============================] - 46s - loss: 0.1070 - acc: 0.5479 - val_loss: 0.1156 - val_acc: 0.7091
Epoch 122/200
400/400 [==============================] - 46s - loss: 0.1007 - acc: 0.5600 - val_loss: 0.1259 - val_acc: 0.7091
Epoch 123/200
400/400 [==============================] - 45s - loss: 0.1043 - acc: 0.5578 - val_loss: 0.1312 - val_acc: 0.6909
Epoch 124/200
400/400 [==============================] - 46s - loss: 0.1119 - acc: 0.5454 - val_loss: 0.1213 - val_acc: 0.7006
Epoch 125/200
400/400 [==============================] - 46s - loss: 0.1082 - acc: 0.5574 - val_loss: 0.1332 - val_acc: 0.6626
Epoch 126/200
400/400 [==============================] - 45s - loss: 0.0958 - acc: 0.5655 - val_loss: 0.1298 - val_acc: 0.6808
Epoch 127/200
400/400 [==============================] - 45s - loss: 0.1136 - acc: 0.5499 - val_loss: 0.1206 - val_acc: 0.6981
Epoch 128/200
400/400 [==============================] - 46s - loss: 0.1065 - acc: 0.5635 - val_loss: 0.1246 - val_acc: 0.6946
Epoch 129/200
400/400 [==============================] - 45s - loss: 0.1153 - acc: 0.5438 - val_loss: 0.1286 - val_acc: 0.6916
Epoch 130/200
400/400 [==============================] - 46s - loss: 0.1132 - acc: 0.5503 - val_loss: 0.1199 - val_acc: 0.7054
Epoch 131/200
400/400 [==============================] - 46s - loss: 0.0967 - acc: 0.5629 - val_loss: 0.1278 - val_acc: 0.6898
Epoch 132/200
400/400 [==============================] - 46s - loss: 0.1006 - acc: 0.5703 - val_loss: 0.1397 - val_acc: 0.6759
Epoch 133/200
400/400 [==============================] - 46s - loss: 0.1029 - acc: 0.5767 - val_loss: 0.1246 - val_acc: 0.7088
Epoch 134/200
400/400 [==============================] - 46s - loss: 0.1044 - acc: 0.5567 - val_loss: 0.1274 - val_acc: 0.7022
Epoch 135/200
400/400 [==============================] - 46s - loss: 0.0985 - acc: 0.5873 - val_loss: 0.1268 - val_acc: 0.6940
Epoch 136/200
400/400 [==============================] - 45s - loss: 0.0951 - acc: 0.5917 - val_loss: 0.1233 - val_acc: 0.7015
Epoch 137/200
400/400 [==============================] - 46s - loss: 0.0966 - acc: 0.6047 - val_loss: 0.1217 - val_acc: 0.7113
Epoch 138/200
400/400 [==============================] - 45s - loss: 0.0968 - acc: 0.5963 - val_loss: 0.1234 - val_acc: 0.6966
Epoch 139/200
400/400 [==============================] - 47s - loss: 0.0976 - acc: 0.5896 - val_loss: 0.1198 - val_acc: 0.7054
Epoch 140/200
400/400 [==============================] - 47s - loss: 0.0999 - acc: 0.6005 - val_loss: 0.1062 - val_acc: 0.7212
Epoch 141/200
400/400 [==============================] - 46s - loss: 0.0957 - acc: 0.6146 - val_loss: 0.1204 - val_acc: 0.6965
Epoch 142/200
400/400 [==============================] - 46s - loss: 0.0940 - acc: 0.6215 - val_loss: 0.1259 - val_acc: 0.7013
Epoch 143/200
400/400 [==============================] - 53s - loss: 0.0985 - acc: 0.5989 - val_loss: 0.1153 - val_acc: 0.6989
Epoch 144/200
400/400 [==============================] - 52s - loss: 0.1040 - acc: 0.6007 - val_loss: 0.1243 - val_acc: 0.6975
Epoch 145/200
400/400 [==============================] - 60s - loss: 0.0950 - acc: 0.6276 - val_loss: 0.1076 - val_acc: 0.7350
Epoch 146/200
400/400 [==============================] - 63s - loss: 0.0912 - acc: 0.6121 - val_loss: 0.1172 - val_acc: 0.7136
Epoch 147/200
400/400 [==============================] - 65s - loss: 0.0942 - acc: 0.6277 - val_loss: 0.1231 - val_acc: 0.7047
Epoch 148/200
400/400 [==============================] - 65s - loss: 0.0937 - acc: 0.6207 - val_loss: 0.1169 - val_acc: 0.6912
Epoch 149/200
400/400 [==============================] - 63s - loss: 0.1020 - acc: 0.6151 - val_loss: 0.1219 - val_acc: 0.7031
Epoch 150/200
400/400 [==============================] - 63s - loss: 0.0971 - acc: 0.6231 - val_loss: 0.1208 - val_acc: 0.6894
Epoch 151/200
400/400 [==============================] - 62s - loss: 0.1017 - acc: 0.6181 - val_loss: 0.1126 - val_acc: 0.7133
Epoch 152/200
400/400 [==============================] - 62s - loss: 0.0884 - acc: 0.6364 - val_loss: 0.1178 - val_acc: 0.7010
Epoch 153/200
400/400 [==============================] - 65s - loss: 0.0949 - acc: 0.6214 - val_loss: 0.1108 - val_acc: 0.7091
Epoch 154/200
400/400 [==============================] - 63s - loss: 0.1046 - acc: 0.6143 - val_loss: 0.1115 - val_acc: 0.7087
Epoch 155/200
400/400 [==============================] - 63s - loss: 0.0926 - acc: 0.6415 - val_loss: 0.1117 - val_acc: 0.7221
Epoch 156/200
400/400 [==============================] - 64s - loss: 0.0900 - acc: 0.6492 - val_loss: 0.1109 - val_acc: 0.7099
Epoch 157/200
400/400 [==============================] - 64s - loss: 0.0909 - acc: 0.6439 - val_loss: 0.1011 - val_acc: 0.7419
Epoch 158/200
400/400 [==============================] - 63s - loss: 0.0895 - acc: 0.6399 - val_loss: 0.1039 - val_acc: 0.7118
Epoch 159/200
400/400 [==============================] - 63s - loss: 0.0924 - acc: 0.6415 - val_loss: 0.1115 - val_acc: 0.7232
Epoch 160/200
400/400 [==============================] - 64s - loss: 0.0859 - acc: 0.6677 - val_loss: 0.1099 - val_acc: 0.7133
Epoch 161/200
400/400 [==============================] - 63s - loss: 0.0925 - acc: 0.6492 - val_loss: 0.1010 - val_acc: 0.7274
Epoch 162/200
400/400 [==============================] - 63s - loss: 0.0953 - acc: 0.6500 - val_loss: 0.1193 - val_acc: 0.7196
Epoch 163/200
400/400 [==============================] - 61s - loss: 0.1005 - acc: 0.6309 - val_loss: 0.1192 - val_acc: 0.7201
Epoch 164/200
400/400 [==============================] - 59s - loss: 0.1004 - acc: 0.6529 - val_loss: 0.1074 - val_acc: 0.7265
Epoch 165/200
400/400 [==============================] - 63s - loss: 0.0874 - acc: 0.6627 - val_loss: 0.1192 - val_acc: 0.7154
Epoch 166/200
400/400 [==============================] - 64s - loss: 0.0887 - acc: 0.6668 - val_loss: 0.1189 - val_acc: 0.7163
Epoch 167/200
400/400 [==============================] - 64s - loss: 0.0856 - acc: 0.6579 - val_loss: 0.1049 - val_acc: 0.7273
Epoch 168/200
400/400 [==============================] - 62s - loss: 0.0916 - acc: 0.6653 - val_loss: 0.1185 - val_acc: 0.7118
Epoch 169/200
400/400 [==============================] - 62s - loss: 0.0930 - acc: 0.6596 - val_loss: 0.1011 - val_acc: 0.7301
Epoch 170/200
400/400 [==============================] - 62s - loss: 0.0915 - acc: 0.6725 - val_loss: 0.1172 - val_acc: 0.7118
Epoch 171/200
400/400 [==============================] - 63s - loss: 0.0873 - acc: 0.6646 - val_loss: 0.1194 - val_acc: 0.7183
Epoch 172/200
400/400 [==============================] - 62s - loss: 0.0897 - acc: 0.6619 - val_loss: 0.1129 - val_acc: 0.6904
Epoch 173/200
400/400 [==============================] - 62s - loss: 0.1000 - acc: 0.6533 - val_loss: 0.1055 - val_acc: 0.7327
Epoch 174/200
400/400 [==============================] - 64s - loss: 0.0937 - acc: 0.6719 - val_loss: 0.0949 - val_acc: 0.7400
Epoch 175/200
400/400 [==============================] - 64s - loss: 0.0913 - acc: 0.6782 - val_loss: 0.1065 - val_acc: 0.7338
Epoch 176/200
400/400 [==============================] - 62s - loss: 0.0871 - acc: 0.6712 - val_loss: 0.1040 - val_acc: 0.7259
Epoch 177/200
400/400 [==============================] - 61s - loss: 0.0915 - acc: 0.6759 - val_loss: 0.1018 - val_acc: 0.7414
Epoch 178/200
400/400 [==============================] - 65s - loss: 0.0929 - acc: 0.6747 - val_loss: 0.1023 - val_acc: 0.7259
Epoch 179/200
400/400 [==============================] - 65s - loss: 0.0914 - acc: 0.6727 - val_loss: 0.1167 - val_acc: 0.7220
Epoch 180/200
400/400 [==============================] - 64s - loss: 0.0833 - acc: 0.6842 - val_loss: 0.1052 - val_acc: 0.7298
Epoch 181/200
400/400 [==============================] - 93s - loss: 0.0861 - acc: 0.6785 - val_loss: 0.1050 - val_acc: 0.7084
Epoch 182/200
400/400 [==============================] - 70s - loss: 0.0984 - acc: 0.6628 - val_loss: 0.1069 - val_acc: 0.7252
Epoch 183/200
400/400 [==============================] - 61s - loss: 0.0948 - acc: 0.6698 - val_loss: 0.1140 - val_acc: 0.7234
Epoch 184/200
400/400 [==============================] - 62s - loss: 0.0778 - acc: 0.6972 - val_loss: 0.1037 - val_acc: 0.7287
Epoch 185/200
400/400 [==============================] - 64s - loss: 0.0865 - acc: 0.6908 - val_loss: 0.0992 - val_acc: 0.7338
Epoch 186/200
400/400 [==============================] - 64s - loss: 0.0949 - acc: 0.6762 - val_loss: 0.1014 - val_acc: 0.7218
Epoch 187/200
400/400 [==============================] - 65s - loss: 0.0819 - acc: 0.6887 - val_loss: 0.1039 - val_acc: 0.7190
Epoch 188/200
400/400 [==============================] - 62s - loss: 0.0867 - acc: 0.6796 - val_loss: 0.0976 - val_acc: 0.7318
Epoch 189/200
400/400 [==============================] - 62s - loss: 0.0866 - acc: 0.6857 - val_loss: 0.1060 - val_acc: 0.7132
Epoch 190/200
400/400 [==============================] - 64s - loss: 0.0864 - acc: 0.6734 - val_loss: 0.1020 - val_acc: 0.7298
Epoch 191/200
400/400 [==============================] - 63s - loss: 0.0847 - acc: 0.6878 - val_loss: 0.1012 - val_acc: 0.7422
Epoch 192/200
400/400 [==============================] - 63s - loss: 0.0882 - acc: 0.6725 - val_loss: 0.1006 - val_acc: 0.7422
Epoch 193/200
400/400 [==============================] - 65s - loss: 0.0842 - acc: 0.6839 - val_loss: 0.1144 - val_acc: 0.7149
Epoch 194/200
400/400 [==============================] - 67s - loss: 0.0805 - acc: 0.7033 - val_loss: 0.1093 - val_acc: 0.7184
Epoch 195/200
In [17]:
%%time
score = model.evaluate_generator(test_gen, val_samples=350)
score=dict(zip(model.metrics_names,score))
print(score)
{'acc': 0.7344642894608634, 'loss': 0.10256582477263042}
CPU times: user 35 s, sys: 2.7 s, total: 37.7 s
Wall time: 34.7 s
In [134]:
wfn='models/{}_{}_acc-{:2.2f}_weights.hdf5'.format(model_name,ts,score['acc'])
model.save_weights(wfn)
wfn
Out [134]:
'models/unet_inception_inv2_20160929-10-50-26_acc-0.75_weights.hdf5'

Note that the difference in accuracy curves below is because we augumented the training data and so "acc" is lower. On the other hand the validation/test data was unaugumented, giving a higher accuracy.

In [95]:
def plot_hist(history):
    """plot keras history object"""
    for label in history.history:
        if not label.startswith('val'):
            plt.title(label)
            plt.plot(history.history[label], label=label)
            if 'val_' + label in history.history:
                plt.plot(history.history['val_' + label], label=label)
            plt.xlabel('epoch')
            plt.show()

plot_hist(model.history)

Results

Note we compare the unugumented training and unugumented testing data to see if it overfits. If we compared the augumented and unaugumented we would get strange results like more accuracy on the validation data than the test data, but this is due to artificially increased variance on the augumented training data.

In [44]:
model = unet_inception_model(optimizer,img_cols,img_rows)

# load best checkpoint
# model.load_weights('models/%s_weights.hdf5'%model_name)

# or load pre-trained model
model.load_weights('models/unet_inception_inv2_20160929-10-50-26_acc-0.75_weights.hdf5')
val_samples=10000

# add a few other metrics
model.compile(optimizer=optimizer,
              loss=[dice_coef_loss],
              metrics=[
                'accuracy',
                'mse',
                'binary_crossentropy',
                'matthews_correlation',
                'binary_accuracy',
                ]
             )
In [45]:
%%time
score = model.evaluate_generator(test_gen, val_samples=val_samples)
score=dict(zip(model.metrics_names,score))
print(score)
{'mean_squared_error': 0.0078170919320546088, 'matthews_correlation': 0.77096645796298979, 'loss': 0.1007234075255692, 'acc': 0.73327500212192531, 'binary_crossentropy': 0.08795671812444926, 'binary_accuracy': 0.99096557062864299}
CPU times: user 3min 57s, sys: 1min 3s, total: 5min 1s
Wall time: 3min 52s
In [48]:
%%time
score = model.evaluate_generator(train_gen_unaugumented, val_samples=val_samples)
score=dict(zip(model.metrics_names,score))
print(score)
{'mean_squared_error': 0.0075589731866493818, 'matthews_correlation': 0.81601719522476202, 'loss': 0.079188272582367061, 'acc': 0.73974999982118606, 'binary_crossentropy': 0.083371352989226585, 'binary_accuracy': 0.99112304443120958}
CPU times: user 3min 27s, sys: 1min 3s, total: 4min 30s
Wall time: 3min 23s
In [50]:
%%time
score = model.evaluate_generator(train_gen, val_samples=val_samples)
score=dict(zip(model.metrics_names,score))
print(score)
{'mean_squared_error': 0.0069730838667601347, 'matthews_correlation': 0.8103281590938568, 'loss': 0.074400506030768157, 'acc': 0.7660037497878075, 'binary_crossentropy': 0.075926830759271979, 'binary_accuracy': 0.15817984386076386}
CPU times: user 3min 28s, sys: 1min 2s, total: 4min 31s
Wall time: 3min 22s
In [25]:
X_test, y_test = next(test_gen)
y_pred = model.predict(X_test)
In [26]:
from matplotlib.colors import LogNorm
norm=LogNorm(vmin=1e-3, vmax=1.0)
sns.set_style("dark")
n=batch_size
plt.figure(figsize=(9,2.5*n))


fontsize=16
for i in range(n):
    
    ax=plt.subplot(n,3,1+i*3)
    if i==0: plt.title('(a) Input image', fontsize=fontsize)
    plt.imshow(np.transpose(X_test,(0,2,3,1))[i])
    plt.axis('off')
    ax.axes.get_xaxis().set_visible(False)
    ax.axes.get_yaxis().set_visible(False)
    
    ax=plt.subplot(n,3,2+i*3)
    if i==0: plt.title('(a) Manual mask', fontsize=fontsize)
    plt.imshow(np.transpose(X_test,(0,2,3,1))[i])
    cm=plt.imshow(y_test[i]>0.5, norm=norm, alpha=1, cmap=plt.cm.rainbow)
    plt.axis('off')
    ax.axes.get_xaxis().set_visible(False)
    ax.axes.get_yaxis().set_visible(False)
    
    ax=plt.subplot(n,3,3+i*3)
    if i==0: plt.title('(b) Predicted mask', fontsize=fontsize)
    plt.imshow(np.transpose(X_test,(0,2,3,1))[i])
    cm=plt.imshow(y_pred[i]>0.5, norm=norm, alpha=1, cmap=plt.cm.rainbow)
    plt.axis('off')
    ax.axes.get_xaxis().set_visible(False)
    ax.axes.get_yaxis().set_visible(False)
    
plt.tight_layout()
plt.show()