Commit ac03e9c1 authored by MithilaGunasinghe's avatar MithilaGunasinghe
parents b32b1050 c34f4457
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: GUnasinghe M.D.
"""
# CNN classifier
# Building architecture of our CNN classifier
import keras
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
# Initialising the CNN
classifier = Sequential()
# Step - 1 Convolution
classifier.add(Convolution2D(
16, 3, 3, input_shape=(28, 28, 3), activation='relu'))
# Step - 2 Pooling
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Convolution2D(32, 3, 3, activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))
# Step - 3 Flattening
classifier.add(Flatten())
# Step - 4 Full connection -> First layer input layer then hidden layer
# and last softmax layer
classifier.add(Dense(56, activation='relu', kernel_initializer='uniform'))
classifier.add(Dense(3, activation='softmax', kernel_initializer='uniform'))
# Compiling the CNN
classifier.compile(
optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Image Preprocessing
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)
training_set = train_datagen.flow_from_directory(
'shapes/train', target_size=(28, 28), batch_size=1, class_mode='categorical')
#X_images, y_labels = training_set.filenames, training_set.classes
test_set = test_datagen.flow_from_directory(
'shapes/test', target_size=(28, 28), batch_size=1, class_mode='categorical')
# Logging the training of models
from keras.callbacks import CSVLogger, EarlyStopping
csv_logger = CSVLogger('log.csv', append=True, separator=';')
early_stopping_monitor = EarlyStopping(patience=5)
steps_per_epoch = len(training_set.filenames) # 300
validation_steps = len(test_set.filenames) # 90
model_info = classifier.fit_generator(training_set, steps_per_epoch=steps_per_epoch, epochs=25, validation_data=test_set,
validation_steps=validation_steps, callbacks=[csv_logger, early_stopping_monitor])
classifier.save("drawing_classification.h5")
# plot model history after each epoch
from visulization import plot_model_history
plot_model_history(model_info)
import matplotlib.pyplot as plt
import numpy as np
def plot_model_history(model_history):
fig, axs = plt.subplots(1, 2, figsize=(15, 5))
# summarize history for accuracy
axs[0].plot(range(1, len(model_history.history['acc']) + 1),
model_history.history['acc'])
axs[0].plot(range(1, len(model_history.history['val_acc']) + 1),
model_history.history['val_acc'])
axs[0].set_title('Model Accuracy')
axs[0].set_ylabel('Accuracy')
axs[0].set_xlabel('Epoch')
axs[0].set_xticks(np.arange(1, len(model_history.history[
'acc']) + 1), len(model_history.history['acc']) / 10)
axs[0].legend(['train', 'val'], loc='best')
# summarize history for loss
axs[1].plot(range(1, len(model_history.history['loss']) + 1),
model_history.history['loss'])
axs[1].plot(range(1, len(model_history.history['val_loss']) + 1),
model_history.history['val_loss'])
axs[1].set_title('Model Loss')
axs[1].set_ylabel('Loss')
axs[1].set_xlabel('Epoch')
axs[1].set_xticks(np.arange(1, len(model_history.history[
'loss']) + 1), len(model_history.history['loss']) / 10)
axs[1].legend(['train', 'val'], loc='best')
plt.show()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment