{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30776,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install py7zr -q","metadata":{"execution":{"iopub.status.busy":"2024-09-30T13:53:27.888923Z","iopub.execute_input":"2024-09-30T13:53:27.88927Z","iopub.status.idle":"2024-09-30T13:53:43.408427Z","shell.execute_reply.started":"2024-09-30T13:53:27.889235Z","shell.execute_reply":"2024-09-30T13:53:43.407074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np, pandas as pd, os, random as rd, matplotlib.pyplot as plt, seaborn as sns, pickle as pkl\nfrom py7zr import SevenZipFile as szf\nfrom PIL import Image\n\nimport torch, torch.nn as nn, torch.nn.functional as func, torchvision.models as mods\nfrom torch.utils.data import DataLoader as dload, Dataset, Subset\nfrom torchvision import transforms as tfs\nfrom torchvision.datasets import ImageFolder as ifold\n\ntorch.manual_seed(42)\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nfrom sklearn.model_selection import train_test_split as tts\nfrom sklearn.metrics import classification_report as cls_rpt, confusion_matrix as conf_mtx","metadata":{"execution":{"iopub.status.busy":"2024-09-30T14:24:53.713801Z","iopub.execute_input":"2024-09-30T14:24:53.714435Z","iopub.status.idle":"2024-09-30T14:24:53.722537Z","shell.execute_reply.started":"2024-09-30T14:24:53.714397Z","shell.execute_reply":"2024-09-30T14:24:53.721695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Loading Dataset\ntr_lbl_path = '/kaggle/input/cifar-10/trainLabels.csv'\ntr_arch_path = '/kaggle/input/cifar-10/train.7z'\ntr_extr_path = \"/kaggle/working/train_images\"\n\ndef extract_7z_archive(arch_path, extr_path):\n    with szf(arch_path, mode='r') as z:\n        z.extractall(path = extr_path)\n\nextract_7z_archive(tr_arch_path, tr_extr_path)","metadata":{"execution":{"iopub.status.busy":"2024-09-30T14:24:57.880825Z","iopub.execute_input":"2024-09-30T14:24:57.881521Z","iopub.status.idle":"2024-09-30T14:25:24.436191Z","shell.execute_reply.started":"2024-09-30T14:24:57.881483Z","shell.execute_reply":"2024-09-30T14:25:24.435182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Composing Data Transforms\nimg_sz = 32\nmean, std = [.4914, .4822, .4465], [.247, .243, .261] # for fast convergence\n\ncmps_tr = tfs.Compose([\n    tfs.Resize((img_sz, img_sz)),\n    tfs.RandomRotation(20),\n    tfs.RandomHorizontalFlip(.1),\n    tfs.ColorJitter(brightness=.1, contrast=.1, saturation=.1),\n    tfs.RandomAdjustSharpness(sharpness_factor=2, p=.1),\n    tfs.ToTensor(),\n    tfs.Normalize(mean, std),\n    tfs.RandomErasing(p=.75, scale=(.02, .1), value=1., inplace=False)\n])\n\ncmps_ts = tfs.Compose([\n    tfs.Resize((img_sz, img_sz)),\n    tfs.ToTensor(),\n    tfs.Normalize(mean, std),\n])","metadata":{"execution":{"iopub.status.busy":"2024-09-30T14:25:28.40179Z","iopub.execute_input":"2024-09-30T14:25:28.402626Z","iopub.status.idle":"2024-09-30T14:25:28.411133Z","shell.execute_reply.started":"2024-09-30T14:25:28.402585Z","shell.execute_reply":"2024-09-30T14:25:28.410173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split as tts\n\n# Loading Data\nlbl_df = pd.read_csv(tr_lbl_path)  # Assuming this contains the labels\ndata = ifold(tr_extr_path)  # Assuming this loads all CIFAR-10 images\n\n# Process image IDs and labels\nimg_ids = [int(p.split('/')[-1].replace('.png', '')) for p, _ in data.imgs]\nlbl_list = [lbl_df[lbl_df['id'] == img_id].label.values[0] for img_id in img_ids]\n\n# Update dataset with labels\ndata.imgs = list(zip([p for p, _ in data.imgs], lbl_list))\ndata.targets = lbl_list\n\n# Check total size of dataset\ntotal_samples = len(data.targets)  # Should be 50,000 for CIFAR-10\n\ntrain_idx, temp_idx = tts(\n    list(range(total_samples)),\n    test_size=0.2,\n    stratify=data.targets,\n    random_state=42\n)\n\nval_idx, test_idx = tts(\n    temp_idx,\n    test_size=0.5,\n    stratify=[data.targets[i] for i in temp_idx],\n    random_state=42\n)\n\n# Subsets for Training, Validation, and Testing\ntr_dt = Subset(data, train_idx)\nval_dt = Subset(data, val_idx)\nts_dt = Subset(data, test_idx)\n\n# Assigning transformations\ntr_dt.dataset.transform = cmps_tr  # Assuming cmps_tr contains training transformations\nval_dt.dataset.transform = cmps_ts  # Assuming cmps_ts contains validation/test transformations\nts_dt.dataset.transform = cmps_ts\n\n# DataLoader for each set\ntr_ld = dload(tr_dt, batch_size=32, shuffle=True)\nval_ld = dload(val_dt, batch_size=32, shuffle=False)\nts_ld = dload(ts_dt, batch_size=32, shuffle=False)\n\n# Checking the distribution of the classes in each dataset\nfrom collections import Counter\n\ntrain_targets = [data.targets[i] for i in train_idx]\nval_targets = [data.targets[i] for i in val_idx]\ntest_targets = [data.targets[i] for i in test_idx]\n\nprint(\"Train set class distribution:\", Counter(train_targets))\nprint(\"Validation set class distribution:\", Counter(val_targets))\nprint(\"Test set class distribution:\", Counter(test_targets))\n","metadata":{"execution":{"iopub.status.busy":"2024-09-30T14:40:29.574822Z","iopub.execute_input":"2024-09-30T14:40:29.575187Z","iopub.status.idle":"2024-09-30T14:40:49.121016Z","shell.execute_reply.started":"2024-09-30T14:40:29.575152Z","shell.execute_reply":"2024-09-30T14:40:49.120019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.optim as optim\n\nnum_classes = len(set(data.targets))\nbase_mod = mods.resnet50(pretrained=True)\n\nfor param in base_mod.parameters():\n    param.requires_grad = False\nbase_mod.fc = nn.Linear(base_mod.fc.in_features, num_classes)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nbase_mod = base_mod.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(base_mod.fc.parameters(), lr=0.001)  # Only optimizing the final layer\n\n# WIP\n\n# Trainer\ndef train_model(mod, tr_ld, val_ld, criterion, optimizer, num_epochs):\n    history = {'train_loss': [], 'train_acc': [], 'val_acc': []}\n    mod.train()\n\n    for epoch in range(num_epochs):\n        running_loss = 0.0\n        correct = 0\n        total = 0\n\n        for inp, lbl in tr_ld:  # Changed train_loader to tr_ld\n            inp, lbl = inp.to(device), lbl.to(device)\n            optimizer.zero_grad()\n\n            out = mod(inp)\n            loss = criterion(out, lbl)\n            loss.backward()\n            optimizer.step()\n\n            # Calculate running loss and accuracy\n            running_loss += loss.item()\n            _, pred = torch.max(out, 1)\n            total += lbl.size(0)\n            correct += (pred == lbl).sum().item()\n\n        epoch_loss = running_loss / total\n        epoch_acc = 100 * correct / total\n\n        history['train_loss'].append(epoch_loss)\n        history['train_acc'].append(epoch_acc)\n\n        print(f\"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss:.4f}, Accuracy: {epoch_acc:.2f}%\")\n        \n        val_acc = val_mod(mod, val_ld)\n        history['val_acc'].append(val_acc)\n\n    return history\n\n# Validation function\ndef val_mod(mod, val_ld):\n    mod.eval()  # Set model to evaluation mode\n    correct = 0\n    total = 0\n\n    with torch.no_grad():\n        for inp, lbl in val_ld:\n            inp, lbl = inp.to(device), lbl.to(device)\n            out = mod(inp)\n            _, pred = torch.max(out, 1)\n            total += lbl.size(0)\n            correct += (pred == lbl).sum().item()\n\n    val_acc = 100 * correct / total\n    print(f\"Validation Accuracy: {val_acc:.2f}%\\n\")\n    \n    mod.train()\n    return val_acc\n\nhistory = train_model(base_mod, tr_ld, val_ld, criterion, optimizer, 10)","metadata":{"execution":{"iopub.status.busy":"2024-09-30T14:41:16.908521Z","iopub.execute_input":"2024-09-30T14:41:16.909198Z","iopub.status.idle":"2024-09-30T14:42:36.669628Z","shell.execute_reply.started":"2024-09-30T14:41:16.909159Z","shell.execute_reply":"2024-09-30T14:42:36.668009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ts_hist = []\nfor i in range(20):\n    ts_hist.append(base_mod, ts_ld)\n    \navg_ts_acc = sum(ts_hist) / len(ts_hist)\nprint(f\"Average Test Accuracy: {avg_ts_acc}\\n\")","metadata":{},"execution_count":null,"outputs":[]}]}