{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        pass\n#         print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Importing Packages ","metadata":{}},{"cell_type":"code","source":"import glob \nimport os\nimport random\nimport shutil\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import vgg16,mobilenet_v3\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.utils import plot_model\nfrom tensorflow.keras import models,optimizers\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.applications.imagenet_utils import preprocess_input \nfrom keras.callbacks import EarlyStopping\nfrom tensorflow.keras.applications import resnet50\nimport keras\nimport numpy as np\n\n\n\n\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T18:02:28.132990Z","iopub.execute_input":"2022-07-08T18:02:28.133484Z","iopub.status.idle":"2022-07-08T18:02:28.146890Z","shell.execute_reply.started":"2022-07-08T18:02:28.133444Z","shell.execute_reply":"2022-07-08T18:02:28.145724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Perparing files ( train_val_test-split)","metadata":{}},{"cell_type":"code","source":"!cp -r /kaggle/input/state-farm-distracted-driver-detection/imgs/train ./\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:26:18.219385Z","iopub.execute_input":"2022-07-08T15:26:18.220038Z","iopub.status.idle":"2022-07-08T15:27:53.048939Z","shell.execute_reply.started":"2022-07-08T15:26:18.220002Z","shell.execute_reply":"2022-07-08T15:27:53.047637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# path = \"/kaggle/input/state-farm-distracted-driver-detection/imgs/\"\npath = \"/kaggle/working/\"\ntrain_dir = path + \"train/\"\nvalid_dir = path + \"val/\"\ntest_dir  = path + 'test/' ","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:27:53.051329Z","iopub.execute_input":"2022-07-08T15:27:53.051627Z","iopub.status.idle":"2022-07-08T15:27:53.057597Z","shell.execute_reply.started":"2022-07-08T15:27:53.051599Z","shell.execute_reply":"2022-07-08T15:27:53.056461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = [c for c in os.listdir(train_dir)]\nclasses.sort()\nprint(classes)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:27:53.059546Z","iopub.execute_input":"2022-07-08T15:27:53.060401Z","iopub.status.idle":"2022-07-08T15:27:53.067710Z","shell.execute_reply.started":"2022-07-08T15:27:53.060365Z","shell.execute_reply":"2022-07-08T15:27:53.066571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Showing Images in classes","metadata":{}},{"cell_type":"code","source":"classes.sort()\nfor c in classes:\n\n    fig=plt.figure(figsize=(20,20))\n    cl = train_dir + c\n    for i,sample in enumerate(random.sample(os.listdir(train_dir + c) , 10)):\n        fig.add_subplot(10, 10, i+1)\n        image = plt.imread(cl + '/' + sample)\n\n        plt.imshow(image)\n        plt.xticks([])\n        plt.yticks([])\n        plt.title(f\"{c}\")","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:27:53.071041Z","iopub.execute_input":"2022-07-08T15:27:53.071320Z","iopub.status.idle":"2022-07-08T15:28:01.691060Z","shell.execute_reply.started":"2022-07-08T15:27:53.071273Z","shell.execute_reply":"2022-07-08T15:28:01.690183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes_mapping = {   'c0' : \"safe_driving\",\n                      'c1' : \"texting-right\",\n                      'c2' : \"talking_on_the_phone-right\",\n                      'c3' : \"texting-left\",\n                      'c4' : \"talking_on_the_phone-left\",\n                      'c5' : \"operating_the_radio\",\n                      'c6' : \"drinking\",\n                      'c7' : \"reaching_behind\",\n                      'c8' : \"hair-and-makeup\",\n                      'c9' : \"talking_to_passenger\"}","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:01.692640Z","iopub.execute_input":"2022-07-08T15:28:01.693306Z","iopub.status.idle":"2022-07-08T15:28:01.699481Z","shell.execute_reply.started":"2022-07-08T15:28:01.693253Z","shell.execute_reply":"2022-07-08T15:28:01.698185Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for c in os.listdir(train_dir):\n    shutil.move(os.path.join(train_dir,c), os.path.join(train_dir,classes_mapping[f'{c}']))","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:01.701396Z","iopub.execute_input":"2022-07-08T15:28:01.702104Z","iopub.status.idle":"2022-07-08T15:28:01.709362Z","shell.execute_reply.started":"2022-07-08T15:28:01.702027Z","shell.execute_reply":"2022-07-08T15:28:01.708166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for c in os.listdir(train_dir):\n    os.makedirs(valid_dir + '/' + c, exist_ok=True)\n    os.makedirs(test_dir + '/' + c, exist_ok=True)\n    \n    c_train_dir = train_dir + c\n    c_len = len([sample for sample in os.listdir(c_train_dir)])\n    print(c_len)\n    \n    for sample in random.sample(os.listdir(c_train_dir) , int(float(0.1) * c_len)):\n        shutil.move(c_train_dir + '/' + sample, valid_dir + c)\n        \n    for sample in random.sample(os.listdir(c_train_dir) , int(float(0.1) * c_len)):\n        shutil.move(c_train_dir + '/' + sample, test_dir + c)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:01.710986Z","iopub.execute_input":"2022-07-08T15:28:01.711546Z","iopub.status.idle":"2022-07-08T15:28:01.917130Z","shell.execute_reply.started":"2022-07-08T15:28:01.711510Z","shell.execute_reply":"2022-07-08T15:28:01.916153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# classes = [c for c in os.listdir(test_dir)]\n# c_len = len([sample for sample in os.listdir(test_dir + 'c0')])\n# c_len\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:01.918413Z","iopub.execute_input":"2022-07-08T15:28:01.918856Z","iopub.status.idle":"2022-07-08T15:28:01.924013Z","shell.execute_reply.started":"2022-07-08T15:28:01.918819Z","shell.execute_reply":"2022-07-08T15:28:01.922958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen_augmentation = ImageDataGenerator(rescale=1 / 255.0,\n                                                zoom_range=0.05,\n                                                width_shift_range=0.05,\n                                                height_shift_range=0.05,\n                                                shear_range=0.05,\n                                                fill_mode=\"nearest\")\n\n\ntest_datagen = ImageDataGenerator(rescale=1 / 255.0)\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:01.925502Z","iopub.execute_input":"2022-07-08T15:28:01.925909Z","iopub.status.idle":"2022-07-08T15:28:01.934446Z","shell.execute_reply.started":"2022-07-08T15:28:01.925873Z","shell.execute_reply":"2022-07-08T15:28:01.933453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training without Augmentation","metadata":{}},{"cell_type":"code","source":"batch_size = 32\ntrain_batches = test_datagen.flow_from_directory(directory = train_dir,shuffle = True, \n                                                   batch_size = batch_size)\n\nval_batches = test_datagen.flow_from_directory(directory = valid_dir,shuffle = True, \n                                                   batch_size = batch_size)\n\ntest_batches = test_datagen.flow_from_directory(directory= test_dir,shuffle = False, \n                                                   batch_size = 1)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:01.939518Z","iopub.execute_input":"2022-07-08T15:28:01.939862Z","iopub.status.idle":"2022-07-08T15:28:02.597398Z","shell.execute_reply.started":"2022-07-08T15:28:01.939835Z","shell.execute_reply":"2022-07-08T15:28:02.596367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images, labels  = next(train_batches)\n# train_batches.\nprint(labels)\nprint(images[31].shape)\n\nplt.imshow(images[31])\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:02.598716Z","iopub.execute_input":"2022-07-08T15:28:02.599685Z","iopub.status.idle":"2022-07-08T15:28:02.949171Z","shell.execute_reply.started":"2022-07-08T15:28:02.599645Z","shell.execute_reply":"2022-07-08T15:28:02.948219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_batches.class_indices\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:02.950545Z","iopub.execute_input":"2022-07-08T15:28:02.951543Z","iopub.status.idle":"2022-07-08T15:28:02.959201Z","shell.execute_reply.started":"2022-07-08T15:28:02.951505Z","shell.execute_reply":"2022-07-08T15:28:02.958082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_batches.labels)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:02.960869Z","iopub.execute_input":"2022-07-08T15:28:02.961780Z","iopub.status.idle":"2022-07-08T15:28:02.969041Z","shell.execute_reply.started":"2022-07-08T15:28:02.961739Z","shell.execute_reply":"2022-07-08T15:28:02.967933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dense Base Model ","metadata":{}},{"cell_type":"code","source":"base_model = models.Sequential()\nbase_model.add(layers.Flatten(input_shape=(256,256,3)))\nbase_model.add(layers.Dense(1024,activation = 'relu',name = 'input'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(1024,activation = 'relu',name = 'l1'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(512,activation = 'relu',name = 'l2'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(512,activation = 'relu',name = 'l3'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(256,activation = 'relu',name = 'l4'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(256,activation = 'relu',name = 'l5'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(128,activation = 'relu' ,name ='l6'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(128,activation = 'relu' ,name ='l7'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(32,activation = 'relu' ,name ='l8'))\nbase_model.add(layers.BatchNormalization())\nbase_model.add(layers.Dense(10,activation = 'softmax',name = 'output'))","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:02.970913Z","iopub.execute_input":"2022-07-08T15:28:02.971510Z","iopub.status.idle":"2022-07-08T15:28:05.846236Z","shell.execute_reply.started":"2022-07-08T15:28:02.971473Z","shell.execute_reply":"2022-07-08T15:28:05.845228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:05.847511Z","iopub.execute_input":"2022-07-08T15:28:05.848304Z","iopub.status.idle":"2022-07-08T15:28:05.858254Z","shell.execute_reply.started":"2022-07-08T15:28:05.848244Z","shell.execute_reply":"2022-07-08T15:28:05.857359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_model(base_model)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:05.859892Z","iopub.execute_input":"2022-07-08T15:28:05.860243Z","iopub.status.idle":"2022-07-08T15:28:06.907843Z","shell.execute_reply.started":"2022-07-08T15:28:05.860208Z","shell.execute_reply":"2022-07-08T15:28:06.906598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model.compile(\n    optimizer='adam', \n    loss='categorical_crossentropy', \n    metrics=['accuracy']\n)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:06.912155Z","iopub.execute_input":"2022-07-08T15:28:06.912480Z","iopub.status.idle":"2022-07-08T15:28:06.930684Z","shell.execute_reply.started":"2022-07-08T15:28:06.912449Z","shell.execute_reply":"2022-07-08T15:28:06.929601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nes = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)\nhistory = base_model.fit(x = train_batches,\n          steps_per_epoch=350,\n          epochs=15,\n          validation_data = val_batches,\n          validation_steps= 50,\n          callbacks=[es])","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:28:06.932219Z","iopub.execute_input":"2022-07-08T15:28:06.932828Z","iopub.status.idle":"2022-07-08T15:40:00.808125Z","shell.execute_reply.started":"2022-07-08T15:28:06.932791Z","shell.execute_reply":"2022-07-08T15:40:00.807065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss, test_acc = base_model.evaluate(test_batches)\nprint(test_loss, test_acc)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:40:00.810333Z","iopub.execute_input":"2022-07-08T15:40:00.811338Z","iopub.status.idle":"2022-07-08T15:40:21.332568Z","shell.execute_reply.started":"2022-07-08T15:40:00.811282Z","shell.execute_reply":"2022-07-08T15:40:21.331448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CNN_Base_model","metadata":{}},{"cell_type":"code","source":"cnn_model = models.Sequential()\ncnn_model.add(layers.Conv2D(32,(3,3),activation = 'relu',name = 'Conv_input',input_shape = (256,256,3)))\ncnn_model.add(layers.Conv2D(32,(3,3),activation = 'relu',name = 'Conv_2',padding = 'same'))\ncnn_model.add(layers.Conv2D(32,(3,3),activation = 'relu',name = 'Conv_3',padding = 'same'))\n\ncnn_model.add(layers.BatchNormalization())\n\n\ncnn_model.add(layers.MaxPooling2D((2,2),name = 'max_1'))\ncnn_model.add(layers.Conv2D(64,(3,3),activation = 'relu',name = 'Conv_4',padding='same'))\ncnn_model.add(layers.Conv2D(64,(3,3),activation = 'relu',name = 'Conv_5',padding='same'))\ncnn_model.add(layers.BatchNormalization())\n\ncnn_model.add(layers.MaxPooling2D((2,2),name = 'max_2'))\n\ncnn_model.add(layers.Conv2D(128,(3,3),activation='relu'))\ncnn_model.add(layers.BatchNormalization())\n\ncnn_model.add(layers.MaxPooling2D((2,2)))\ncnn_model.add(layers.Conv2D(128,(3,3),activation='relu'))\ncnn_model.add(layers.BatchNormalization())\n\n\ncnn_model.add(layers.Flatten())\ncnn_model.add(layers.Dense(512,activation = 'relu',name = 'D1',))\ncnn_model.add(layers.BatchNormalization())\n\ncnn_model.add(layers.Dense(256,activation = 'relu',name = 'D2'))\ncnn_model.add(layers.BatchNormalization())\n\ncnn_model.add(layers.Dense(256,activation = 'relu',name = 'D3'))\ncnn_model.add(layers.BatchNormalization())\n\ncnn_model.add(layers.Dense(128,activation = 'relu' ,name ='D4'))\ncnn_model.add(layers.BatchNormalization())\n\ncnn_model.add(layers.Dense(10,activation = 'softmax',name = 'output'))","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:40:21.334284Z","iopub.execute_input":"2022-07-08T15:40:21.334668Z","iopub.status.idle":"2022-07-08T15:40:21.530790Z","shell.execute_reply.started":"2022-07-08T15:40:21.334632Z","shell.execute_reply":"2022-07-08T15:40:21.529876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_model(cnn_model)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:40:21.531994Z","iopub.execute_input":"2022-07-08T15:40:21.532357Z","iopub.status.idle":"2022-07-08T15:40:21.710500Z","shell.execute_reply.started":"2022-07-08T15:40:21.532310Z","shell.execute_reply":"2022-07-08T15:40:21.709248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:40:21.712219Z","iopub.execute_input":"2022-07-08T15:40:21.712952Z","iopub.status.idle":"2022-07-08T15:40:21.722693Z","shell.execute_reply.started":"2022-07-08T15:40:21.712911Z","shell.execute_reply":"2022-07-08T15:40:21.721584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)\n\nhistory = cnn_model.fit(x = train_batches,\n          steps_per_epoch=250,\n          epochs=15,\n          validation_data = val_batches,\n          validation_steps= 50,\n          callbacks=[es])","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:40:21.741248Z","iopub.execute_input":"2022-07-08T15:40:21.741687Z","iopub.status.idle":"2022-07-08T15:58:52.987268Z","shell.execute_reply.started":"2022-07-08T15:40:21.741652Z","shell.execute_reply":"2022-07-08T15:58:52.985994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss, test_acc = cnn_model.evaluate(test_batches)\nprint(test_loss, test_acc)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:58:52.989187Z","iopub.execute_input":"2022-07-08T15:58:52.989552Z","iopub.status.idle":"2022-07-08T15:59:32.461323Z","shell.execute_reply.started":"2022-07-08T15:58:52.989514Z","shell.execute_reply":"2022-07-08T15:59:32.460038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training with Augmentation","metadata":{}},{"cell_type":"code","source":"train_batches_augmented = train_datagen_augmentation.flow_from_directory(directory = train_dir,shuffle = True, \n                                                   batch_size = batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T15:59:32.462606Z","iopub.execute_input":"2022-07-08T15:59:32.462970Z","iopub.status.idle":"2022-07-08T15:59:32.922464Z","shell.execute_reply.started":"2022-07-08T15:59:32.462934Z","shell.execute_reply":"2022-07-08T15:59:32.921280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model_augmented = models.Sequential()\ncnn_model_augmented.add(layers.Conv2D(32,(3,3),activation = 'relu',name = 'Conv_input',input_shape = (256,256,3)))\ncnn_model_augmented.add(layers.Conv2D(32,(3,3),activation = 'relu',name = 'Conv_2',padding = 'same'))\ncnn_model_augmented.add(layers.Conv2D(32,(3,3),activation = 'relu',name = 'Conv_3',padding = 'same'))\n\ncnn_model_augmented.add(layers.BatchNormalization())\n\n\ncnn_model_augmented.add(layers.MaxPooling2D((2,2),name = 'max_1'))\ncnn_model_augmented.add(layers.Conv2D(64,(3,3),activation = 'relu',name = 'Conv_4',padding='same'))\ncnn_model_augmented.add(layers.Conv2D(64,(3,3),activation = 'relu',name = 'Conv_5',padding='same'))\ncnn_model_augmented.add(layers.BatchNormalization())\n\ncnn_model_augmented.add(layers.MaxPooling2D((2,2),name = 'max_2'))\n\ncnn_model_augmented.add(layers.Conv2D(128,(3,3),activation='relu'))\ncnn_model_augmented.add(layers.BatchNormalization())\n\ncnn_model_augmented.add(layers.MaxPooling2D((2,2)))\ncnn_model_augmented.add(layers.Conv2D(128,(3,3),activation='relu'))\ncnn_model_augmented.add(layers.BatchNormalization())\n\n\ncnn_model_augmented.add(layers.Flatten())\ncnn_model_augmented.add(layers.Dense(512,activation = 'relu',name = 'D1',))\ncnn_model_augmented.add(layers.BatchNormalization())\n\ncnn_model_augmented.add(layers.Dense(256,activation = 'relu',name = 'D2'))\ncnn_model_augmented.add(layers.BatchNormalization())\n\ncnn_model_augmented.add(layers.Dense(256,activation = 'relu',name = 'D3'))\ncnn_model_augmented.add(layers.BatchNormalization())\n\ncnn_model_augmented.add(layers.Dense(128,activation = 'relu' ,name ='D4'))\ncnn_model_augmented.add(layers.BatchNormalization())\n\ncnn_model_augmented.add(layers.Dense(10,activation = 'softmax',name = 'output'))","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:02:03.192431Z","iopub.execute_input":"2022-07-08T16:02:03.193132Z","iopub.status.idle":"2022-07-08T16:02:03.384581Z","shell.execute_reply.started":"2022-07-08T16:02:03.193095Z","shell.execute_reply":"2022-07-08T16:02:03.383583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_model_augmented.compile(optimizer = 'adam' , loss='categorical_crossentropy', metrics=['acc'])","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:02:04.433956Z","iopub.execute_input":"2022-07-08T16:02:04.434352Z","iopub.status.idle":"2022-07-08T16:02:04.445600Z","shell.execute_reply.started":"2022-07-08T16:02:04.434314Z","shell.execute_reply":"2022-07-08T16:02:04.444504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)\n\nhistory = cnn_model_augmented.fit(x = train_batches_augmented,\n          steps_per_epoch=250,\n          epochs=15,\n          validation_data = val_batches,\n          validation_steps= 50,\n          callbacks=[es])","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:02:08.751991Z","iopub.execute_input":"2022-07-08T16:02:08.752357Z","iopub.status.idle":"2022-07-08T16:27:16.413324Z","shell.execute_reply.started":"2022-07-08T16:02:08.752326Z","shell.execute_reply":"2022-07-08T16:27:16.412324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss, test_acc = cnn_model_augmented.evaluate(test_batches)\nprint(test_loss, test_acc)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:27:41.973307Z","iopub.execute_input":"2022-07-08T16:27:41.974160Z","iopub.status.idle":"2022-07-08T16:28:26.893924Z","shell.execute_reply.started":"2022-07-08T16:27:41.974111Z","shell.execute_reply":"2022-07-08T16:28:26.892970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transfer learning with resnet model and augmented data","metadata":{}},{"cell_type":"code","source":"\ntrain_datagen_augmentation = ImageDataGenerator(preprocessing_function= resnet50.preprocess_input,\n                                                zoom_range=0.05,\n                                                width_shift_range=0.05,\n                                                height_shift_range=0.05,\n                                                shear_range=0.05,\n                                                fill_mode=\"nearest\")\n\n\ntest_datagen = ImageDataGenerator(preprocessing_function= resnet50.preprocess_input)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:30:39.601987Z","iopub.execute_input":"2022-07-08T16:30:39.602674Z","iopub.status.idle":"2022-07-08T16:30:39.608911Z","shell.execute_reply.started":"2022-07-08T16:30:39.602636Z","shell.execute_reply":"2022-07-08T16:30:39.607526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nconv_model = resnet50.ResNet50(weights='imagenet',include_top=False,input_shape = (256,256,3))\n\n\nfor layer in conv_model.layers[:-3]:\n    layer.trainable=False\n\n\nresnet_model = models.Sequential()\nresnet_model.add(conv_model)\nresnet_model.add(layers.Flatten())\n\ncnn_model.add(layers.Dense(512,activation = 'relu',))\ncnn_model.add(layers.BatchNormalization())\n\nresnet_model.add(layers.Dense(256,activation = 'relu'))\ncnn_model.add(layers.BatchNormalization())\n\nresnet_model.add(layers.Dense(128,activation = 'relu'))\ncnn_model.add(layers.BatchNormalization())\n\nresnet_model.add(layers.Dense(10,activation = 'softmax',name = 'output'))","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:32:31.344925Z","iopub.execute_input":"2022-07-08T16:32:31.345278Z","iopub.status.idle":"2022-07-08T16:32:33.110534Z","shell.execute_reply.started":"2022-07-08T16:32:31.345246Z","shell.execute_reply":"2022-07-08T16:32:33.109578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet_model.compile(optimizer = optimizers.Adam(learning_rate=.0001) ,\n              loss='categorical_crossentropy',\n              metrics=['acc'])","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:32:36.277019Z","iopub.execute_input":"2022-07-08T16:32:36.277402Z","iopub.status.idle":"2022-07-08T16:32:36.294166Z","shell.execute_reply.started":"2022-07-08T16:32:36.277369Z","shell.execute_reply":"2022-07-08T16:32:36.293047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)\n\nhistory = resnet_model.fit(x = train_batches_augmented,\n          steps_per_epoch=250,\n          epochs=15,\n          validation_data = val_batches,\n          validation_steps= 50,\n          callbacks=[es])","metadata":{"execution":{"iopub.status.busy":"2022-07-08T16:32:51.845062Z","iopub.execute_input":"2022-07-08T16:32:51.845805Z","iopub.status.idle":"2022-07-08T17:09:44.534407Z","shell.execute_reply.started":"2022-07-08T16:32:51.845754Z","shell.execute_reply":"2022-07-08T17:09:44.533365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss, test_acc = resnet_model.evaluate(test_batches)\nprint(test_loss, test_acc)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T17:09:44.536839Z","iopub.execute_input":"2022-07-08T17:09:44.537210Z","iopub.status.idle":"2022-07-08T17:11:15.334175Z","shell.execute_reply.started":"2022-07-08T17:09:44.537172Z","shell.execute_reply":"2022-07-08T17:11:15.333258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CNN Visualization","metadata":{}},{"cell_type":"code","source":"from keras import models\n\n# Extracts the outputs of the top 8 layers:\nlayer_outputs = [layer.output for layer in cnn_model.layers[:10]]\n# Creates a model that will return these outputs, given the model input:\nactivation_model = models.Model(inputs=cnn_model.input, outputs=layer_outputs)","metadata":{"execution":{"iopub.status.busy":"2022-07-08T18:10:49.750416Z","iopub.execute_input":"2022-07-08T18:10:49.750809Z","iopub.status.idle":"2022-07-08T18:10:49.761497Z","shell.execute_reply.started":"2022-07-08T18:10:49.750778Z","shell.execute_reply":"2022-07-08T18:10:49.760512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_tensor = images[1]\n# plt.imshow(images[31])\nimg_tensor = np.expand_dims(img_tensor, axis=0)\n# img_tensor /= 255.\n\n# Its shape is (1, 150, 150, 3)\nprint(img_tensor.shape)\nplt.imshow(img_tensor[0])\nplt.show()\n\n\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T18:10:50.868701Z","iopub.execute_input":"2022-07-08T18:10:50.869528Z","iopub.status.idle":"2022-07-08T18:10:51.132062Z","shell.execute_reply.started":"2022-07-08T18:10:50.869487Z","shell.execute_reply":"2022-07-08T18:10:51.131160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"activations = activation_model.predict(img_tensor)\nlen(activations)\n","metadata":{"execution":{"iopub.status.busy":"2022-07-08T18:10:51.744991Z","iopub.execute_input":"2022-07-08T18:10:51.745689Z","iopub.status.idle":"2022-07-08T18:10:51.913129Z","shell.execute_reply.started":"2022-07-08T18:10:51.745651Z","shell.execute_reply":"2022-07-08T18:10:51.912187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# These are the names of the layers, so can have them as part of our plot\ndef cnn_visualization(activations = activations ,model = cnn_model): \n    layer_names = []\n    for layer in model.layers[:10]:\n        layer_names.append(layer.name)\n\n    images_per_row = 16\n\n    # Now let's display our feature maps\n    for layer_name, layer_activation in zip(layer_names, activations):\n        # This is the number of features in the feature map\n        n_features = layer_activation.shape[-1]\n\n        # The feature map has shape (1, size, size, n_features)\n        size = layer_activation.shape[1]\n\n        # We will tile the activation channels in this matrix\n        n_cols = n_features // images_per_row\n        display_grid = np.zeros((size * n_cols, images_per_row * size))\n\n        # We'll tile each filter into this big horizontal grid\n        for col in range(n_cols):\n            for row in range(images_per_row):\n                channel_image = layer_activation[0,\n                                                 :, :,\n                                                 col * images_per_row + row]\n                # Post-process the feature to make it visually palatable\n                channel_image -= channel_image.mean()\n                channel_image /= channel_image.std()\n                channel_image *= 64\n                channel_image += 128\n                channel_image = np.clip(channel_image, 0, 255).astype('uint8')\n                display_grid[col * size : (col + 1) * size,\n                             row * size : (row + 1) * size] = channel_image\n\n        # Display the grid\n        scale = 1. / size\n        plt.figure(figsize=(scale * display_grid.shape[1],\n                            scale * display_grid.shape[0]))\n        plt.title(layer_name)\n        plt.grid(False)\n        plt.imshow(display_grid, aspect='auto', cmap='viridis')\n\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-07-08T18:10:53.190646Z","iopub.execute_input":"2022-07-08T18:10:53.191008Z","iopub.status.idle":"2022-07-08T18:10:53.203392Z","shell.execute_reply.started":"2022-07-08T18:10:53.190977Z","shell.execute_reply":"2022-07-08T18:10:53.202449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn_visualization()","metadata":{"execution":{"iopub.status.busy":"2022-07-08T18:10:55.421532Z","iopub.execute_input":"2022-07-08T18:10:55.422194Z","iopub.status.idle":"2022-07-08T18:10:59.350006Z","shell.execute_reply.started":"2022-07-08T18:10:55.422156Z","shell.execute_reply":"2022-07-08T18:10:59.349187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}