import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import time
import tensorflow as tf
import tensorflow.keras as K
tf.__version__
K.__version__ # tf means Tensorflow Backend
data = K.datasets.fashion_mnist
(train_images, train_labels), (val_images, val_labels) = data.load_data()
train_images[0].shape
img_size = train_images[0].shape[0]
print(img_size)
Numpy - Tranpose, Reshape, Resize
train_images.shape, train_labels.shape
val_images.shape, val_labels.shape
class_names = [
'T-Shirt/Top',
'Trousers',
'Pullover',
'Dress',
'Coat',
'Sandal',
'Shirt',
'Sneaker',
'Bag',
'Ankle Boot'
]
num_classes = len(class_names)
horiz = 5; vert = 3; area = vert*horiz;
fig = plt.figure(figsize=(12,8))
for i in range(area):
ax = plt.subplot(vert,horiz,i+1)
ax.set_title(class_names[train_labels[i]])
ax.imshow(train_images[i])#, cmap=plt.cm.binary)n
train_images = train_images / 255.0
val_images = val_images / 255.0
reshaped_train = train_images[:2500].reshape(2500, img_size*img_size)
reshaped_val = val_images[:2500].reshape(2500, img_size*img_size)
reshaped_train.shape, reshaped_val.shape
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(reshaped_train, train_labels[:2500])
log_reg.score(reshaped_val, val_labels[:2500])
model = K.Sequential([
K.layers.Flatten(input_shape=(img_size, img_size)), # Flattens 28 x 28 Image into 784
K.layers.Dense(32, activation='relu'),
K.layers.Dense(16, activation='relu'),
K.layers.Dense(num_classes, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=32)
model.evaluate(val_images, val_labels) # ADAM
model.predict([[val_images[0]]])
fig = plt.figure(figsize=(15,7))
for i in range(10):
ax = plt.subplot(2,5,i+1)
ax.imshow(val_images[i], cmap=plt.cm.binary)
ax.set_title('Actual: {}'.format(class_names[val_labels[i]]))
ax.set_xlabel('Predicted: {}'.format(class_names[np.argmax(model.predict([[val_images[i]]]))]))
PyTorch's Convolutional Layer in contrast, takes in (B, C, Sv, Sh)
conv_train_images = train_images.reshape(train_images.shape[0], img_size, img_size, 1)
conv_val_images = val_images.reshape(val_images.shape[0], img_size, img_size, 1)
conv_train_images.shape, conv_val_images.shape
conv_model = K.Sequential([
K.layers.Conv2D(8, (3,3), padding='same', activation='relu'),
K.layers.MaxPooling2D(pool_size=(2,2)),
K.layers.Conv2D(8, (3,3), padding='same', activation='relu'),
K.layers.MaxPooling2D(pool_size=(2,2)),
K.layers.Flatten(),
K.layers.Dense(16, activation='relu'),
K.layers.Dense(8, activation='relu'),
K.layers.Dense(num_classes, activation='softmax')
])
conv_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
conv_model.fit(conv_train_images, train_labels, epochs=5)
conv_model.evaluate(conv_val_images, val_labels)
fig = plt.figure(figsize=(15,7))
for i in range(10):
ax = plt.subplot(2,5,i+1)
ax.imshow(val_images[i], cmap=plt.cm.binary)
ax.set_title('Actual: {}'.format(class_names[val_labels[i]]))
ax.set_xlabel('Predicted: {}'.format(class_names[np.argmax(conv_model.predict([[conv_val_images[i]]]))]))
model.summary()
conv_model.summary()
Can't calculate later layers before earlier layers are done, thus not too much difference between CPU and GPU
But intra-layer, each node can be calculated simultaneously, thus GPUs show advantage in parallelized computations with larger bandwidths, especially for Convolutional Layers where the same set of (3x3) Parameters are used to multiply on each set of (3x3) Pixels.
from tensorflow.keras.datasets import cifar10
data = cifar10.load_data() # ~170 Megabytes of 60,000 Images in 32 x 32 x 3
(X_train, Y_train), (X_val, Y_val) = data
X_train.shape, Y_train.shape, X_val.shape, Y_val.shape
img_size = X_train.shape[1]
num_channels = X_train.shape[3]
class_names = [
'airplane',
'automobile',
'bird',
'cat',
'deer',
'dog',
'frog',
'horse',
'ship',
'truck'
]
num_classes = len(class_names)
fig = plt.figure(figsize=(15,8))
for i, image in enumerate(X_train[:10]):
ax = plt.subplot(2, 5, i+1)
ax.imshow(image)
ax.set_title('Actual: {}'.format(class_names[Y_train[i][0]]))
X_train = X_train / 255.
X_val = X_val / 255.
X_train.shape
conv_model = K.Sequential([
K.layers.Conv2D(32, (3,3), padding='same', activation='relu', input_shape=(32,32,3,)),
K.layers.MaxPooling2D(pool_size=(2,2)),
K.layers.Conv2D(16, (3,3), padding='same', activation='relu'),
K.layers.MaxPooling2D(pool_size=(2,2)),
K.layers.Conv2D(8, (3,3), padding='same', activation='relu'),
K.layers.MaxPooling2D(pool_size=(2,2)),
K.layers.Flatten(),
K.layers.Dense(32, activation='relu'),
K.layers.Dense(num_classes, activation='softmax')
])
conv_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
conv_model.fit(X_train, Y_train, epochs=2, batch_size=32)
# Epoch 3
conv_model.fit(X_train, Y_train, epochs=1, batch_size=32, verbose=0) # You can play around with the different arguments
# Verbose 0 means Silent (Nothing printed out)
# Epoch 4
conv_model.fit(X_train, Y_train, epochs=1, batch_size=32, verbose=2) # You can play around with the different arguments
# Verbose 2 means no Progress Bar (Default is Verbose 1, with Progress Bar)
# Epoch 5
conv_model.fit(X_train, Y_train, epochs=1, batch_size=32, ) # You can play around with the different arguments
# Verbose 2 means no Progress Bar (Default is Verbose 1, with Progress Bar)
conv_model.evaluate(X_val, Y_val)
fig = plt.figure(figsize=(15,7))
for i in range(10):
ax = plt.subplot(2,5,i+1)
ax.imshow(X_val[i], cmap=plt.cm.binary)
ax.set_title('Actual: {}'.format(class_names[Y_val[i][0]]))
ax.set_xlabel('Predicted: {}'.format(class_names[np.argmax(conv_model.predict([[X_val[i]]]))]))
conv_model.save('conv_model.h5')
del conv_model
try: print(conv_model)
except: print("NameError: name 'conv_model' is not defined")
conv_model = K.models.load_model('conv_model.h5')
conv_model.evaluate(X_val, Y_val)
import os
from PIL import Image
root = './sources/test_images/'
full_images = []
filenames = [name for name in os.listdir(root)]
for filename in filenames:
img = Image.open(root+filename)
img.load()
full_images.append(np.asarray(img, dtype='int32'))
fig = plt.figure(figsize=(15,8))
for i, image in enumerate(full_images):
ax = plt.subplot(2, 5, i+1)
ax.imshow(image)
ax.set_title('Filename: {}'.format(filenames[i]))
images = []
filenames = [name for name in os.listdir(root)]
root = './sources/test_images/'
for filename in filenames:
img = Image.open(root+filename)
img.load()
img = img.resize(size=(img_size, img_size))
images.append(np.asarray(img, dtype='int32'))
images = np.array(images)
fig = plt.figure(figsize=(15,8))
for i, image in enumerate(images):
ax = plt.subplot(2, 5, i+1)
ax.imshow(image)
ax.set_title('Filename: {}'.format(filenames[i]))
preds = np.argmax(conv_model.predict([images]), 1)
print(preds)
fig = plt.figure(figsize=(15,8))
for i, image in enumerate(full_images):
ax = plt.subplot(2, 5, i+1)
ax.imshow(image)
ax.set_title('Filename: {}'.format(filenames[i]))
ax.set_xlabel('Predicted: {}'.format(class_names[preds[i]]))
Color Augmentation
Cropping
Rotating
Flipping