Ex Data, Scientia

Home Contact

Building an AI-based image-classifier application

import pandas as pd
from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator

img_dir = 'MNIST'
train_dir = img_dir + '/Train'
test_dir = img_dir + '/Test'

n_digits = 10

l1 = layers.Input(shape = [27,27,3])
l2 = layers.Conv2D(30, [3,3], activation = 'relu')(l1)
l2a = layers.MaxPool2D([2,2])(l2)
l3 = layers.Conv2D(30, [3,3], activation = 'relu')(l2a)
l4 = layers.Flatten()(l3)
l5 = layers.Dense(300, activation = 'relu')(l4)
l6 = layers.Dense(50, activation = 'relu')(l5)
l7 = layers.Dense(n_digits, activation = 'softmax')(l6)

classifier = models.Model([l1], [l7])

datagen = ImageDataGenerator(rescale=1./255)

train_generator = datagen.flow_from_directory(
        directory = train_dir,
        target_size = [27,27],
        batch_size = 10,
        class_mode = 'categorical')

n_train_imgs = len(train_generator.filenames)

test_generator = datagen.flow_from_directory(
        directory = test_dir,
        target_size = [27,27],
        batch_size = 1,
        class_mode = 'categorical')

n_test_imgs = len(test_generator.filenames)

classifier.compile(
    optimizer = 'Adam',
    loss = 'categorical_crossentropy',
    metrics = ['accuracy'])

history = classifier.fit_generator(
    generator = train_generator,
    steps_per_epoch = int(n_train_imgs / 10),
    validation_data = test_generator,
    validation_steps = n_test_imgs,
    epochs = 5)

classifier.save('MNIST/classifier.h5')

history = pd.DataFrame(history.history)
history.to_csv('MNIST/train_history.csv', index = False)