{"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":"#Install dependecies\n\nimport math, re, os\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport skimage\nimport skimage.io\n\nfrom  sklearn.model_selection import train_test_split\nfrom keras.utils import load_img, img_to_array, array_to_img\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom tqdm import tqdm\nfrom kaggle_datasets import KaggleDatasets\nfrom tensorflow import keras\nfrom functools import partial\n\n\nprint(\"Tensorflow version \" + tf.__version__)\n\nimport random\nfrom glob import glob\nfrom tensorflow.keras.optimizers import Adam\nimport keras\nfrom keras.models import *\nfrom keras import layers\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.optimizers import Adam\nfrom keras.applications.vgg16 import preprocess_input\n\nfrom keras.applications.vgg16 import VGG16\nfrom IPython.display import display\nfrom PIL import Image","metadata":{"execution":{"iopub.status.busy":"2023-05-16T08:29:02.142479Z","iopub.execute_input":"2023-05-16T08:29:02.142853Z","iopub.status.idle":"2023-05-16T08:29:16.875344Z","shell.execute_reply.started":"2023-05-16T08:29:02.14282Z","shell.execute_reply":"2023-05-16T08:29:16.874394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mapping_path = '/kaggle/input/imagenet-object-localization-challenge/LOC_synset_mapping.txt' \nsrc_path_train = '/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train'\nsrc_path_test = '/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/test'","metadata":{"execution":{"iopub.status.busy":"2023-05-16T08:29:16.877569Z","iopub.execute_input":"2023-05-16T08:29:16.878483Z","iopub.status.idle":"2023-05-16T08:29:16.88571Z","shell.execute_reply.started":"2023-05-16T08:29:16.878446Z","shell.execute_reply":"2023-05-16T08:29:16.883703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Creation of mapping dictionaries to obtain the image classes\n\nclass_mapping_dict = {}\nclass_mapping_dict_number = {}\nmapping_class_to_number = {}\nmapping_number_to_class = {}\ni = 0\nfor line in open(mapping_path):\n    class_mapping_dict[line[:9].strip()] = line[9:].strip()\n    class_mapping_dict_number[i] = line[9:].strip()\n    mapping_class_to_number[line[:9].strip()] = i\n    mapping_number_to_class[i] = line[:9].strip()\n    i+=1\n    \n#print(class_mapping_dict)\n#print(class_mapping_dict_number)\n#print(mapping_class_to_number)\n#print(mapping_number_to_class)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T08:29:16.887054Z","iopub.execute_input":"2023-05-16T08:29:16.887947Z","iopub.status.idle":"2023-05-16T08:29:16.917796Z","shell.execute_reply.started":"2023-05-16T08:29:16.887914Z","shell.execute_reply":"2023-05-16T08:29:16.916942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Creation of dataset_array and CLASSES\n\nCLASSES = []\nimages_array = []\nfor train_class in tqdm(os.listdir(src_path_train)):\n    i = 0\n    for el in os.listdir(src_path_train + '/' + train_class):\n        if i < 10:\n            path = src_path_train + '/' + train_class + '/' + el\n            image = load_img(path,target_size=(224,224,3))\n            image_array = img_to_array(image).astype(np.uint8)\n            images_array.append(image_array)\n            CLASS = class_mapping_dict[path.split('/')[-2]]\n            CLASSES.append(CLASS)\n            i+=1\n        else:\n            break\nimages_array = np.array(images_array)\nCLASSES = np.array(CLASSES)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T08:29:16.920605Z","iopub.execute_input":"2023-05-16T08:29:16.920992Z","iopub.status.idle":"2023-05-16T08:36:12.274451Z","shell.execute_reply.started":"2023-05-16T08:29:16.920959Z","shell.execute_reply":"2023-05-16T08:36:12.273523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 128\nepochs = 100","metadata":{"execution":{"iopub.status.busy":"2023-05-16T08:36:12.276015Z","iopub.execute_input":"2023-05-16T08:36:12.276363Z","iopub.status.idle":"2023-05-16T08:36:12.282356Z","shell.execute_reply.started":"2023-05-16T08:36:12.276329Z","shell.execute_reply":"2023-05-16T08:36:12.281437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Creation of the train_generator and the test_generator\n\nimage_gen = ImageDataGenerator(\n    #rescale=1 / 255.0,\n    #rotation_range=20,\n    #zoom_range=0.05,\n    #width_shift_range=0.05,\n    #height_shift_range=0.05,\n    #shear_range=0.05,\n    #horizontal_flip=True,\n    #fill_mode=\"nearest\",\n    preprocessing_function = preprocess_input,\n    validation_split=0.20)\n\ntrain_generator = image_gen.flow_from_directory(\n  src_path_train,\n  target_size=(224,224),\n  shuffle=True,\n  batch_size=batch_size,\n  subset=\"training\",\n  class_mode=\"sparse\" \n)\n\ntest_generator = image_gen.flow_from_directory(\n  src_path_train,\n  target_size=(224,224),\n  shuffle=True,\n  batch_size=batch_size,\n  subset=\"validation\",\n  class_mode=\"sparse\"\n)\n","metadata":{"execution":{"iopub.status.busy":"2023-05-16T08:36:12.28386Z","iopub.execute_input":"2023-05-16T08:36:12.284454Z","iopub.status.idle":"2023-05-16T09:10:02.843382Z","shell.execute_reply.started":"2023-05-16T08:36:12.284419Z","shell.execute_reply":"2023-05-16T09:10:02.842318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr_scheduler = tf.keras.optimizers.schedules.ExponentialDecay(\n    initial_learning_rate=1e-5, \n    decay_steps=10000, \n    decay_rate=0.9)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T09:10:02.844737Z","iopub.execute_input":"2023-05-16T09:10:02.845091Z","iopub.status.idle":"2023-05-16T09:10:02.852602Z","shell.execute_reply.started":"2023-05-16T09:10:02.845057Z","shell.execute_reply":"2023-05-16T09:10:02.85156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_VGG16 = VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3))\n\nfor layer in model_VGG16.layers:\n        layer.trainable = False\n\nmodel = Sequential()\nmodel.add(model_VGG16)\n\n#model.add(layers.BatchNormalization(renorm=True))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(units=4096, activation='relu'))\n#model.add(layers.Dropout(0.3))\n\n#model.add(layers.BatchNormalization(renorm=True))\nmodel.add(layers.Dense(units=4096, activation='relu'))\n#model.add(layers.Dropout(0.5))\n\n#model.add(layers.BatchNormalization(renorm=True))\nmodel.add(layers.Dense(units=1000, activation='softmax'))\n\nmodel.compile(optimizer=Adam(learning_rate=lr_scheduler, epsilon=0.001), loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'])\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-05-16T09:10:02.854672Z","iopub.execute_input":"2023-05-16T09:10:02.855417Z","iopub.status.idle":"2023-05-16T09:10:08.520558Z","shell.execute_reply.started":"2023-05-16T09:10:02.855382Z","shell.execute_reply":"2023-05-16T09:10:08.519691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early_stop = EarlyStopping(\n    min_delta=0.001, # minimium amount of change to count as an improvement\n    patience=10, # how many epochs to wait before stopping\n)\n\n\nhistory = model.fit(\n  train_generator,\n  validation_data=test_generator,\n  epochs=epochs,\n  steps_per_epoch=len(train_generator) // batch_size,\n  validation_steps=len(test_generator) // batch_size,\n  callbacks=[early_stop]\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T09:10:08.521962Z","iopub.execute_input":"2023-05-16T09:10:08.522341Z","iopub.status.idle":"2023-05-16T12:46:04.62353Z","shell.execute_reply.started":"2023-05-16T09:10:08.522304Z","shell.execute_reply":"2023-05-16T12:46:04.622361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create learning curves to evaluate model performance\nhistory_frame = pd.DataFrame(history.history)\nhistory_frame.loc[:, ['loss', 'val_loss']].plot()\nhistory_frame.loc[:, ['sparse_categorical_accuracy', 'val_sparse_categorical_accuracy']].plot();\n\n","metadata":{"execution":{"iopub.status.busy":"2023-05-16T12:46:04.647666Z","iopub.execute_input":"2023-05-16T12:46:04.648363Z","iopub.status.idle":"2023-05-16T12:46:59.549735Z","shell.execute_reply.started":"2023-05-16T12:46:04.648318Z","shell.execute_reply":"2023-05-16T12:46:59.548726Z"},"trusted":true},"execution_count":null,"outputs":[]}]}