{"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-19T04:57:40.725020Z","iopub.execute_input":"2023-09-19T04:57:40.725338Z","iopub.status.idle":"2023-09-19T04:57:40.745543Z","shell.execute_reply.started":"2023-09-19T04:57:40.725310Z","shell.execute_reply":"2023-09-19T04:57:40.744628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Install Required Libraries\n!pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2023-09-19T04:57:40.746702Z","iopub.execute_input":"2023-09-19T04:57:40.747045Z","iopub.status.idle":"2023-09-19T04:57:45.690290Z","shell.execute_reply.started":"2023-09-19T04:57:40.747015Z","shell.execute_reply":"2023-09-19T04:57:45.688976Z"},"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-19T04:57:45.691857Z","iopub.execute_input":"2023-09-19T04:57:45.692179Z","iopub.status.idle":"2023-09-19T04:57:45.701696Z","shell.execute_reply.started":"2023-09-19T04:57:45.692146Z","shell.execute_reply":"2023-09-19T04:57:45.700843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Setting up TPU","metadata":{}},{"cell_type":"code","source":"# detect and init the TPU\ntpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()\n\n# instantiate a distribution strategy\ntpu_strategy = tf.distribute.TPUStrategy(tpu)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T04:57:45.702734Z","iopub.execute_input":"2023-09-19T04:57:45.703011Z","iopub.status.idle":"2023-09-19T04:57:51.601466Z","shell.execute_reply.started":"2023-09-19T04:57:45.702987Z","shell.execute_reply":"2023-09-19T04:57:51.599802Z"},"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-19T04:57:51.602696Z","iopub.execute_input":"2023-09-19T04:57:51.603014Z","iopub.status.idle":"2023-09-19T04:57:51.609378Z","shell.execute_reply.started":"2023-09-19T04:57:51.602985Z","shell.execute_reply":"2023-09-19T04:57:51.608457Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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-19T04:57:53.379849Z","iopub.execute_input":"2023-09-19T04:57:53.380202Z","iopub.status.idle":"2023-09-19T04:58:56.068190Z","shell.execute_reply.started":"2023-09-19T04:57:53.380174Z","shell.execute_reply":"2023-09-19T04:58:56.067049Z"},"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-19T04:58:56.069945Z","iopub.execute_input":"2023-09-19T04:58:56.070255Z","iopub.status.idle":"2023-09-19T04:58:56.107126Z","shell.execute_reply.started":"2023-09-19T04:58:56.070228Z","shell.execute_reply":"2023-09-19T04:58:56.106104Z"},"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-19T04:58:56.108216Z","iopub.execute_input":"2023-09-19T04:58:56.108505Z","iopub.status.idle":"2023-09-19T04:59:03.831373Z","shell.execute_reply.started":"2023-09-19T04:58:56.108479Z","shell.execute_reply":"2023-09-19T04:59:03.830179Z"},"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-19T04:59:03.833257Z","iopub.execute_input":"2023-09-19T04:59:03.833591Z","iopub.status.idle":"2023-09-19T04:59:05.821071Z","shell.execute_reply.started":"2023-09-19T04:59:03.833561Z","shell.execute_reply":"2023-09-19T04:59:05.820065Z"},"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-19T04:59:12.404304Z","iopub.execute_input":"2023-09-19T04:59:12.404819Z","iopub.status.idle":"2023-09-19T04:59:21.630484Z","shell.execute_reply.started":"2023-09-19T04:59:12.404727Z","shell.execute_reply":"2023-09-19T04:59:21.629488Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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-19T04:59:21.632076Z","iopub.execute_input":"2023-09-19T04:59:21.632364Z","iopub.status.idle":"2023-09-19T04:59:21.952784Z","shell.execute_reply.started":"2023-09-19T04:59:21.632338Z","shell.execute_reply":"2023-09-19T04:59:21.951872Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"keras.utils.plot_model(model)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T04:59:21.953867Z","iopub.execute_input":"2023-09-19T04:59:21.954149Z","iopub.status.idle":"2023-09-19T04:59:21.959047Z","shell.execute_reply.started":"2023-09-19T04:59:21.954124Z","shell.execute_reply":"2023-09-19T04:59:21.958232Z"},"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-19T04:59:21.960946Z","iopub.execute_input":"2023-09-19T04:59:21.961282Z","iopub.status.idle":"2023-09-19T04:59:21.969200Z","shell.execute_reply.started":"2023-09-19T04:59:21.961254Z","shell.execute_reply":"2023-09-19T04:59:21.968393Z"},"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-19T04:59:21.970230Z","iopub.execute_input":"2023-09-19T04:59:21.970526Z","iopub.status.idle":"2023-09-19T06:07:24.062484Z","shell.execute_reply.started":"2023-09-19T04:59:21.970492Z","shell.execute_reply":"2023-09-19T06:07:24.061044Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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-19T06:07:24.064355Z","iopub.execute_input":"2023-09-19T06:07:24.065369Z","iopub.status.idle":"2023-09-19T06:29:15.148662Z","shell.execute_reply.started":"2023-09-19T06:07:24.065323Z","shell.execute_reply":"2023-09-19T06:29:15.147402Z"},"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-19T06:29:15.151050Z","iopub.execute_input":"2023-09-19T06:29:15.151346Z","iopub.status.idle":"2023-09-19T06:29:23.878107Z","shell.execute_reply.started":"2023-09-19T06:29:15.151320Z","shell.execute_reply":"2023-09-19T06:29:23.876812Z"},"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-19T06:29:23.879751Z","iopub.execute_input":"2023-09-19T06:29:23.880112Z","iopub.status.idle":"2023-09-19T06:32:14.841362Z","shell.execute_reply.started":"2023-09-19T06:29:23.880082Z","shell.execute_reply":"2023-09-19T06:32:14.839998Z"},"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-19T06:32:14.843442Z","iopub.execute_input":"2023-09-19T06:32:14.843824Z","iopub.status.idle":"2023-09-19T06:32:15.275235Z","shell.execute_reply.started":"2023-09-19T06:32:14.843787Z","shell.execute_reply":"2023-09-19T06:32:15.273951Z"},"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-19T06:32:15.276406Z","iopub.execute_input":"2023-09-19T06:32:15.276695Z","iopub.status.idle":"2023-09-19T06:32:15.403123Z","shell.execute_reply.started":"2023-09-19T06:32:15.276669Z","shell.execute_reply":"2023-09-19T06:32:15.401875Z"},"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_TPU.csv' \n\ngenerate_custom_submission(predicted_classes_final, sample_submission_path, custom_submission_path)","metadata":{"execution":{"iopub.status.busy":"2023-09-19T06:32:15.404320Z","iopub.execute_input":"2023-09-19T06:32:15.404617Z","iopub.status.idle":"2023-09-19T06:32:16.013009Z","shell.execute_reply.started":"2023-09-19T06:32:15.404590Z","shell.execute_reply":"2023-09-19T06:32:16.011881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}