In [8]:
#!mkdir data
In [2]:
#!wget http://bit.do/dosa-data -O data/dosa-data.zip
In [4]:
#!cd data && unzip dosa-data.zip

Import base libraries

In [1]:
import numpy as np
import pandas as pd
import keras
import matplotlib.pyplot as plt
%matplotlib inline
import vis
Using TensorFlow backend.
In [2]:
train_X = np.load("data/trainx.npy")
train_y = np.load("data/trainy.npy")
test_X = np.load("data/testx.npy")
test_y = np.load("data/testy.npy")
In [3]:
plt.imshow(train_X[1])
Out[3]:
<matplotlib.image.AxesImage at 0x7f216c55b320>
In [4]:
train_X.shape
Out[4]:
(260, 224, 224, 3)
In [5]:
from keras.preprocessing.image import ImageDataGenerator,  \
load_img, img_to_array
In [6]:
image = train_X[1]
In [7]:
plt.imshow(image)
Out[7]:
<matplotlib.image.AxesImage at 0x7f216aaed518>
In [8]:
# ?ImageDataGenerator
In [9]:
datagen = ImageDataGenerator( height_shift_range=0.6,
    width_shift_range=0.6,
    rotation_range=45, 
)
In [10]:
vis.show_single_image_gen(datagen, image, 10)

Dosa - Model 1

In [11]:
data = ImageDataGenerator( vertical_flip=True,
    horizontal_flip=True,
    zoom_range=0.4,
    fill_mode="reflect",
    width_shift_range=0.2, 
    height_shift_range=0.2,
    rotation_range=90,                      
    samplewise_center=True, 
    samplewise_std_normalization=True,
)
In [12]:
train_generator = data.flow(x=train_X, y = train_y, shuffle=True)
In [13]:
test_generator = data.flow(x=test_X, y=test_y, shuffle=True)
In [14]:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten
In [15]:
cnn = Sequential()
cnn.add(Conv2D(32, (3,3), activation="relu", input_shape = (224, 224, 3)))
cnn.add(MaxPooling2D(pool_size=(3,3)))
cnn.add(Conv2D(64, (3,3), activation="relu"))
cnn.add(MaxPooling2D(pool_size=(3,3)))
cnn.add(Conv2D(64, (3,3), activation="relu"))
cnn.add(MaxPooling2D(pool_size=(3,3)))
cnn.add(Flatten())
cnn.add(Dense(64, activation="relu"))
cnn.add(Dropout(0.5))
cnn.add(Dense(2, activation="sigmoid"))
In [39]:
cnn.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_4 (Conv2D)            (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 74, 74, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 72, 72, 64)        18496     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 24, 24, 64)        0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 22, 22, 64)        36928     
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 7, 7, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 3136)              0         
_________________________________________________________________
dense_3 (Dense)              (None, 64)                200768    
_________________________________________________________________
dropout_2 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_4 (Dense)              (None, 2)                 130       
=================================================================
Total params: 257,218
Trainable params: 257,218
Non-trainable params: 0
_________________________________________________________________
In [36]:
cnn.compile(loss="binary_crossentropy", optimizer="sgd", metrics=["accuracy"])
In [37]:
cnn_output = cnn.fit_generator(train_generator, epochs = 10, 
                              validation_data=test_generator, verbose=2)
Epoch 1/10
 - 13s - loss: 0.6822 - acc: 0.5663 - val_loss: 0.6427 - val_acc: 0.6769
Epoch 2/10
 - 12s - loss: 0.6384 - acc: 0.6619 - val_loss: 0.6494 - val_acc: 0.6769
Epoch 3/10
 - 11s - loss: 0.6117 - acc: 0.6912 - val_loss: 0.6519 - val_acc: 0.6769
Epoch 4/10
 - 11s - loss: 0.6513 - acc: 0.6702 - val_loss: 0.6402 - val_acc: 0.6769
Epoch 5/10
 - 11s - loss: 0.6270 - acc: 0.6833 - val_loss: 0.6443 - val_acc: 0.6769
Epoch 6/10
 - 11s - loss: 0.6646 - acc: 0.6597 - val_loss: 0.6435 - val_acc: 0.6769
Epoch 7/10
 - 11s - loss: 0.6502 - acc: 0.6527 - val_loss: 0.6486 - val_acc: 0.6769
Epoch 8/10
 - 11s - loss: 0.6539 - acc: 0.6527 - val_loss: 0.6535 - val_acc: 0.6769
Epoch 9/10
 - 11s - loss: 0.6234 - acc: 0.6833 - val_loss: 0.6457 - val_acc: 0.6769
Epoch 10/10
 - 11s - loss: 0.6285 - acc: 0.6964 - val_loss: 0.6439 - val_acc: 0.6769
In [38]:
cnn_metrics = cnn_output.history
vis.metrics(cnn_metrics)
Out[38]:

Transfer Learning

In [16]:
from keras.applications import ResNet50
from keras.models import Model
from keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten
In [17]:
# ?ResNet50
In [18]:
conv_base = ResNet50(include_top = False, weights = "imagenet", 
                     input_shape=(224, 224, 3), pooling="avg")
In [19]:
for layer in conv_base.layers:
    layer.trainable = False
In [46]:
# conv_base.summary()
In [20]:
x = conv_base.output
x = Dense(512, activation="relu")(x)
x = Dropout(0.25)(x)
x = Dense(128, activation="relu")(x)
x = Dropout(0.25)(x)
predictions = Dense(2, activation="sigmoid")(x)
In [21]:
m = Model(inputs=conv_base.input, outputs=predictions)
In [22]:
# m.summary()
In [23]:
m.compile(loss='binary_crossentropy', optimizer="sgd", metrics=["accuracy"])
In [24]:
train_generator = data.flow(x=train_X, y = train_y, shuffle=True)
test_generator = data.flow(x=test_X, y=test_y, shuffle=True)
In [27]:
m_output = m.fit_generator(train_generator, epochs=1,
                           steps_per_epoch = 230//8,
                           validation_data = test_generator,
                           validation_steps = 60//8,
                           verbose=1)
Epoch 1/1
28/28 [==============================] - 563s 20s/step - loss: 0.6302 - acc: 0.6839 - val_loss: 0.6330 - val_acc: 0.6790
In [28]:
m_metrics = m_output.history
vis.metrics(m_metrics)
Out[28]: