{"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        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":{"execution":{"iopub.status.busy":"2023-09-18T19:11:34.295740Z","iopub.execute_input":"2023-09-18T19:11:34.296581Z","iopub.status.idle":"2023-09-18T19:11:34.740014Z","shell.execute_reply.started":"2023-09-18T19:11:34.296549Z","shell.execute_reply":"2023-09-18T19:11:34.738913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Install Required Libraries\n!pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:11:34.772106Z","iopub.execute_input":"2023-09-18T19:11:34.772600Z","iopub.status.idle":"2023-09-18T19:11:51.482356Z","shell.execute_reply.started":"2023-09-18T19:11:34.772565Z","shell.execute_reply":"2023-09-18T19:11:51.480978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Import Libraries","metadata":{}},{"cell_type":"code","source":"import glob\nimport os\nimport cv2\nimport shutil\nimport random\nimport numpy as np \n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\n        \n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.keras import datasets, layers, models\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, BatchNormalization, Dropout\n\nfrom sklearn.model_selection import train_test_split\n\nimport matplotlib.pyplot as plt\nfrom py7zr import unpack_7zarchive\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:11:51.486476Z","iopub.execute_input":"2023-09-18T19:11:51.486798Z","iopub.status.idle":"2023-09-18T19:12:01.252808Z","shell.execute_reply.started":"2023-09-18T19:11:51.486769Z","shell.execute_reply":"2023-09-18T19:12:01.251692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Setting up T4 GPU","metadata":{}},{"cell_type":"code","source":"# GPU * 2 <<Define t4 and get the number os devices>>\nstrategy = tf.distribute.MirroredStrategy()\nprint('DEVICES AVAILABLE: {}'.format(strategy.num_replicas_in_sync))","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:12:01.254302Z","iopub.execute_input":"2023-09-18T19:12:01.255078Z","iopub.status.idle":"2023-09-18T19:12:06.600710Z","shell.execute_reply.started":"2023-09-18T19:12:01.255037Z","shell.execute_reply":"2023-09-18T19:12:06.599597Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.python.client import device_lib\nprint(device_lib.list_local_devices())","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:12:06.603193Z","iopub.execute_input":"2023-09-18T19:12:06.603851Z","iopub.status.idle":"2023-09-18T19:12:06.615404Z","shell.execute_reply.started":"2023-09-18T19:12:06.603800Z","shell.execute_reply":"2023-09-18T19:12:06.614179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Training Dataset","metadata":{}},{"cell_type":"code","source":"shutil.register_unpack_format('7zip',['.7z'],unpack_7zarchive)\nshutil.unpack_archive('../input/cifar-10/train.7z', '/kaggle/temp/')","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:12:06.616926Z","iopub.execute_input":"2023-09-18T19:12:06.617604Z","iopub.status.idle":"2023-09-18T19:13:09.411192Z","shell.execute_reply.started":"2023-09-18T19:12:06.617568Z","shell.execute_reply":"2023-09-18T19:13:09.410109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels = pd.read_csv('/kaggle/input/cifar-10/trainLabels.csv')\n\nclasses = train_labels['label'].unique()\nprint(classes)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:09.413494Z","iopub.execute_input":"2023-09-18T19:13:09.413925Z","iopub.status.idle":"2023-09-18T19:13:09.474376Z","shell.execute_reply.started":"2023-09-18T19:13:09.413887Z","shell.execute_reply":"2023-09-18T19:13:09.473316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Splitting the Data ","metadata":{}},{"cell_type":"code","source":"def split_train_validation_data(train_labels, source_dir, train_dir, valid_dir, split_ratio=0.8):\n    # Create validation directory if it doesn't exist\n    if not os.path.exists(valid_dir):\n        os.mkdir(valid_dir)\n    \n    for class_name in train_labels['label'].unique():\n        path_train = os.path.join(train_dir, class_name)\n        path_valid = os.path.join(valid_dir, class_name)\n\n        # Create class directories if they don't exist\n        os.makedirs(path_train, exist_ok=True)\n        os.makedirs(path_valid, exist_ok=True)\n\n    for _, row in train_labels.iterrows():\n        id = str(row[\"id\"]) + \".png\"\n        source_path = os.path.join(source_dir, id)\n\n        p = random.random()\n        if p <= split_ratio:\n            target_path = os.path.join(train_dir, row[\"label\"], id)\n        else:\n            target_path = os.path.join(valid_dir, row[\"label\"], id)\n\n        shutil.move(source_path, target_path)\n\nsource_dir = \"/kaggle/temp/train\"\ntrain_dir = \"/kaggle/temp/train\"\nvalid_dir = \"/kaggle/temp/valid\"\ntrain_labels = pd.read_csv('/kaggle/input/cifar-10/trainLabels.csv')\n\nsplit_train_validation_data(train_labels, source_dir, train_dir, valid_dir, split_ratio=0.8)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:15.820125Z","iopub.execute_input":"2023-09-18T19:13:15.820516Z","iopub.status.idle":"2023-09-18T19:13:22.207447Z","shell.execute_reply.started":"2023-09-18T19:13:15.820487Z","shell.execute_reply":"2023-09-18T19:13:22.206417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Image Data Generator","metadata":{}},{"cell_type":"code","source":"# Data augmentation settings\ntrain_datagen = ImageDataGenerator(\n    rotation_range=10,\n    zoom_range=0.1,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    horizontal_flip=True,\n    vertical_flip=False,\n    rescale=1./255\n)\n\nvalid_datagen = ImageDataGenerator(rescale=1./255)\n\nbatch_size = 128\ntrain_generator = train_datagen.flow_from_directory(\n    directory='/kaggle/temp/train/',\n    shuffle=True,\n    target_size=(32, 32),\n    batch_size=batch_size,\n    class_mode='categorical' \n)\n\nvalid_generator = valid_datagen.flow_from_directory(\n    directory='/kaggle/temp/valid/',\n    shuffle=True,\n    target_size=(32, 32),\n    batch_size=batch_size,\n    class_mode='categorical'  \n)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:22.209473Z","iopub.execute_input":"2023-09-18T19:13:22.209894Z","iopub.status.idle":"2023-09-18T19:13:23.560651Z","shell.execute_reply.started":"2023-09-18T19:13:22.209830Z","shell.execute_reply":"2023-09-18T19:13:23.559728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Visualziation","metadata":{}},{"cell_type":"code","source":"batch = next(train_generator)\nimages, labels = batch\n\n\ndef plot_images(images, labels, num_cols=5):\n    num_images = len(images)\n    num_rows = int(np.ceil(num_images / num_cols))\n\n    fig, axes = plt.subplots(num_rows, num_cols, figsize=(15, 3 * num_rows))\n    for i, ax in enumerate(axes.flat):\n        if i < num_images:\n            ax.imshow(images[i])\n            ax.set_title(f\"Class: {labels[i].argmax()}\")  \n        ax.axis('off')\n    \n    plt.show()\n\nplot_images(images, labels)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:23.564224Z","iopub.execute_input":"2023-09-18T19:13:23.564993Z","iopub.status.idle":"2023-09-18T19:13:32.797501Z","shell.execute_reply.started":"2023-09-18T19:13:23.564956Z","shell.execute_reply":"2023-09-18T19:13:32.796600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Create the CNN Model","metadata":{}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(64,(4,4),input_shape=(32,32,3),activation='relu',padding='same'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(64,(4,4),input_shape=(32,32,3),activation='relu',padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(0.2)) #to avoid overfitting \n\nmodel.add(Conv2D(128,(4,4),input_shape=(32,32,3),activation='relu',padding='same'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(128,(4,4),input_shape=(32,32,3),activation='relu',padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(128,(4,4),input_shape=(32,32,3),activation='relu',padding='same'))\nmodel.add(BatchNormalization())\n\nmodel.add(Conv2D(128,(4,4),input_shape=(32,32,3),activation='relu',padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(0.35))\n\nmodel.add(Flatten())\n\nmodel.add(Dense(256, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(10, activation='softmax'))\n\nmodel.compile(loss='categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(0.001), metrics=['accuracy'])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:32.799986Z","iopub.execute_input":"2023-09-18T19:13:32.800342Z","iopub.status.idle":"2023-09-18T19:13:33.193675Z","shell.execute_reply.started":"2023-09-18T19:13:32.800307Z","shell.execute_reply":"2023-09-18T19:13:33.192829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"keras.utils.plot_model(model)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:33.194926Z","iopub.execute_input":"2023-09-18T19:13:33.195531Z","iopub.status.idle":"2023-09-18T19:13:33.556033Z","shell.execute_reply.started":"2023-09-18T19:13:33.195498Z","shell.execute_reply":"2023-09-18T19:13:33.554888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mcp_save = ModelCheckpoint('../working/best_model', save_best_only=True, monitor='val_accuracy', mode='max')","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:33.557377Z","iopub.execute_input":"2023-09-18T19:13:33.558223Z","iopub.status.idle":"2023-09-18T19:13:33.563979Z","shell.execute_reply.started":"2023-09-18T19:13:33.558174Z","shell.execute_reply":"2023-09-18T19:13:33.562579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_generator,epochs=30, validation_data=valid_generator,steps_per_epoch=train_generator.n//train_generator.batch_size,\n         validation_steps= valid_generator.n//valid_generator.batch_size,workers=8,use_multiprocessing=True)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:13:33.565515Z","iopub.execute_input":"2023-09-18T19:13:33.567436Z","iopub.status.idle":"2023-09-18T19:45:52.331800Z","shell.execute_reply.started":"2023-09-18T19:13:33.567400Z","shell.execute_reply":"2023-09-18T19:45:52.330662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Extracting Test Data","metadata":{}},{"cell_type":"code","source":"shutil.unpack_archive('/kaggle/input/cifar-10/test.7z','/kaggle/temp/test')\nshutil.unregister_unpack_format('7zip')","metadata":{"execution":{"iopub.status.busy":"2023-09-18T19:45:52.334202Z","iopub.execute_input":"2023-09-18T19:45:52.334608Z","iopub.status.idle":"2023-09-18T20:05:38.503806Z","shell.execute_reply.started":"2023-09-18T19:45:52.334570Z","shell.execute_reply":"2023-09-18T20:05:38.502489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Preprocessing Test Data","metadata":{}},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\n\ndef preprocess_test_data(directory, target_size=(32, 32), batch_size=64):\n    test_generator = test_datagen.flow_from_directory(\n        directory=directory,\n        target_size=target_size,\n        batch_size=batch_size,\n        class_mode=None,\n        shuffle=False \n    )\n    return test_generator\n\ntest_directory = '/kaggle/temp/test'\n\ntest_gen = preprocess_test_data(test_directory, target_size=(32, 32), batch_size=64)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T20:05:38.505645Z","iopub.execute_input":"2023-09-18T20:05:38.506046Z","iopub.status.idle":"2023-09-18T20:05:45.952739Z","shell.execute_reply.started":"2023-09-18T20:05:38.506009Z","shell.execute_reply":"2023-09-18T20:05:45.951658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Model Predictions","metadata":{}},{"cell_type":"code","source":"test_gen.reset()\npredictions_vecs = model.predict(test_gen)\n\npredictions_final = np.argmax(predictions_vecs, axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T20:05:45.956450Z","iopub.execute_input":"2023-09-18T20:05:45.956982Z","iopub.status.idle":"2023-09-18T20:07:58.900165Z","shell.execute_reply.started":"2023-09-18T20:05:45.956942Z","shell.execute_reply":"2023-09-18T20:07:58.899068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef map_predictions_to_class_names(predictions_final, train_generator, test_gen):\n    # Create a dictionary to map numeric labels to class names\n    classes = {value: key for key, value in train_generator.class_indices.items()}\n\n    predicted_classes = [classes[i] for i in predictions_final]\n\n    filenames_wo_ext = [int(fname.split(\"/\")[1].split(\".\")[0]) - 1 for fname in test_gen.filenames]\n    predicted_classes_final = np.empty(len(filenames_wo_ext), dtype=np.dtype('U20'))\n\n    # Fill the predicted_classes_final array based on image IDs\n    for i, idx in enumerate(filenames_wo_ext):\n        predicted_classes_final[idx] = predicted_classes[i]\n\n    return predicted_classes_final\n\npredicted_classes_final = map_predictions_to_class_names(predictions_final, train_generator, test_gen)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-18T20:07:58.901732Z","iopub.execute_input":"2023-09-18T20:07:58.902111Z","iopub.status.idle":"2023-09-18T20:07:59.345227Z","shell.execute_reply.started":"2023-09-18T20:07:58.902076Z","shell.execute_reply":"2023-09-18T20:07:59.344063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input/cifar-10/sampleSubmission.csv',header='infer')\nsub.info()","metadata":{"execution":{"iopub.status.busy":"2023-09-18T20:07:59.347231Z","iopub.execute_input":"2023-09-18T20:07:59.347679Z","iopub.status.idle":"2023-09-18T20:07:59.515799Z","shell.execute_reply.started":"2023-09-18T20:07:59.347623Z","shell.execute_reply":"2023-09-18T20:07:59.514762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Submission ","metadata":{}},{"cell_type":"code","source":"\ndef generate_custom_submission(predicted_classes_final, sample_submission_path, custom_submission_path):\n   \n    sample_submission = pd.read_csv(sample_submission_path, header='infer')\n    sample_submission['label'] = predicted_classes_final\n\n    sample_submission.to_csv(custom_submission_path, index=False)\n    sample_submission.info()\n\n    print(f'Custom submission file saved to: {custom_submission_path}')\n\nsample_submission_path = '/kaggle/input/cifar-10/sampleSubmission.csv'\ncustom_submission_path = 'custom_submission.csv' \n\ngenerate_custom_submission(predicted_classes_final, sample_submission_path, custom_submission_path)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T20:07:59.517201Z","iopub.execute_input":"2023-09-18T20:07:59.517888Z","iopub.status.idle":"2023-09-18T20:08:00.326785Z","shell.execute_reply.started":"2023-09-18T20:07:59.517831Z","shell.execute_reply":"2023-09-18T20:08:00.325766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}