{"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 py7zr\n    !pip install -q torchmetrics -U mlxtend # <- Note: If you're using Google Colab, this may require restarting the runtime\n    !pip install torchsummary\n    \n    import torchmetrics, mlxtend\n    import torchsummary\n    import py7zr\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# Torchvision\nfrom torchvision import datasets, transforms\n\n# Import matplotlib for visualization\nimport matplotlib.pyplot as plt\n\nfrom sklearn.preprocessing import LabelEncoder\n\nprint(f\"PyTorch version: {torch.__version__}\")\ndevice = \"cuda\" if torch.cuda.is_available() else None\ndevice","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:02:50.367664Z","iopub.execute_input":"2023-09-20T19:02:50.368133Z","iopub.status.idle":"2023-09-20T19:03:54.497110Z","shell.execute_reply.started":"2023-09-20T19:02:50.368094Z","shell.execute_reply":"2023-09-20T19:03:54.495909Z"},"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:03:54.500145Z","iopub.execute_input":"2023-09-20T19:03:54.500981Z","iopub.status.idle":"2023-09-20T19:03:54.515074Z","shell.execute_reply.started":"2023-09-20T19:03:54.500938Z","shell.execute_reply":"2023-09-20T19:03:54.513718Z"},"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:03:54.517117Z","iopub.execute_input":"2023-09-20T19:03:54.517867Z","iopub.status.idle":"2023-09-20T19:26:22.960445Z","shell.execute_reply.started":"2023-09-20T19:03:54.517829Z","shell.execute_reply":"2023-09-20T19:26:22.959330Z"},"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:26:22.961938Z","iopub.execute_input":"2023-09-20T19:26:22.962963Z","iopub.status.idle":"2023-09-20T19:26:23.040204Z","shell.execute_reply.started":"2023-09-20T19:26:22.962925Z","shell.execute_reply":"2023-09-20T19:26:23.039067Z"},"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:26:23.043799Z","iopub.execute_input":"2023-09-20T19:26:23.044269Z","iopub.status.idle":"2023-09-20T19:26:46.596139Z","shell.execute_reply.started":"2023-09-20T19:26:23.044240Z","shell.execute_reply":"2023-09-20T19:26:46.594980Z"},"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:26:46.598432Z","iopub.execute_input":"2023-09-20T19:26:46.598894Z","iopub.status.idle":"2023-09-20T19:26:46.616833Z","shell.execute_reply.started":"2023-09-20T19:26:46.598854Z","shell.execute_reply":"2023-09-20T19:26:46.615717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idx = np.random.randint(50000)\n\nplt.imshow(train_data[idx][0])\nplt.title(label_encoder.inverse_transform([train_data[idx][1]])[0])\nplt.axis(False)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:26:46.618316Z","iopub.execute_input":"2023-09-20T19:26:46.618688Z","iopub.status.idle":"2023-09-20T19:26:46.853602Z","shell.execute_reply.started":"2023-09-20T19:26:46.618647Z","shell.execute_reply":"2023-09-20T19:26:46.852558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 5))\n \nnum_rows = 3\nnum_cols = 8\n\nfor idx in range(num_rows * num_cols):\n    idx_to_show = np.random.choice(len(train_labels))\n    img    = train_data[idx_to_show][0]\n    label  = label_encoder.inverse_transform([train_data[idx_to_show][1]])[0]\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:26:46.855186Z","iopub.execute_input":"2023-09-20T19:26:46.855846Z","iopub.status.idle":"2023-09-20T19:26:48.686569Z","shell.execute_reply.started":"2023-09-20T19:26:46.855807Z","shell.execute_reply":"2023-09-20T19:26:48.685708Z"},"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     = 128\n    \nconfigs = Configs()","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:26:48.687695Z","iopub.execute_input":"2023-09-20T19:26:48.688924Z","iopub.status.idle":"2023-09-20T19:26:48.694540Z","shell.execute_reply.started":"2023-09-20T19:26:48.688885Z","shell.execute_reply":"2023-09-20T19:26:48.693309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNN_Model(nn.Module):\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\n","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:26:48.696082Z","iopub.execute_input":"2023-09-20T19:26:48.696554Z","iopub.status.idle":"2023-09-20T19:26:48.713602Z","shell.execute_reply.started":"2023-09-20T19:26:48.696503Z","shell.execute_reply":"2023-09-20T19:26:48.712327Z"},"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\n# Running on multiple GPUs\nmodel = nn.DataParallel(model, device_ids=[0, 1])\n\nmodel.to(device)\n#summary(model, (3, 32, 32))","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:26:48.715944Z","iopub.execute_input":"2023-09-20T19:26:48.716265Z","iopub.status.idle":"2023-09-20T19:26:53.786559Z","shell.execute_reply.started":"2023-09-20T19:26:48.716239Z","shell.execute_reply":"2023-09-20T19:26:53.785349Z"},"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:26:53.788143Z","iopub.execute_input":"2023-09-20T19:26:53.789289Z","iopub.status.idle":"2023-09-20T19:26:53.796378Z","shell.execute_reply.started":"2023-09-20T19:26:53.789250Z","shell.execute_reply":"2023-09-20T19:26:53.795235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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:26:53.797899Z","iopub.execute_input":"2023-09-20T19:26:53.798840Z","iopub.status.idle":"2023-09-20T19:53:27.767884Z","shell.execute_reply.started":"2023-09-20T19:26:53.798800Z","shell.execute_reply":"2023-09-20T19:53:27.766497Z"},"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:53:27.774494Z","iopub.execute_input":"2023-09-20T19:53:27.775554Z","iopub.status.idle":"2023-09-20T19:53:27.795827Z","shell.execute_reply.started":"2023-09-20T19:53:27.775513Z","shell.execute_reply":"2023-09-20T19:53:27.794321Z"},"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","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:53:27.819218Z","iopub.execute_input":"2023-09-20T19:53:27.820013Z","iopub.status.idle":"2023-09-20T19:53:27.846865Z","shell.execute_reply.started":"2023-09-20T19:53:27.819973Z","shell.execute_reply":"2023-09-20T19:53:27.845595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idx = 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:53:27.854123Z","iopub.execute_input":"2023-09-20T19:53:27.854463Z","iopub.status.idle":"2023-09-20T19:53:28.069734Z","shell.execute_reply.started":"2023-09-20T19:53:27.854435Z","shell.execute_reply":"2023-09-20T19:53:28.068604Z"},"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:53:28.071518Z","iopub.execute_input":"2023-09-20T19:53:28.071925Z","iopub.status.idle":"2023-09-20T19:53:29.970420Z","shell.execute_reply.started":"2023-09-20T19:53:28.071885Z","shell.execute_reply":"2023-09-20T19:53:29.969366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:53:29.971820Z","iopub.execute_input":"2023-09-20T19:53:29.972487Z","iopub.status.idle":"2023-09-20T19:53:29.981476Z","shell.execute_reply.started":"2023-09-20T19:53:29.972447Z","shell.execute_reply":"2023-09-20T19:53:29.980242Z"},"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]) ","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:53:29.982951Z","iopub.execute_input":"2023-09-20T19:53:29.984099Z","iopub.status.idle":"2023-09-20T19:55:33.669460Z","shell.execute_reply.started":"2023-09-20T19:53:29.984054Z","shell.execute_reply":"2023-09-20T19:55:33.668280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataloader = DataLoader(\n    test_data, \n    batch_size   = configs.batch_size[0],\n    shuffle      = False,\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:55:33.671996Z","iopub.execute_input":"2023-09-20T19:55:33.672760Z","iopub.status.idle":"2023-09-20T19:55:33.679675Z","shell.execute_reply.started":"2023-09-20T19:55:33.672703Z","shell.execute_reply":"2023-09-20T19:55:33.678302Z"},"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()\n\nlen(ids), len(labels), ids[1], labels[1]","metadata":{"execution":{"iopub.status.busy":"2023-09-20T19:55:33.681544Z","iopub.execute_input":"2023-09-20T19:55:33.682263Z","iopub.status.idle":"2023-09-20T19:56:19.010030Z","shell.execute_reply.started":"2023-09-20T19:55:33.682222Z","shell.execute_reply":"2023-09-20T19:56:19.008557Z"},"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:56:19.011862Z","iopub.execute_input":"2023-09-20T19:56:19.012269Z","iopub.status.idle":"2023-09-20T19:56:19.903417Z","shell.execute_reply.started":"2023-09-20T19:56:19.012232Z","shell.execute_reply":"2023-09-20T19:56:19.902197Z"},"trusted":true},"execution_count":null,"outputs":[]}]}