#!mkdir data
#!wget http://bit.do/dosa-data -O data/dosa-data.zip
#!cd data && unzip dosa-data.zip
import numpy as np
import pandas as pd
import keras
import matplotlib.pyplot as plt
%matplotlib inline
import vis
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")
plt.imshow(train_X[1])
train_X.shape
from keras.preprocessing.image import ImageDataGenerator, \
load_img, img_to_array
image = train_X[1]
plt.imshow(image)
# ?ImageDataGenerator
datagen = ImageDataGenerator( height_shift_range=0.6,
width_shift_range=0.6,
rotation_range=45,
)
vis.show_single_image_gen(datagen, image, 10)
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,
)
train_generator = data.flow(x=train_X, y = train_y, shuffle=True)
test_generator = data.flow(x=test_X, y=test_y, shuffle=True)
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten
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"))
cnn.summary()
cnn.compile(loss="binary_crossentropy", optimizer="sgd", metrics=["accuracy"])
cnn_output = cnn.fit_generator(train_generator, epochs = 10,
validation_data=test_generator, verbose=2)
cnn_metrics = cnn_output.history
vis.metrics(cnn_metrics)
from keras.applications import ResNet50
from keras.models import Model
from keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten
# ?ResNet50
conv_base = ResNet50(include_top = False, weights = "imagenet",
input_shape=(224, 224, 3), pooling="avg")
for layer in conv_base.layers:
layer.trainable = False
# conv_base.summary()
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)
m = Model(inputs=conv_base.input, outputs=predictions)
# m.summary()
m.compile(loss='binary_crossentropy', optimizer="sgd", metrics=["accuracy"])
train_generator = data.flow(x=train_X, y = train_y, shuffle=True)
test_generator = data.flow(x=test_X, y=test_y, shuffle=True)
m_output = m.fit_generator(train_generator, epochs=1,
steps_per_epoch = 230//8,
validation_data = test_generator,
validation_steps = 60//8,
verbose=1)
m_metrics = m_output.history
vis.metrics(m_metrics)