{"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":"try:\n    import py7zr\n    import torchmetrics, mlxtend\n    from torchsummary import summary\nexcept:\n    !pip install --upgrade pip\n    !pip install py7zr\n    !pip install -q torchmetrics -U mlxtend\n    !pip install torchsummary\n\n    import torchmetrics, mlxtend\n    import torchsummary\n    import py7zr\n\n!pip uninstall protobuf -y\n!pip install --force-reinstall -v \"protobuf==3.20.x\"\n!pip install pytorch_lightning \n\nimport pytorch_lightning as pl\n\nimport os\nimport numpy as np\nimport pandas as pd\n\nfrom tqdm.auto import tqdm\n\n# Import the visualization library\nimport matplotlib.pyplot as plt\nfrom matplotlib import image\n\n# Import PyTorch\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader\n\n# imports the torch_xla package\nimport torch_xla\nimport torch_xla.core.xla_model as xm\n\n# Import matplotlib for visualization\nimport matplotlib.pyplot as plt\n\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.preprocessing import LabelEncoder\n\nprint(f\"PyTorch version: {torch.__version__}\")\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:04:56.722736Z","iopub.execute_input":"2023-09-20T19:04:56.723199Z","iopub.status.idle":"2023-09-20T19:05:06.332766Z","shell.execute_reply.started":"2023-09-20T19:04:56.723165Z","shell.execute_reply":"2023-09-20T19:05:06.331570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Importing the Data","metadata":{}},{"cell_type":"code","source":"for dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n        \ninput_dir = os.path.join(\"/kaggle\", \"input\", \"cifar-10/\")\noutput_dir = os.path.join(\"/kaggle\", \"output\", \"cifar-10/\")\n\n# Create the output directory if it doesn't exist\nos.makedirs(output_dir, exist_ok=True)\n\ninput_dir, output_dir","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:05:06.334941Z","iopub.execute_input":"2023-09-20T19:05:06.335424Z","iopub.status.idle":"2023-09-20T19:05:06.350591Z","shell.execute_reply.started":"2023-09-20T19:05:06.335387Z","shell.execute_reply":"2023-09-20T19:05:06.349810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"zip_files = [file for file in os.listdir(input_dir) if file[-3:] == \".7z\"]\n\nfor file in zip_files:\n    print(f\"Extracting the file {file}\")\n    \n    with py7zr.SevenZipFile(os.path.join(input_dir, file), mode='r') as z:\n        z.extractall(path=output_dir)\n    \n    print(f\"Extraction Complete\")","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:05:06.351821Z","iopub.execute_input":"2023-09-20T19:05:06.352134Z","iopub.status.idle":"2023-09-20T19:27:45.183654Z","shell.execute_reply.started":"2023-09-20T19:05:06.352106Z","shell.execute_reply":"2023-09-20T19:27:45.182644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels = pd.read_csv(input_dir + \"trainLabels.csv\", index_col=[\"id\"]).squeeze()\nlabel_encoder = LabelEncoder().fit(train_labels)\n\nclasses = label_encoder.classes_\n\nprint('Classes in CIFAR10')\nprint(classes)\n\nprint(\"\\nThe number of classes is\")\nprint(len(classes))\n\nprint(\"\\nNumber of training data records\")\nprint(train_labels.shape[0])\n\nprint(\"\\nThe first 5 labels\")\nprint(train_labels.head(5))","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:27:45.186226Z","iopub.execute_input":"2023-09-20T19:27:45.186533Z","iopub.status.idle":"2023-09-20T19:27:45.231804Z","shell.execute_reply.started":"2023-09-20T19:27:45.186505Z","shell.execute_reply":"2023-09-20T19:27:45.230950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = []\nfor i in range(1, len(train_labels) + 1):\n    img = image.imread('/kaggle/output/cifar-10/train/' + str(i) + \".png\")\n    train_data.append([img, label_encoder.transform([train_labels[i]])[0]])\n    \nlen(train_data)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:27:45.233125Z","iopub.execute_input":"2023-09-20T19:27:45.233453Z","iopub.status.idle":"2023-09-20T19:28:08.774120Z","shell.execute_reply.started":"2023-09-20T19:27:45.233424Z","shell.execute_reply":"2023-09-20T19:28:08.773272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_encoder.inverse_transform([train_data[0][1]]), train_data[0][0].shape","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:28:08.775587Z","iopub.execute_input":"2023-09-20T19:28:08.775986Z","iopub.status.idle":"2023-09-20T19:28:08.783221Z","shell.execute_reply.started":"2023-09-20T19:28:08.775945Z","shell.execute_reply":"2023-09-20T19:28:08.782426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creation of and Training The Model","metadata":{}},{"cell_type":"code","source":"class Configs:\n    batch_size = 32,\n    shuffle    = True,\n    epochs     = 30\n    \nconfigs = Configs()","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:28:08.784375Z","iopub.execute_input":"2023-09-20T19:28:08.784706Z","iopub.status.idle":"2023-09-20T19:28:08.801155Z","shell.execute_reply.started":"2023-09-20T19:28:08.784675Z","shell.execute_reply":"2023-09-20T19:28:08.800346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNN_Model(pl.LightningModule):\n    def __init__(self, input_shape: int = 3, output_shape: int = 10):\n        super().__init__()\n\n        self.conv1 = nn.Conv2d(3, 32, 5)\n        self.conv2 = nn.Conv2d(32, 64, 5)\n        self.pool = nn.MaxPool2d(2, 2)\n\n        self.fc1 = nn.Linear(64 * 5 * 5, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 10)\n\n    def forward(self, x):\n        x = self.pool(F.relu(self.conv1(x)))\n        x = self.pool(F.relu(self.conv2(x)))\n        x = torch.flatten(x, 1) # flatten all dimensions except batch\n        x = F.relu(self.fc1(x))\n        x = F.relu(self.fc2(x))\n        x = self.fc3(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:28:08.802238Z","iopub.execute_input":"2023-09-20T19:28:08.802512Z","iopub.status.idle":"2023-09-20T19:28:08.812715Z","shell.execute_reply.started":"2023-09-20T19:28:08.802487Z","shell.execute_reply":"2023-09-20T19:28:08.811928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CNN_Model()\n\n# Setup loss and optimizer\nloss_fn = nn.CrossEntropyLoss().to(device)\noptimizer = torch.optim.SGD(params=model.parameters(), lr=0.001, momentum=0.9)\naccuracy = torchmetrics.Accuracy(task=\"multiclass\", num_classes=10).to(device)\n\nmodel.to(device)\nmodel, device","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:28:08.813784Z","iopub.execute_input":"2023-09-20T19:28:08.814060Z","iopub.status.idle":"2023-09-20T19:28:08.834696Z","shell.execute_reply.started":"2023-09-20T19:28:08.814035Z","shell.execute_reply":"2023-09-20T19:28:08.833890Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataloader = DataLoader(\n    train_data, \n    batch_size   = configs.batch_size[0],\n    shuffle      = configs.shuffle,\n)\n\nprint(f\"Length of train dataloader: {len(train_dataloader)} batches of {configs.batch_size[0]}\")","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:28:08.837871Z","iopub.execute_input":"2023-09-20T19:28:08.838136Z","iopub.status.idle":"2023-09-20T19:28:08.843578Z","shell.execute_reply.started":"2023-09-20T19:28:08.838113Z","shell.execute_reply":"2023-09-20T19:28:08.842807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Train the Model","metadata":{}},{"cell_type":"code","source":"model.train()\nmodel.to(device)\n\nfor epoch in tqdm(range(configs.epochs)):\n    print(f\"Epoch: {epoch+1}\\n---------\")\n\n    train_loss, train_acc = 0, 0\n    \n    for batch, (X, y) in enumerate(train_dataloader):\n        # Send data to GPU\n        X, y = X.reshape(-1, 3, 32, 32).to(device), y.to(device)\n        \n        # Optimizer zero grad\n        optimizer.zero_grad()\n        \n        #  Forward pass\n        y_logits = model(X)\n        y_preds  = torch.softmax(y_logits, dim=1)\n        #  Calculate loss\n        loss = loss_fn(y_logits, y) \n        #  Loss backward\n        loss.backward()\n        optimizer.step()\n        \n        train_loss += loss\n        train_acc += accuracy(y, y_preds.argmax(dim=1)) # Go from logits -> pred labels\n        \n    # Calculate loss and accuracy per epoch and print out what's happening\n    train_loss /= len(train_dataloader)\n    train_acc /= len(train_dataloader)\n    print(f\"Train loss: {train_loss:.5f} | Train accuracy: {train_acc:.2f}%\")","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:28:08.844688Z","iopub.execute_input":"2023-09-20T19:28:08.844996Z","iopub.status.idle":"2023-09-20T19:33:47.914410Z","shell.execute_reply.started":"2023-09-20T19:28:08.844969Z","shell.execute_reply":"2023-09-20T19:33:47.913264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction on Test Data","metadata":{}},{"cell_type":"code","source":"idxs = np.random.choice(1000, 24)\n\ntest_data = []\nfor i in idxs:\n    img = image.imread('/kaggle/output/cifar-10/test/' + str(i) + \".png\")\n    test_data.append(img)\n    \ntest_data = np.array(test_data)\ntest_data.shape","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:33:47.916108Z","iopub.execute_input":"2023-09-20T19:33:47.916498Z","iopub.status.idle":"2023-09-20T19:33:47.934843Z","shell.execute_reply.started":"2023-09-20T19:33:47.916463Z","shell.execute_reply":"2023-09-20T19:33:47.933825Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\ntest_labels = model(torch.tensor(test_data.reshape(-1, 3, 32, 32)).to(device)).argmax(dim=1)\ntest_labels = label_encoder.inverse_transform(np.array(test_labels.cpu()))\n\ntest_labels\n\nidx = np.random.randint(18)\n\nplt.imshow(test_data[idx])\nplt.title(test_labels[idx])\nplt.axis(False)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:33:47.936223Z","iopub.execute_input":"2023-09-20T19:33:47.936583Z","iopub.status.idle":"2023-09-20T19:33:48.211107Z","shell.execute_reply.started":"2023-09-20T19:33:47.936543Z","shell.execute_reply":"2023-09-20T19:33:48.210076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 5))\n \nnum_rows = 3\nnum_cols = 8\n\nfor idx in range(num_rows * num_cols):\n    img         = test_data[idx]\n    label       = test_labels[idx]\n    \n    ax = plt.subplot(num_rows, num_cols, idx + 1)\n    plt.imshow(img)\n    plt.title(label)\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:33:48.212468Z","iopub.execute_input":"2023-09-20T19:33:48.213026Z","iopub.status.idle":"2023-09-20T19:33:49.913827Z","shell.execute_reply.started":"2023-09-20T19:33:48.212991Z","shell.execute_reply":"2023-09-20T19:33:49.912807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"# putting the model in evaluation mode\nmodel.eval()","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:33:49.915204Z","iopub.execute_input":"2023-09-20T19:33:49.915554Z","iopub.status.idle":"2023-09-20T19:33:49.922471Z","shell.execute_reply.started":"2023-09-20T19:33:49.915522Z","shell.execute_reply":"2023-09-20T19:33:49.921601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"no_of_test_images = len(os.listdir(\"/kaggle/output/cifar-10/test\"))\nmodel.eval()\ntest_data = []\n\nfor i in range(1, no_of_test_images + 1):\n    img = image.imread('/kaggle/output/cifar-10/test/' + str(i) + \".png\")\n    test_data.append([img, i])\n\ntest_dataloader = DataLoader(\n    test_data, \n    batch_size   = configs.batch_size[0],\n    shuffle      = False,\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:33:49.923540Z","iopub.execute_input":"2023-09-20T19:33:49.923826Z","iopub.status.idle":"2023-09-20T19:35:12.362037Z","shell.execute_reply.started":"2023-09-20T19:33:49.923801Z","shell.execute_reply":"2023-09-20T19:35:12.360747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = []\nlabels = []\n\nfor (X, y) in tqdm(test_dataloader):\n    X = X.reshape(-1, 3, 32, 32)\n    y_logits = model(X)\n    y_preds  = torch.softmax(y_logits, dim=1).argmax(dim=1).cpu()\n    labels += label_encoder.inverse_transform(y_preds).tolist()\n    ids += y.squeeze().tolist()","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:35:12.363566Z","iopub.execute_input":"2023-09-20T19:35:12.363972Z","iopub.status.idle":"2023-09-20T19:35:40.428112Z","shell.execute_reply.started":"2023-09-20T19:35:12.363928Z","shell.execute_reply":"2023-09-20T19:35:40.426910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(ids), len(labels), ids[1], labels[1]","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:35:40.429627Z","iopub.execute_input":"2023-09-20T19:35:40.430468Z","iopub.status.idle":"2023-09-20T19:35:40.437689Z","shell.execute_reply.started":"2023-09-20T19:35:40.430433Z","shell.execute_reply":"2023-09-20T19:35:40.436698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create a DataFrame for the submission\nsubmission_df = pd.DataFrame({\n    'id': ids,\n    'label': labels\n})\n\n# Save the submission file with class labels\nsubmission_df.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:35:40.439015Z","iopub.execute_input":"2023-09-20T19:35:40.439345Z","iopub.status.idle":"2023-09-20T19:35:40.979163Z","shell.execute_reply.started":"2023-09-20T19:35:40.439316Z","shell.execute_reply":"2023-09-20T19:35:40.978154Z"},"trusted":true},"execution_count":null,"outputs":[]}]}