From 7baefb6f11e79588ceca848ab6fe4f8326b90058 Mon Sep 17 00:00:00 2001 From: oscarchaufour <101994223+oscarchaufour@users.noreply.github.com> Date: Wed, 8 Nov 2023 17:44:29 +0100 Subject: [PATCH] mlp finished + result --- knn.py | 13 +---- mlp.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++- read_cifar.py | 2 +- results/mlp.png | Bin 0 -> 23686 bytes 4 files changed, 132 insertions(+), 15 deletions(-) create mode 100644 results/mlp.png diff --git a/knn.py b/knn.py index 1fd7fa4..4dc7d61 100644 --- a/knn.py +++ b/knn.py @@ -52,18 +52,7 @@ def evaluate_knn(data_train, labels_train, data_test, labels_test, k) : number_total_prediction = labels_test.shape[0] classification_rate = number_true_prediction/number_total_prediction - return classification_rate - -def plot_accuracy(data_train, labels_train, data_test, labels_test, k_max) : - Y = [] - for k in range(1, k_max+1) : - Y += [evaluate_knn(data_train, labels_train, data_test, labels_test, k)] - plt.plot(list(range(1, k_max+1)), Y) - plt.xlabel('k (Number of Neighbors)') - plt.ylabel('Accuracy') - plt.savefig('results/knn.png') - - + return classification_rate if __name__ == "__main__" : t1 = time.time() diff --git a/mlp.py b/mlp.py index 825ce39..3613083 100644 --- a/mlp.py +++ b/mlp.py @@ -6,6 +6,10 @@ Created on Fri Oct 27 16:48:16 2023 """ import numpy as np +import read_cifar +import matplotlib.pyplot as plt +from scipy.special import expit +from tqdm import tqdm def learn_once_mse(w1, b1, w2, b2, data, targets, learning_rate) : @@ -22,9 +26,9 @@ def learn_once_mse(w1, b1, w2, b2, data, targets, learning_rate) : dCdZ2 = dCdA2 * (a2 - a2**2) dCdW2 = np.matmul(a1.T, dCdZ2) dCdB2 = (1/N) * np.sum(dCdZ2, axis=0, keepdims=True) - dCdA1 = np.matmul(dCdZ2, w2.T) + dCdA1 = (1/N) * np.matmul(dCdZ2, w2.T) dCdZ1 = dCdA1 * (a1 - a1**2) - dCdW1 = np.matmul(a0.T, dCdZ1) + dCdW1 = (1/N) * np.matmul(a0.T, dCdZ1) dCdB1 = (1/N) * np.sum(dCdZ1, axis=0, keepdims=True) # one gradient descent step @@ -33,8 +37,132 @@ def learn_once_mse(w1, b1, w2, b2, data, targets, learning_rate) : w2 -= dCdW2 * learning_rate b2 -= dCdB2 * learning_rate + # new a2 calculation + z1 = np.matmul(a0, w1) + b1 # input of the hidden layer + a1 = 1 / (1 + np.exp(-z1)) # output of the hidden layer (sigmoid activation function) + z2 = np.matmul(a1, w2) + b2 # input of the output layer + a2 = 1 / (1 + np.exp(-z2)) # output of the output layer (sigmoid activation function) + predictions = a2 + loss = np.mean(np.square(predictions - targets)) return w1, b1, w2, b2, loss + +def one_hot(labels) : + D = len(labels) + L = max(labels) # labels is an int array + one_hot_matrix = np.zeros((D, L+1)) + for k in range(len(labels)) : + label = labels[k] + one_hot_matrix[k, label] = 1 + return one_hot_matrix + +def softmax(x): + e_x = np.exp(x - np.max(x)) # Soustraction du max pour éviter les problèmes de stabilité numérique + return e_x / e_x.sum() + + +def learn_once_cross_entropy(w1, b1, w2, b2, data, labels_train, learning_rate) : + y = one_hot(labels_train) + + a0 = data # the data are the input of the first layer + z1 = np.matmul(a0, w1) + b1 # input of the hidden layer + a1 = expit(z1) # output of the hidden layer (sigmoid activation function) + z2 = np.matmul(a1, w2) + b2 # input of the output layer + a2 = expit(z2) + + #computing the softmax predictions and loss + predictions = softmax(a2) + loss = -np.sum(y*np.log(predictions))/(float(predictions.shape[0]))#cross entropy loss + + predictions = a2 # the predicted values are the outputs of the output layer + N = data.shape[0] + + # calculation of partial derivates of C + dCdZ2 = a2 - y + dCdW2 = (1/N) * np.matmul(a1.T, dCdZ2) + dCdB2 = (1/N) * np.sum(dCdZ2, keepdims=True) + dCdA1 = np.matmul(dCdZ2, w2.T) + dCdZ1 = dCdA1 * (a1 - np.square(a1)) + dCdW1 = (1/N) * np.matmul(a0.T, dCdZ1) + dCdB1 = (1/N) * np.sum(dCdZ1, keepdims=True) + + # one gradient descent step + w1 -= dCdW1 * learning_rate + b1 -= dCdB1 * learning_rate + w2 -= dCdW2 * learning_rate + b2 -= dCdB2 * learning_rate + + # accuracy calculation + predictions_vect = np.argmax(predictions, axis=1) + number_true_prediction = np.sum(labels_train == predictions_vect) + number_total_prediction = labels_train.shape[0] + accuracy = number_true_prediction/number_total_prediction + + return w1, b1, w2, b2, accuracy + +def train_mlp(w1, b1, w2, b2, data, labels_train, learning_rate, num_epoch) : + train_accuracies = [] + for k in tqdm(range(num_epoch)) : + w1, b1, w2, b2, accuracy = learn_once_cross_entropy(w1, b1, w2, b2, data, labels_train, learning_rate) + train_accuracies.append(accuracy) + + return w1, b1, w2, b2, train_accuracies + + +def test_mlp(w1, b1, w2, b2, data_test, labels_test) : + # prediction calculation + a0 = data_test + z1 = np.matmul(a0, w1) + b1 # input of the hidden layer + a1 = expit(z1) # output of the hidden layer (sigmoid activation function) + z2 = np.matmul(a1, w2) + b2 # input of the output layer + a2 = np.exp(z2) / np.sum(np.exp(z2)) # output of the output layer (sigmoid activation function) + predictions = a2 + predictions_vect = np.argmax(predictions, axis=1) + + # accuracy calculation + number_true_prediction = np.sum(labels_test == predictions_vect) + number_total_prediction = len(labels_test) + test_accuracy = number_true_prediction/number_total_prediction + + return test_accuracy + + +def run_mlp_training(data_train, labels_train, data_test, labels_test, d_h, learning_rate, num_epoch) : + d_out = np.max(labels_train) + 1 # output dimension (number of neurons of the output layer + d_in = data_train.shape[1] + # Random initialization of the network weights and biaises + w1 = 2 * np.random.rand(d_in, d_h) - 1 # first layer weights + b1 = np.zeros((1, d_h)) # first layer biaises + w2 = 2 * np.random.rand(d_h, d_out) - 1 # second layer weights + b2 = np.zeros((1, d_out)) # second layer biaises + + w1, b1, w2, b2, train_accuracies = train_mlp(w1, b1, w2, b2, data_train, labels_train, learning_rate, num_epoch) + test_accuracy = test_mlp(w1, b1, w2, b2, data_test, labels_test) + return train_accuracies, test_accuracy + +if __name__ == "__main__" : + # open, read and split the data using read_cifar script + file = "./data/cifar-10-python/" + data, labels = read_cifar.read_cifar(file) + data_train, labels_train, data_test, labels_test = read_cifar.split_dataset(data, labels, 0.9) + + # train the MLP + d_h=64 + learning_rate=0.1 + num_epoch=100 + + train_accuracies, test_accuracy = run_mlp_training(data_train, labels_train, data_test, labels_test, d_h, learning_rate, num_epoch) + + # Plot the figure + plt.figure(figsize = (12,8)) + plt.plot(np.array(train_accuracies)*100, color='r', label='split factor : 0.9') + plt.title("Multilayer Perceptron training accuracy") + plt.legend() + plt.xlabel('number of epochs (num_epoch)') + plt.ylabel('accuracy (%)') + plt.show() + plt.savefig('results/mlp.png') + \ No newline at end of file diff --git a/read_cifar.py b/read_cifar.py index f25324d..3cc5db3 100644 --- a/read_cifar.py +++ b/read_cifar.py @@ -24,7 +24,7 @@ def read_cifar (batch_dir) : data_batches = [] label_batches = [] - for i in range(1,4) : + for i in range(1,6) : batch_filename = f'data_batch_{i}' batch_path = os.path.join(batch_dir, batch_filename) data, labels = read_cifar_batch(batch_path) diff --git a/results/mlp.png b/results/mlp.png new file mode 100644 index 0000000000000000000000000000000000000000..0615c2f516317665bcec9b40c91015ff8a58715c GIT binary patch literal 23686 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�rHduvzO+gaDvMuQequPl9i?bf#3+1lAGM)Os@ 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 V3uj3!JH`MyxyIGcWt~$(696RkIX3_R literal 0 HcmV?d00001 -- GitLab