{"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":"markdown","source":"# Libraries","metadata":{}},{"cell_type":"code","source":"import os\nimport cv2\nimport torch\nimport torchvision\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np \nplt.style.use(\"ggplot\")\nimport time","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-28T03:09:27.47911Z","iopub.execute_input":"2023-01-28T03:09:27.479857Z","iopub.status.idle":"2023-01-28T03:09:29.780702Z","shell.execute_reply.started":"2023-01-28T03:09:27.479724Z","shell.execute_reply":"2023-01-28T03:09:29.779221Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preparation","metadata":{}},{"cell_type":"code","source":"!pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2023-01-28T03:09:32.523112Z","iopub.execute_input":"2023-01-28T03:09:32.523597Z","iopub.status.idle":"2023-01-28T03:09:47.917671Z","shell.execute_reply.started":"2023-01-28T03:09:32.523566Z","shell.execute_reply":"2023-01-28T03:09:47.916526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from py7zr import unpack_7zarchive\nimport shutil\n\nshutil.register_unpack_format('7zip',['.7z'],unpack_7zarchive)","metadata":{"execution":{"iopub.status.busy":"2023-01-28T03:09:57.564183Z","iopub.execute_input":"2023-01-28T03:09:57.564616Z","iopub.status.idle":"2023-01-28T03:09:57.706854Z","shell.execute_reply.started":"2023-01-28T03:09:57.564564Z","shell.execute_reply":"2023-01-28T03:09:57.705923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.unpack_archive('../input/cifar-10/train.7z', '/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2023-01-28T03:10:21.947055Z","iopub.execute_input":"2023-01-28T03:10:21.947413Z","iopub.status.idle":"2023-01-28T03:11:05.368467Z","shell.execute_reply.started":"2023-01-28T03:10:21.947383Z","shell.execute_reply":"2023-01-28T03:11:05.367448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_folder = \"/kaggle/working/train\"\nprint(\"Number of training images are \", len(os.listdir(train_folder)))","metadata":{"execution":{"iopub.status.busy":"2023-01-28T03:11:20.318421Z","iopub.execute_input":"2023-01-28T03:11:20.318881Z","iopub.status.idle":"2023-01-28T03:11:20.361328Z","shell.execute_reply.started":"2023-01-28T03:11:20.3188Z","shell.execute_reply":"2023-01-28T03:11:20.360364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/cifar-10/trainLabels.csv\")\ndf.iloc[1][\"label\"]\ndf.head(9)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:43:45.263872Z","iopub.execute_input":"2023-01-27T05:43:45.264318Z","iopub.status.idle":"2023-01-27T05:43:45.333116Z","shell.execute_reply.started":"2023-01-27T05:43:45.264277Z","shell.execute_reply":"2023-01-27T05:43:45.332112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_list = df[\"label\"].unique()\ncount = 0 \ndic = {}\nfor i in label_list:\n    dic[i] = count\n    count = count+1\n\ndic","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:43:45.915888Z","iopub.execute_input":"2023-01-27T05:43:45.916237Z","iopub.status.idle":"2023-01-27T05:43:45.930543Z","shell.execute_reply.started":"2023-01-27T05:43:45.916207Z","shell.execute_reply":"2023-01-27T05:43:45.92937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = []\ny_train = []\nfor i in tqdm(os.listdir(train_folder)):\n    img_path = os.path.join(train_folder, i)\n    img = cv2.imread(img_path)\n    id_number = i.split(\".\")[0]\n    index = df.index[(df[\"id\"]==int(id_number))==True].values[0]\n    cls_id = df.iloc[index][\"label\"]\n    x_train.append(img)\n    y_train.append(int(dic[cls_id]))","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:43:46.915037Z","iopub.execute_input":"2023-01-27T05:43:46.91539Z","iopub.status.idle":"2023-01-27T05:44:22.32199Z","shell.execute_reply.started":"2023-01-27T05:43:46.915358Z","shell.execute_reply":"2023-01-27T05:44:22.320936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.unique(y_train)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:44:22.324215Z","iopub.execute_input":"2023-01-27T05:44:22.324896Z","iopub.status.idle":"2023-01-27T05:44:22.337713Z","shell.execute_reply.started":"2023-01-27T05:44:22.324855Z","shell.execute_reply":"2023-01-27T05:44:22.33648Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Data(torch.utils.data.Dataset):\n    def __init__(self, x, y, transform=None):\n        self.images = x\n        self.labels = y\n        self.transform = transform\n    def __len__(self):\n        return len(self.images)\n    def __getitem__(self, index):\n        image = self.images[index]\n        target = self.labels[index]\n        if(self.transform is not None):\n            image = self.transform(image)\n        return image, target\n    ","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:44:22.339641Z","iopub.execute_input":"2023-01-27T05:44:22.340011Z","iopub.status.idle":"2023-01-27T05:44:22.348972Z","shell.execute_reply.started":"2023-01-27T05:44:22.339975Z","shell.execute_reply":"2023-01-27T05:44:22.347945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_transform = torchvision.transforms.Compose([\n    torchvision.transforms.ToPILImage(),\n    torchvision.transforms.Resize((224,224)),\n    torchvision.transforms.ToTensor(),\n    torchvision.transforms.Normalize(mean=[0.485,0.456,0.406],\n                                     std=[0.229,0.224,0.225])\n])","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:44:22.35187Z","iopub.execute_input":"2023-01-27T05:44:22.352222Z","iopub.status.idle":"2023-01-27T05:44:22.359148Z","shell.execute_reply.started":"2023-01-27T05:44:22.352185Z","shell.execute_reply":"2023-01-27T05:44:22.35844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = Data(x_train, y_train, train_transform)\ntrain_loader = torch.utils.data.DataLoader(train_data, shuffle=True,\n                                                 batch_size=32)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:44:22.360255Z","iopub.execute_input":"2023-01-27T05:44:22.360806Z","iopub.status.idle":"2023-01-27T05:44:22.369833Z","shell.execute_reply.started":"2023-01-27T05:44:22.360752Z","shell.execute_reply":"2023-01-27T05:44:22.369196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mobile_Net_V3_Small","metadata":{}},{"cell_type":"code","source":"mobile_net = torchvision.models.mobilenet_v3_small(pretrained=True)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:44:22.371183Z","iopub.execute_input":"2023-01-27T05:44:22.371956Z","iopub.status.idle":"2023-01-27T05:44:23.786212Z","shell.execute_reply.started":"2023-01-27T05:44:22.371921Z","shell.execute_reply":"2023-01-27T05:44:23.785101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in mobile_net.features.parameters():\n    i.requires_grade = False","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:53:17.841976Z","iopub.execute_input":"2023-01-27T05:53:17.842333Z","iopub.status.idle":"2023-01-27T05:53:17.847671Z","shell.execute_reply.started":"2023-01-27T05:53:17.842303Z","shell.execute_reply":"2023-01-27T05:53:17.846706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobile_net.classifier[-1] = torch.nn.Linear(1024,10)\nfor i in mobile_net.classifier.parameters():\n    i.requires_grad = True","metadata":{"execution":{"iopub.status.busy":"2023-01-27T05:53:19.390164Z","iopub.execute_input":"2023-01-27T05:53:19.390513Z","iopub.status.idle":"2023-01-27T05:53:19.398028Z","shell.execute_reply.started":"2023-01-27T05:53:19.390483Z","shell.execute_reply":"2023-01-27T05:53:19.396774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if(torch.cuda.is_available()):\n    print(\"Device is GPU\")\n    device = torch.device(\"cuda\")\nelse:\n    print(\"Device is CPU\")\n    device = torch.device(\"cpu\")\n\nmodel = mobile_net\nmodel = model.to(device)\n\ncriterion = torch.nn.CrossEntropyLoss().to(device)\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\nscheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.7)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T06:07:34.127087Z","iopub.execute_input":"2023-01-27T06:07:34.127456Z","iopub.status.idle":"2023-01-27T06:07:34.143873Z","shell.execute_reply.started":"2023-01-27T06:07:34.127424Z","shell.execute_reply":"2023-01-27T06:07:34.142694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lrs = []\ntrain_acc = []\nep_loss = []\nfor epoch in range(0,10):\n    print(\"Epoch : \",epoch)\n    epoch_loss = 0\n    batches = 0\n    for inputs, targets in tqdm(train_loader):\n        optimizer.zero_grad()\n        batches+=1\n        inputs = inputs.to(device)\n        targets = targets.to(device)\n        outputs=model(inputs)\n        loss = criterion(outputs, targets)\n        epoch_loss += loss.item()\n        loss.backward()\n        optimizer.step()\n    lrs.append(optimizer.param_groups[0][\"lr\"])\n    scheduler.step()\n    train_accuracy = 0\n    for inputs,targets in tqdm(train_loader):\n        inputs = inputs.to(device)\n        outputs = model(inputs).detach().cpu().numpy().argmax(axis=-1)\n        train_accuracy += (outputs == targets.numpy()).mean()\n    train_accuracy = train_accuracy/batches\n    train_acc.append(train_accuracy)\n    ep_loss.append(epoch_loss)\n    print(\"Train accuracy on Batch of {} images is {} \".format(batches, train_accuracy))\n    print(\"Loss is \", epoch_loss)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T06:07:36.228156Z","iopub.execute_input":"2023-01-27T06:07:36.22853Z","iopub.status.idle":"2023-01-27T06:51:11.403464Z","shell.execute_reply.started":"2023-01-27T06:07:36.228499Z","shell.execute_reply":"2023-01-27T06:51:11.402348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(train_acc, label=\"Training accuracy\")\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-01-27T06:51:17.880801Z","iopub.execute_input":"2023-01-27T06:51:17.881166Z","iopub.status.idle":"2023-01-27T06:51:18.243907Z","shell.execute_reply.started":"2023-01-27T06:51:17.881129Z","shell.execute_reply":"2023-01-27T06:51:18.242053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(ep_loss, label=\"Epoch Loss\")\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-01-27T06:51:51.411754Z","iopub.execute_input":"2023-01-27T06:51:51.412139Z","iopub.status.idle":"2023-01-27T06:51:51.649759Z","shell.execute_reply.started":"2023-01-27T06:51:51.412107Z","shell.execute_reply":"2023-01-27T06:51:51.648618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Kaggle Submission","metadata":{}},{"cell_type":"code","source":"shutil.unpack_archive('../input/cifar-10/test.7z', '/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2023-01-28T03:11:39.235688Z","iopub.execute_input":"2023-01-28T03:11:39.236679Z","iopub.status.idle":"2023-01-28T03:25:21.518754Z","shell.execute_reply.started":"2023-01-28T03:11:39.236639Z","shell.execute_reply":"2023-01-28T03:25:21.517707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_folder = \"/kaggle/working/test\"\nprint(len(os.listdir(test_folder)))\nos.listdir(test_folder)[2]","metadata":{"execution":{"iopub.status.busy":"2023-01-27T11:47:10.279445Z","iopub.execute_input":"2023-01-27T11:47:10.28014Z","iopub.status.idle":"2023-01-27T11:47:10.632469Z","shell.execute_reply.started":"2023-01-27T11:47:10.280101Z","shell.execute_reply":"2023-01-27T11:47:10.631265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count = 0\nreverse_labels = {}\nfor i in dic.keys():\n    reverse_labels[count] = i\n    count = count + 1","metadata":{"execution":{"iopub.status.busy":"2023-01-27T11:54:32.175794Z","iopub.execute_input":"2023-01-27T11:54:32.176174Z","iopub.status.idle":"2023-01-27T11:54:32.181275Z","shell.execute_reply.started":"2023-01-27T11:54:32.176141Z","shell.execute_reply":"2023-01-27T11:54:32.180289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dic","metadata":{"execution":{"iopub.status.busy":"2023-01-27T11:54:55.024285Z","iopub.execute_input":"2023-01-27T11:54:55.024659Z","iopub.status.idle":"2023-01-27T11:54:55.031544Z","shell.execute_reply.started":"2023-01-27T11:54:55.024627Z","shell.execute_reply":"2023-01-27T11:54:55.030541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"reverse_labels","metadata":{"execution":{"iopub.status.busy":"2023-01-27T11:55:00.369021Z","iopub.execute_input":"2023-01-27T11:55:00.369435Z","iopub.status.idle":"2023-01-27T11:55:00.376363Z","shell.execute_reply.started":"2023-01-27T11:55:00.369403Z","shell.execute_reply":"2023-01-27T11:55:00.375315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = cv2.imread(\"/kaggle/working/test/202.png\")\ninfer_model = model.eval()\nimg = train_transform(img).to(device)\nimg = img.unsqueeze(0)\npredicted_cls = infer_model(img).argmax(axis=-1).item()\nplt.imshow(cv2.imread(\"/kaggle/working/test/202.png\"))\nprint(\"Prediction is \", reverse_labels[predicted_cls])","metadata":{"execution":{"iopub.status.busy":"2023-01-27T11:58:12.510201Z","iopub.execute_input":"2023-01-27T11:58:12.510576Z","iopub.status.idle":"2023-01-27T11:58:12.731263Z","shell.execute_reply.started":"2023-01-27T11:58:12.510529Z","shell.execute_reply":"2023-01-27T11:58:12.730226Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"col1, col2 = [], []\nwith torch.no_grad():\n    a = time.time()\n    for i in tqdm(os.listdir(test_folder)):\n        id = i.split(\".\")[0]\n        col1.append(id)\n        img = cv2.imread(os.path.join(test_folder, i))\n        img = train_transform(img).to(device)\n        img = img.unsqueeze(0)\n        predicted_cls = infer_model(img).argmax(axis=-1).item()\n        label = reverse_labels[predicted_cls]\n        col2.append(label)\n    print(\"Time taken is \", time.time()-a)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T12:06:13.954532Z","iopub.execute_input":"2023-01-27T12:06:13.954953Z","iopub.status.idle":"2023-01-27T12:44:13.531733Z","shell.execute_reply.started":"2023-01-27T12:06:13.954921Z","shell.execute_reply":"2023-01-27T12:44:13.530603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.DataFrame(list(zip(col1,col2)),\n             columns = [\"id\", \"label\"])\n\nsub.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T13:00:18.439989Z","iopub.execute_input":"2023-01-27T13:00:18.440353Z","iopub.status.idle":"2023-01-27T13:00:18.794592Z","shell.execute_reply.started":"2023-01-27T13:00:18.440323Z","shell.execute_reply":"2023-01-27T13:00:18.792502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**93.87 Accuracy on Submission**","metadata":{}},{"cell_type":"markdown","source":"# Conversion to Torchscript","metadata":{}},{"cell_type":"code","source":"traced_script_model = torch.jit.trace(model, img)\ntraced_script_model.save(\"model_torchscript.pt\")","metadata":{"execution":{"iopub.status.busy":"2023-01-27T13:05:27.645416Z","iopub.execute_input":"2023-01-27T13:05:27.645957Z","iopub.status.idle":"2023-01-27T13:05:29.006367Z","shell.execute_reply.started":"2023-01-27T13:05:27.645912Z","shell.execute_reply":"2023-01-27T13:05:29.005371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"col1, col2 = [], []\nwith torch.no_grad():\n    a = time.time()\n    for i in tqdm(os.listdir(test_folder)):\n        id = i.split(\".\")[0]\n        col1.append(id)\n        img = cv2.imread(os.path.join(test_folder, i))\n        img = train_transform(img).to(device)\n        img = img.unsqueeze(0)\n        predicted_cls = traced_script_model(img).argmax(axis=-1).item()\n        label = reverse_labels[predicted_cls]\n        col2.append(label)\n    print(\"Time taken is \", time.time()-a)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T13:09:24.863175Z","iopub.execute_input":"2023-01-27T13:09:24.863571Z","iopub.status.idle":"2023-01-27T13:35:11.010782Z","shell.execute_reply.started":"2023-01-27T13:09:24.863526Z","shell.execute_reply":"2023-01-27T13:35:11.009636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.DataFrame(list(zip(col1,col2)),\n             columns = [\"id\", \"label\"])\n\nsub.to_csv(\"submission2.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-01-27T13:35:21.693844Z","iopub.execute_input":"2023-01-27T13:35:21.694797Z","iopub.status.idle":"2023-01-27T13:35:22.060229Z","shell.execute_reply.started":"2023-01-27T13:35:21.694751Z","shell.execute_reply":"2023-01-27T13:35:22.059225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**93.87 Accuracy**","metadata":{}}]}