diff --git "a/Coding_Challenge_for_Fatima_Fellowship.html" "b/Coding_Challenge_for_Fatima_Fellowship.html" deleted file mode 100644--- "a/Coding_Challenge_for_Fatima_Fellowship.html" +++ /dev/null @@ -1,15758 +0,0 @@ - - -
- - -Thank you for applying to the Fatima Fellowship. To help us select the Fellows and assess your ability to do machine learning research, we are asking that you complete a short coding challenge. Please pick 1 of these 5 coding challenges, whichever is most aligned with your interests.
-Due date: 1 week
-How to submit: Please make a copy of this colab notebook, add your code and results, and submit your colab notebook to the submission link below. If you have never used a colab notebook, check out this video.
-Submission link: https://airtable.com/shrXy3QKSsO2yALd3
- -Upside down detector: Train a model to detect if images are upside down
-Submission instructions: Please write your code below and include some examples of images that were classified
- -Pick a dataset :
-Preprocessing the dataset :
-Creating the model architecture:
-Training:
-Results:
-That my solution, thank you.
- -import numpy as np
-import tensorflow as tf
-import tensorflow_datasets as tfds
-import matplotlib.pyplot as plt
-from model import OrientationClassifier
-from transforms import *
-from utils import *
-tf.random.set_seed(4)
-(cifar_train,cifar_val, cifar_test),cifar_info = tfds.load('cifar10',split=['train[:80%]','train[80%:]','test'],
- shuffle_files=True,
- as_supervised=True,
- with_info=True,
- )
-
-cifar_train_size = cifar_info.splits['train[:80%]'].num_examples
-cifar_val_size = cifar_info.splits['train[80%:]'].num_examples
-cifar_test_size = cifar_info.splits['test'].num_examples
-print(f"cifar train size : {cifar_train_size} , val : {cifar_val_size} , test : {cifar_test_size}")
-cifar train size : 40000 , val : 10000 , test : 10000 --
(imagenette_train,imagenette_val, imagenette_test),imagenette_info = tfds.load('imagenette/160px-v2',split=['train[:80%]','train[80%:]','validation'],
- shuffle_files=True,
- as_supervised=True,
- with_info=True,
- )
-
-imagenette_train_size = imagenette_info.splits['train[:80%]'].num_examples
-imagenette_val_size = imagenette_info.splits['train[80%:]'].num_examples
-imagenette_test_size = imagenette_info.splits['validation'].num_examples
-print(f"imagenette train size : {imagenette_train_size} , val : {imagenette_val_size} , test : {imagenette_test_size}")
-imagenette train size : 7575 , val : 1894 , test : 3925 --
batch_size = 64
-transforms = [resize,flip,normalize]
-
-cifar_ds_train = prepareData(data=cifar_train,transforms=transforms,batch_size=batch_size,isTrain=True,size=cifar_train_size)
-cifar_ds_val = prepareData(data=cifar_val,transforms=transforms,batch_size=batch_size)
-cifar_ds_test = prepareData(data=cifar_test,transforms=transforms,batch_size=batch_size)
-
-imagenette_ds_train = prepareData(data=imagenette_train,transforms=transforms,batch_size=batch_size,isTrain=True,size=imagenette_train_size)
-imagenette_ds_val = prepareData(data=imagenette_val,transforms=transforms,batch_size=batch_size)
-imagenette_ds_test = prepareData(data=imagenette_test,transforms=transforms,batch_size=batch_size)
-
-data = {"cifar_train":cifar_ds_train,"cifar_val":cifar_ds_val,"cifar_test":cifar_ds_test,
- "imagenette_train":imagenette_ds_train,"imagenette_val":imagenette_ds_val,"imagenette_test":imagenette_ds_test}
-data = (cifar_ds_train,cifar_ds_val)
-epochs = 10
-lr = 0.001
-input_shape = (100,100,3)
-model_params = (input_shape,256,1,True)
-
-optimizer = tf.keras.optimizers.Adam(learning_rate=lr)
-loss = tf.keras.losses.BinaryCrossentropy()
-hist = train(data,OrientationClassifier,model_params,optimizer,loss,epochs,
- modelName = "CifarOrientationClassifier32",runs=1)
-######## run 1 ########## -Epoch 1/10 -625/625 [==============================] - 158s 232ms/step - loss: 0.4377 - accuracy: 0.7849 - val_loss: 0.8325 - val_accuracy: 0.5386 -Epoch 2/10 -625/625 [==============================] - 147s 232ms/step - loss: 0.3046 - accuracy: 0.8652 - val_loss: 0.3299 - val_accuracy: 0.8461 -Epoch 3/10 -625/625 [==============================] - 147s 233ms/step - loss: 0.2510 - accuracy: 0.8908 - val_loss: 0.4465 - val_accuracy: 0.8052 -Epoch 4/10 -625/625 [==============================] - 147s 234ms/step - loss: 0.2176 - accuracy: 0.9074 - val_loss: 0.2927 - val_accuracy: 0.8717 -Epoch 5/10 -625/625 [==============================] - 147s 233ms/step - loss: 0.1841 - accuracy: 0.9231 - val_loss: 0.3973 - val_accuracy: 0.8533 -Epoch 6/10 -625/625 [==============================] - 147s 234ms/step - loss: 0.1570 - accuracy: 0.9377 - val_loss: 0.3241 - val_accuracy: 0.8672 -Epoch 7/10 -625/625 [==============================] - 147s 234ms/step - loss: 0.1269 - accuracy: 0.9498 - val_loss: 0.4279 - val_accuracy: 0.8223 -Epoch 8/10 -625/625 [==============================] - 147s 234ms/step - loss: 0.1090 - accuracy: 0.9582 - val_loss: 0.4491 - val_accuracy: 0.8489 -Epoch 9/10 -625/625 [==============================] - 147s 234ms/step - loss: 0.0994 - accuracy: 0.9618 - val_loss: 0.5422 - val_accuracy: 0.8476 -Epoch 10/10 -625/625 [==============================] - 147s 234ms/step - loss: 0.0780 - accuracy: 0.9711 - val_loss: 0.6911 - val_accuracy: 0.8194 -157/157 [==============================] - 10s 61ms/step - loss: 0.2927 - accuracy: 0.8717 -best model is on run 1 with validation loss : 0.2926725745201111 and validation accuracy : 0.8716999888420105 --
plotHistory(hist)
-history on run 1 : --
cifar_100_model = loadWeights(OrientationClassifier(*model_params),
- optimizer,loss,"models/CifarOrientationClassifier100 run 1")
-imagenette_100_model = loadWeights(OrientationClassifier(*model_params),
- optimizer,loss,"models/ImagenetteOrientationClassifier100 run 1")
-
-models = {"cifar100":cifar_100_model,"imagenette100":imagenette_100_model}
-eval_data = {"cifar100_val":cifar_ds_val,"cifar100_test":cifar_ds_test,
- "imagenette100_val":imagenette_ds_val,"imagenette100_test":imagenette_ds_test}
-for name,model in models.items():
- for data_name,data in eval_data.items():
- print(f"Evaluating {name} with {data_name} data : ")
- evaluate(model,data)
- print("\n")
-
-
-Evaluating cifar100 with cifar100_val data : -Accuracy : 0.8738 , recall : 0.84185303514377 , precision : 0.8997012377294067 , f1 : 0.8698163812667629 , Confusion Matrix : -4216 792 -470 4522 - - - -Evaluating cifar100 with cifar100_test data : -Accuracy : 0.8724 , recall : 0.8334664536741214 , precision : 0.9042461005199307 , f1 : 0.8674147963424772 , Confusion Matrix : -4174 834 -442 4550 - - - -Evaluating cifar100 with imagenette100_val data : -Accuracy : 0.6995776135163675 , recall : 0.7756147540983607 , precision : 0.6838301716350497 , f1 : 0.7268362938070091 , Confusion Matrix : -757 219 -350 568 - - - -Evaluating cifar100 with imagenette100_test data : -Accuracy : 0.7070063694267515 , recall : 0.7885091629519564 , precision : 0.6876889848812096 , f1 : 0.734656206737425 , Confusion Matrix : -1592 427 -723 1183 - - - -Evaluating imagenette100 with cifar100_val data : -Accuracy : 0.6081 , recall : 0.744408945686901 , precision : 0.5855190827705355 , f1 : 0.6554725274725274 , Confusion Matrix : -3728 1280 -2639 2353 - - - -Evaluating imagenette100 with cifar100_test data : -Accuracy : 0.6049 , recall : 0.7406150159744409 , precision : 0.583084420688571 , f1 : 0.6524760313132202 , Confusion Matrix : -3709 1299 -2652 2340 - - - -Evaluating imagenette100 with imagenette100_val data : -Accuracy : 0.7444561774023232 , recall : 0.6895491803278688 , precision : 0.788056206088993 , f1 : 0.7355191256830602 , Confusion Matrix : -673 303 -181 737 - - - -Evaluating imagenette100 with imagenette100_test data : -Accuracy : 0.7243312101910828 , recall : 0.6983655274888558 , precision : 0.7488050982474774 , f1 : 0.7227063044592515 , Confusion Matrix : -1410 609 -473 1433 - - - --
batch_size = 64
-transforms = [flip,normalize]
-input_shape = (32,32,3)
-model_params = (input_shape,256,1,True)
-
-cifar_ds_val = prepareData(data=cifar_val,transforms=transforms,batch_size=batch_size)
-cifar_ds_test = prepareData(data=cifar_test,transforms=transforms,batch_size=batch_size)
-
-cifar_32_model = loadWeights(OrientationClassifier(*model_params),optimizer,
- loss,"models/CifarOrientationClassifier32 run 1")
-
-print("Evaluating cifar32 with cifar32_val data : ")
-evaluate(cifar_32_model,cifar_ds_val)
-print("Evaluating cifar32 with cifar32_test data : ")
-res = evaluate(cifar_32_model,cifar_ds_test)
-Evaluating cifar32 with cifar32_val data : -Accuracy : 0.6515 , recall : 0.6648205128205128 , precision : 0.6364886095836606 , f1 : 0.6503461422694893 , Confusion Matrix : -3241 1634 -1851 3274 - -Evaluating cifar32 with cifar32_test data : -Accuracy : 0.648 , recall : 0.668923076923077 , precision : 0.6311205728662667 , f1 : 0.6494722166899024 , Confusion Matrix : -3261 1614 -1906 3219 - --
import os
-def testImages(model,path):
- for file in os.listdir(path):
-
- print(f"image : {file} : ")
-
- image = plt.imread(os.path.join(path,file))
- image,_ = normalize(*resize(image,None))
- flipped = tf.image.flip_up_down(image)
-
- pred = model.predict(np.expand_dims(image,0))
- print(f"Un-flipped , prediction probability = {pred} , class : {classes[int(pred>0.5)]}")
- plt.imshow(image)
- plt.show()
-
- pred = model.predict(np.expand_dims(flipped,0))
- print(f"Flipped , prediction probability = {pred} , class : {classes[int(pred>0.5)]}")
- plt.imshow(flipped)
- plt.show()
-
-testImages(cifar_100_model,"test images/")
-image : 10.jpg : -Un-flipped , prediction probability = [[0.11737356]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.9983485]] , class : FLIPPED --
image : 11.jpg : -Un-flipped , prediction probability = [[0.99120075]] , class : FLIPPED --
Flipped , prediction probability = [[0.15300421]] , class : UN-FLIPPED --
image : 12.jpg : -Un-flipped , prediction probability = [[0.00832986]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.99575835]] , class : FLIPPED --
image : 13.jpg : -Un-flipped , prediction probability = [[0.00108209]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.9971482]] , class : FLIPPED --
image : 4.jpg : -Un-flipped , prediction probability = [[0.90222234]] , class : FLIPPED --
Flipped , prediction probability = [[0.9997397]] , class : FLIPPED --
image : 5.jpg : -Un-flipped , prediction probability = [[0.08454981]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.99774677]] , class : FLIPPED --
image : 6.jpg : -Un-flipped , prediction probability = [[0.01698862]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.99118453]] , class : FLIPPED --
image : 7.jpg : -Un-flipped , prediction probability = [[0.00257502]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.99348265]] , class : FLIPPED --
image : 8.jpg : -Un-flipped , prediction probability = [[0.00733281]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.9947094]] , class : FLIPPED --
image : 9.jpg : -Un-flipped , prediction probability = [[0.20384578]] , class : UN-FLIPPED --
Flipped , prediction probability = [[0.23118748]] , class : UN-FLIPPED --
-