From 460f2847fec829767cfed8d9da8c372faae89294 Mon Sep 17 00:00:00 2001
From: hajer627 <hajer.bettaieb@ensi-uma.tn>
Date: Thu, 9 Nov 2023 22:42:04 +0100
Subject: [PATCH] Image Classification

---
 .gitignore               | 161 ++++++++++++++++++++++++++++++++++++++
 knn.py                   |  58 ++++++++++++++
 mlp.py                   | 163 +++++++++++++++++++++++++++++++++++++++
 read_cifar.py            |  72 +++++++++++++++++
 results.png              | Bin 0 -> 2396 bytes
 results/Accuracy.png     | Bin 0 -> 33158 bytes
 results/mlp.png          | Bin 0 -> 17621 bytes
 tests/test_knn.py        |  14 ++++
 tests/test_mlp.py        |  47 +++++++++++
 tests/test_read_cifar.py |  20 +++++
 10 files changed, 535 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 knn.py
 create mode 100644 mlp.py
 create mode 100644 read_cifar.py
 create mode 100644 results.png
 create mode 100644 results/Accuracy.png
 create mode 100644 results/mlp.png
 create mode 100644 tests/test_knn.py
 create mode 100644 tests/test_mlp.py
 create mode 100644 tests/test_read_cifar.py

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..708bba6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,161 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+data
\ No newline at end of file
diff --git a/knn.py b/knn.py
new file mode 100644
index 0000000..6014d05
--- /dev/null
+++ b/knn.py
@@ -0,0 +1,58 @@
+import numpy as np
+from read_cifar import *
+from matplotlib import pyplot as plt
+
+def distance_matrix(mat1, mat2):
+    
+    norm1 = np.sum(mat1**2, axis=1, keepdims=True)
+    norm2 = np.sum(mat2**2, axis=1, keepdims=True)
+    dot_products = np.dot(mat1, mat2.T)
+    dists = np.sqrt(norm1 - 2 * dot_products + norm2.T)
+
+    return dists
+
+
+def knn_predict(dists, labels_train, k):
+    
+    
+    predicted_labels = np.zeros(dists.shape[0], dtype=int)
+    
+    for i in range(0,dists.shape[0],1):
+        nearest_indices = np.argsort(dists[i])[:k]
+        nearest_labels=[labels_train[i] for i in nearest_indices]    
+        predicted_class=max(nearest_labels,key=nearest_labels.count)                  
+        predicted_labels[i]=predicted_class  
+    
+    return predicted_labels
+
+def evaluate_knn(data_train, labels_train, data_test, labels_test, k):
+   
+    dists=distance_matrix(data_train,data_test)
+    predicted_labels=knn_predict(dists,labels_train,k)
+    accuracy = (np.sum(predicted_labels == labels_test)) / len(labels_test)
+
+    return accuracy
+
+
+
+def acc_graph():
+  
+  axis=[]
+  result=[]
+  data_path = r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py"
+  allData,allLabels = read_cifar(data_path)
+  data_train,labels_train, data_test,labels_test = split_dataset(allData,allLabels, split=0.9) 
+  
+  for i in range(1,20,1):
+    axis.append(i)
+    acc=evaluate_knn(data_train,labels_train, data_test,labels_test,i)             
+    result.append(acc)
+  plt.plot(axis,result)
+  plt.title("the variation of the accuracy as a function of k")
+  plt.xlabel("Number of neighbors")
+  plt.ylabel("Accuracy")
+  plt.show()
+  plt.savefig(r"C:\Intel\Desktop\DeepLearning\image-classification\results")
+    
+if __name__ == "__main__":
+  acc_graph()
diff --git a/mlp.py b/mlp.py
new file mode 100644
index 0000000..65e7216
--- /dev/null
+++ b/mlp.py
@@ -0,0 +1,163 @@
+from read_cifar import *
+from matplotlib import pyplot as plt
+
+
+def segmoid(x):
+  return  1/(1 + np.exp(-x))
+
+def deriv_segmoid(x):
+  return segmoid(x)*(1-segmoid(x))
+
+def softmax(x):
+  e_x = np.exp(x) 
+  return e_x / e_x.sum(axis=1, keepdims=True)
+
+def learn_once_mse(w1,b1,w2,b2,data,targets,learning_rate):
+    
+    a0=data
+    a1=segmoid(np.matmul(a0, w1) + b1)
+    a2=segmoid(np.matmul(a1,w2) + b2) #The predicted classes
+
+    #Calculate the different partial derivatives
+    dc_da2=2*(a2-targets)
+    dc_dz2=np.multiply(np.multiply(a2,(1-a2)),dc_da2)
+    dc_dw2=np.matmul(a1.T,dc_dz2)
+    dc_db2=dc_dz2
+
+    dc_da1=np.matmul(dc_dz2,w2.T)
+    dc_dz1=np.multiply(np.multiply(a1,(1-a1)),dc_da1)
+    dc_dw1=np.matmul(a0.T,dc_dz1)
+    dc_db1=dc_dz1
+
+    #application of the backpropagation of the gradient
+    w1=w1-learning_rate*dc_dw1
+    w2=w2-learning_rate*dc_dw2
+    b1=b1-learning_rate*dc_db1
+    b2=b2-learning_rate*dc_db2
+
+    # Forward pass
+    z1 = np.matmul(a0, w1) + b1   
+    a1 = segmoid(z1)              
+    z2 = np.matmul(a1, w2) + b2   
+    a2 = segmoid(z2)              
+    predictions = a2              
+
+    # Compute loss (MSE)
+    loss = np.mean(np.square(predictions - targets))
+
+    return (w1,b1,w2,b2,loss)
+
+def one_hot(NDarray):
+  
+  result = np.zeros((NDarray.shape[0],int(np.max(NDarray)+1)))
+  for i in range(0,NDarray.shape[0],1):
+    result[i,int(NDarray[i])]=1
+  return result
+
+
+def cross_entropy(classes,prob):
+  loss=-np.sum(np.multiply(classes,np.log(prob)))
+  return loss/float(prob.shape[0])
+
+
+def learn_once_cross_entropy(w1,b1,w2,b2,data,labels_train,learning_rate):
+  
+  a0=data                            
+  labels_train=one_hot(labels_train)           
+  a1=segmoid(np.matmul(a0, w1) + b1) 
+  a2=softmax(np.matmul(a1,w2) + b2)  
+  nb_rows=data.shape[0]
+
+  #gradient descent optimization
+  
+  dc_dz2=(a2-labels_train)/data.shape[0]
+  dc_dw2=np.matmul(a1.T,dc_dz2)
+  dc_db2=np.dot(np.ones(nb_rows),dc_dz2) 
+
+  dc_da1=np.matmul(dc_dz2,w2.T)
+  dc_dz1=np.multiply(np.multiply(a1,(1-a1)),dc_da1)
+  dc_dw1=np.matmul(a0.T,dc_dz1)
+  dc_db1= np.dot(np.ones(nb_rows),dc_dz1) 
+
+  #application of the backpropagation of the gradient
+  w1=w1-learning_rate*dc_dw1
+  w2=w2-learning_rate*dc_dw2
+  b1=b1-learning_rate*dc_db1
+  b2=b2-learning_rate*dc_db2
+
+
+  # Forward pass
+  z1 = np.matmul(a0, w1) + b1       
+  a1 = segmoid(z1)                  
+  z2 = np.matmul(a1, w2) + b2       
+  a2 = softmax(z2)                  
+  # Compute loss (Cross entropy loss)
+  loss = cross_entropy(labels_train,a2)
+  return (w1,b1,w2,b2,loss)
+
+def train_mlp(w1,b1,w2,b2,data_train,labels_train,learning_rate,num_epoch):
+
+  train_accuracies=[]   
+  for i in range(0,num_epoch,1):
+    (w1,b1,w2,b2,loss)=learn_once_cross_entropy(w1,b1,w2,b2,data_train,labels_train,learning_rate)
+    
+    a0=data_train                              
+    z1 = np.matmul(a0, w1) + b1                
+    a1 = segmoid(z1)                           
+    z2 = np.matmul(a1, w2) + b2                
+    a2 = softmax(z2)                           
+    predict = np.argmax(a2,axis=1)         
+
+    train_accuracies.append((np.sum(predict == labels_train)/predict.shape[0])*100)
+
+  return (w1,w2,b1,b2,train_accuracies)
+
+def test_mlp(w1,b1,w2,b2,data_test,labels_test):
+  
+  a0=data_test
+  z1 = np.matmul(a0, w1) + b1  
+  a1 = segmoid(z1)  
+  z2 = np.matmul(a1, w2) + b2  
+  a2 = softmax(z2) 
+  predict = np.argmax(a2,axis=1)  
+  return (np.sum(predict == labels_test)/predict.shape[0])*100
+
+def run_mlp_training(data_train, labels_train, data_test, labels_test,d_h,learning_rate ,num_epoch ):
+
+  d_in = data_train.shape[1]              
+  d_out = 10                               
+  w1 = 2 * np.random.rand(d_in, d_h) - 1  
+  b1 = np.zeros((1, d_h))                 
+  w2 = 2 * np.random.rand(d_h, d_out) - 1 
+  b2 = np.zeros((1, d_out))               
+
+
+  (w1,w2,b1,b2,train_accuracies)=train_mlp(w1,b1,w2,b2,data_train,labels_train,learning_rate,num_epoch)
+  
+  test_acc=test_mlp(w1,b1,w2,b2,data_test,labels_test)
+
+  return (train_accuracies,test_acc)
+
+
+if __name__ == "__main__":
+      
+  dir_batches =  r'C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py'
+  (data,labels)=read_cifar(dir_batches)
+  (data_train, labels_train, data_test, labels_test)=split_dataset(data,labels,0.9)
+  
+  d_in = data_train.shape[1]              
+  d_out = 10  
+
+  w1 = 2 * np.random.rand(d_in, 64) - 1  
+  b1 = np.zeros((1, 64))  
+  w2 = 2 * np.random.rand(64, d_out) - 1  
+  b2 = np.zeros((1, d_out))  
+  acc=train_mlp(w1,b1,w2,b2,data_train,labels_train,0.1,100)[4]
+  epochs =[i+1 for i in range(0,100,1)]
+  
+  plt.plot(epochs,acc)
+  plt.title("the evolution of learning accuracy across learning epochs")
+  plt.xlabel("epochs")
+  plt.ylabel("Accuracy")
+  plt.show()
+  plt.savefig(r"C:\Intel\Desktop\DeepLearning\image-classification\results")
\ No newline at end of file
diff --git a/read_cifar.py b/read_cifar.py
new file mode 100644
index 0000000..0243ae2
--- /dev/null
+++ b/read_cifar.py
@@ -0,0 +1,72 @@
+import os
+import numpy as np
+import pickle
+
+
+def unpickle(path):
+ 
+  with open(path, 'rb') as fo:
+    dict = pickle.load(fo, encoding='bytes')
+  return dict
+
+def read_cifar_batch(path):
+
+    batch_data = unpickle(path)
+    data = batch_data[b'data']
+    labels = batch_data[b'labels']
+    data = np.array(data, dtype=np.float32)
+    labels = np.array(labels, dtype=np.int64)
+
+    return data, labels
+
+def read_cifar(path):
+    file_list = os.listdir(path)
+    unwanted_files = ['data_batch_1', 'batches.meta', 'readme.html']
+    #initilize the Matrix data and labels with the data of the first batch
+    (Matrix_Data, allLabels) = read_cifar_batch(os.path.join(path, 'data_batch_1'))
+    file_list.remove('data_batch_1')
+    for i in file_list:
+        if i not in unwanted_files:
+            (data, labels) = read_cifar_batch(os.path.join(path, i))
+            Matrix_Data = np.concatenate((Matrix_Data, data), axis=0)
+            allLabels = np.concatenate((allLabels, labels), axis=0)
+
+    return (Matrix_Data, allLabels)
+
+
+def split_dataset(data, labels, split):
+    if split < 0 or split > 1:
+        raise ValueError("The 'split' factor is a float between 0 and 1")
+
+    # Determine the split indices
+    split_idx = int(len(data) * split)
+
+    # Shuffle the data and labels using the same random order
+    shuffled_indices = np.random.permutation(len(data))
+    data_shuffled = data[shuffled_indices]
+    labels_shuffled = labels[shuffled_indices]
+
+    # Split the data and labels into training and test sets
+    data_train = data_shuffled[:split_idx]
+    labels_train = labels_shuffled[:split_idx]
+    data_test = data_shuffled[split_idx:]
+    labels_test = labels_shuffled[split_idx:]
+
+    return data_train, labels_train, data_test, labels_test
+
+
+
+
+if __name__ == "__main__":
+    
+   batch_path = r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py\data_batch_1"
+   data_path = r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py"
+   data, labels = read_cifar_batch(batch_path)
+   allData,allLabels = read_cifar(data_path)
+   print("Data shape:", data.shape)
+   print("Labels shape:", labels.shape)
+   data_train,labels_train, data_test,labels_test = split_dataset(allData,allLabels, split=0.9)
+   print("Data_train:", data_train)
+   print("Labels_train:", labels_train)
+   print("Data_test:", data_test)
+   print("Labels_test:", labels_test)
\ No newline at end of file
diff --git a/results.png b/results.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc7eff72c4c83e0eb2e6492ce71903a251b16a6e
GIT binary patch
literal 2396
zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A#=yW}dhyN^1_lPp64!{5;QX|b^2DN4
z2H(Vzf}H%4oXjMJvecsD%=|oKJ##$+9fgdNl7eC@ef?ax0=@jAbbTA~bpi|w44efX
zk;M!Q{D~mUxWayUCIbV<NlzEYkcv5PuNg8jDDWIGII#cuL#948uBx*0XLJ}CjLyAh
zU|_gs)WE=C$R@y`aEyV8;fRC-LxTh}2ZKN|10zEcj{<{34<idhhvBHA(I6O21)~{Z
ov@94c4o7Q*(Mpl7?E*cuO7=a=mv2g9U|?YIboFyt=akR{08A*JW&i*H

literal 0
HcmV?d00001

diff --git a/results/Accuracy.png b/results/Accuracy.png
new file mode 100644
index 0000000000000000000000000000000000000000..80049b7a4aabf69223690b38f733c8338e6dcdf6
GIT binary patch
literal 33158
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

literal 0
HcmV?d00001

diff --git a/results/mlp.png b/results/mlp.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c4a7f84e98eb288bb64a6d9f2211062f8f2460d
GIT binary patch
literal 17621
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

literal 0
HcmV?d00001

diff --git a/tests/test_knn.py b/tests/test_knn.py
new file mode 100644
index 0000000..4de68bb
--- /dev/null
+++ b/tests/test_knn.py
@@ -0,0 +1,14 @@
+import numpy as np
+from knn import distance_matrix
+from knn import knn_predict
+from knn import evaluate_knn
+from read_cifar import read_cifar_batch
+                            
+(data,labels)=read_cifar_batch(r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py\data_batch_1")                                
+(data_test,labels_test)=read_cifar_batch(r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py\test_batch")
+
+#Unittest
+
+assert distance_matrix(data,data_test).shape == (data.shape[0],data_test.shape[0]) 
+assert knn_predict(data,labels,2).shape == labels.shape
+assert 0 < evaluate_knn(data,labels,data_test,labels_test,5) < 1
diff --git a/tests/test_mlp.py b/tests/test_mlp.py
new file mode 100644
index 0000000..534e951
--- /dev/null
+++ b/tests/test_mlp.py
@@ -0,0 +1,47 @@
+import numpy as np
+from mlp import *
+
+#testing the MSE Gradient Descent
+N = 30                                              
+d_in = 3                                            
+d_h = 3                                             
+d_out = 2                                           
+w1 = 2 * np.random.rand(d_in, d_h) - 1              
+b1 = np.zeros((1, d_h))                             
+w2 = 2 * np.random.rand(d_h, d_out) - 1             
+b2 = np.zeros((1, d_out))                           
+
+data = np.random.rand(N, d_in)                      
+targets = np.random.rand(N, d_out)                  
+learning_rate=0.5
+
+(w1n,b1n,w2n,b2n,loss)=learn_once_mse(w1,b1,w2,b2,data,targets,learning_rate) 
+assert 0 < loss < 1
+assert w1n.shape==w1.shape
+
+#test the one-hot encoding function
+
+assert ((one_hot(np.array([1,2,0])) == [[0, 1, 0],[0, 0, 1],[1, 0, 0]]).all())==True
+
+#testing the Cross Entropy Gradien descent and the training of the model
+(data,labels)=read_cifar_batch(r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py\data_batch_1") 
+
+N = data.shape[0]                              
+d_in = data.shape[1]                           
+d_h = 64                                       
+d_out = 10                                     
+w1 = 2 * np.random.rand(d_in, d_h) - 1         
+b1 = np.zeros((1, d_h))                        
+w2 = 2 * np.random.rand(d_h, d_out) - 1        
+b2 = np.zeros((1, d_out))                      
+learning_rate=0.1                              
+num_epoch=100                                  
+
+assert 0< learn_once_cross_entropy(w1,b1,w2,b2,data,labels,learning_rate)[4] 
+print(train_mlp(w1,b1,w2,b2,data,labels,learning_rate,num_epoch)[4]) 
+
+#test the model testing function
+
+dir_test =r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py\test_batch"
+(data_test,labels_test)=read_cifar_batch(dir_test)                  
+assert 0< test_mlp(w1,b1,w2,b2,data_test,labels_test) < 100         
diff --git a/tests/test_read_cifar.py b/tests/test_read_cifar.py
new file mode 100644
index 0000000..92c865c
--- /dev/null
+++ b/tests/test_read_cifar.py
@@ -0,0 +1,20 @@
+import numpy as np
+from read_cifar import read_cifar_batch
+from read_cifar import read_cifar
+from read_cifar import split_dataset
+
+batch_path = r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py\data_batch_1"
+data_path = r"C:\Intel\Desktop\DeepLearning\image-classification\data\cifar-10-batches-py"
+(data,labels)=read_cifar_batch(batch_path)
+(alldata,alllabels)=read_cifar(data_path)
+image = np.random.randrange(25000)
+pixel = np.random.randrange(3071)
+
+#Unittest
+
+assert data.shape == (10000,3072) 
+assert labels.shape == (10000,)
+assert alldata.shape == (60000,3072) 
+assert alllabels.shape == (60000,) 
+assert split_dataset(alldata,alllabels,0.5)[0].shape == (30000,3072) 
+assert split_dataset(alldata,alllabels,0.5)[0][image][pixel] != split_dataset(alldata,alllabels,0.5)[0][image][pixel] 
-- 
GitLab