Skip to main content

Examples

  • Image Classifier

Import Libraries

import numpy as np
import random
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten

Download Dataset

1000 images of cat and 1000 images of dog

pip install gdown
import gdown

files = {'labels.csv': 'https://drive.google.com/uc?id=1Zy3y6wBLZTI67BZhXzwQtgWJ8m50Oggl',
'labels_test.csv': 'https://drive.google.com/uc?id=1cGDczlanBC59TbpNIe8_s0-yUtIrmnwm',
'input.csv': 'https://drive.google.com/uc?id=1jQ16W4DJG1ZfJ_R7V_9cQIALwN3lruE5',
'input_test.csv': 'https://drive.google.com/uc?id=1JHblwM88w4g70lZwiLDf6qPz8t0wZnd6',}


for output, url in files.items():
print(url, output)
gdown.download(url, output, quiet=False)

Load Dataset

X_train = np.loadtxt('input.csv', delimiter = ',')
Y_train = np.loadtxt('labels.csv', delimiter = ',')

X_test = np.loadtxt('input_test.csv', delimiter = ',')
Y_test = np.loadtxt('labels_test.csv', delimiter = ',')

# reshape
X_train = X_train.reshape(len(X_train), 100, 100, 3)
Y_train = Y_train.reshape(len(Y_train), 1)

X_test = X_test.reshape(len(X_test), 100, 100, 3)
Y_test = Y_test.reshape(len(Y_test), 1)

# normalize
X_train = X_train/255.0
X_test = X_test/255.0

print("Shape of X_train: ", X_train.shape)
print("Shape of Y_train: ", Y_train.shape)
print("Shape of X_test: ", X_test.shape)
print("Shape of Y_test: ", Y_test.shape)
idx = random.randint(0, len(X_test))
plt.imshow(X_test[idx, :])
plt.show()

idx = random.randint(0, len(X_train))
plt.imshow(X_train[idx, :])
plt.show()

Create model

model = Sequential([
Conv2D(32, (3,3), activation = 'relu', input_shape = (100, 100, 3)),
MaxPooling2D((2,2)),

Conv2D(32, (3,3), activation = 'relu'),
MaxPooling2D((2,2)),

Flatten(),
Dense(64, activation = 'relu'),
Dense(1, activation = 'sigmoid')
])

or

model = Sequential()

model.add(Conv2D(32, (3,3), activation = 'relu', input_shape = (100, 100, 3)))
model.add(MaxPooling2D((2,2)))

model.add(Conv2D(32, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))

model.add(Flatten())
model.add(Dense(64, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))

Compile model so that model can resume

Adding cost function, and backpropogation

model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

if need to use stochastic gradient descent instead of adam, this is used if we want to change the learning rate

opt = keras.optimizers.SGD(learning_rate = 0.001)
model.compile(loss = 'binary_crossentropy', optimizer = opt, metrics = ['accuracy'])

Train

model.fit(X_train, Y_train, epochs = 5, batch_size = 64)

Evaluate

model.evaluate(X_test, Y_test)

Inference / Making predictions

idx2 = random.randint(0, len(Y_test))
plt.imshow(X_test[idx2, :])
plt.show()

y_pred = model.predict(X_test[idx2, :].reshape(1, 100, 100, 3))
cat_dog_pred = y_pred > 0.5

if(cat_dog_pred == 0):
pred = 'dog'
else:
pred = 'cat'

print("Our model says it is a :", pred, y_pred)

value y_pred gives a probabilistic value, close to 0 means it's 1st class i.e. dog, and close to 1 means it's 2nd class i.e. cat.

Cat vs Dog Classifier