{"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":"Imports & installs.","metadata":{"papermill":{"duration":0.018867,"end_time":"2023-10-07T08:29:02.095914","exception":false,"start_time":"2023-10-07T08:29:02.077047","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!pip install py7zr","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-output":true,"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":12.09222,"end_time":"2023-10-07T08:29:14.206293","exception":false,"start_time":"2023-10-07T08:29:02.114073","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:32:00.855354Z","iopub.execute_input":"2023-10-16T12:32:00.855664Z","iopub.status.idle":"2023-10-16T12:32:14.117986Z","shell.execute_reply.started":"2023-10-16T12:32:00.855638Z","shell.execute_reply":"2023-10-16T12:32:14.116801Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################### IMPORTS ###################################\n###\nimport numpy as np\nimport pandas as pd\nimport os\nimport copy\nimport matplotlib.pyplot as plt\n\n###\nfrom PIL import Image\n\n###\nimport torch\n# neural network modules, nn.Linear, nn.Conv2d, loss functions\nimport torch.nn as nn\n# activation functions\nimport torch.nn.functional as F\n# optimizers\nimport torch.optim as optim\n# transformations \nimport torchvision.transforms as transforms\n\nfrom torchvision import models\nimport torchvision\nfrom torch.utils.data import DataLoader, Dataset, Subset\n\n###\nfrom sklearn.model_selection import train_test_split\n\n# device config\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\n###\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n###\nfrom py7zr import unpack_7zarchive\nimport shutil\nshutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)","metadata":{"papermill":{"duration":2.537902,"end_time":"2023-10-07T08:29:16.766436","exception":false,"start_time":"2023-10-07T08:29:14.228534","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:32:14.120370Z","iopub.execute_input":"2023-10-16T12:32:14.120726Z","iopub.status.idle":"2023-10-16T12:32:18.620040Z","shell.execute_reply.started":"2023-10-16T12:32:14.120690Z","shell.execute_reply":"2023-10-16T12:32:18.619110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################# HYPERPARAMS #################################\n\nnum_epochs = 3\nbatch_size = 32\nlr = 0.01","metadata":{"papermill":{"duration":0.027516,"end_time":"2023-10-07T08:29:16.815729","exception":false,"start_time":"2023-10-07T08:29:16.788213","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:32:18.621494Z","iopub.execute_input":"2023-10-16T12:32:18.622201Z","iopub.status.idle":"2023-10-16T12:32:18.627165Z","shell.execute_reply.started":"2023-10-16T12:32:18.622157Z","shell.execute_reply":"2023-10-16T12:32:18.625603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Load data.","metadata":{"papermill":{"duration":0.021476,"end_time":"2023-10-07T08:29:16.858220","exception":false,"start_time":"2023-10-07T08:29:16.836744","status":"completed"},"tags":[]}},{"cell_type":"code","source":"############################# CUSTOM DATASET CLASS #############################\n\nclass CifarLoader(Dataset):\n  def __init__(self, root_dir, csv_file = None, transform = None):\n\n    # images directory \n    self.root_dir = root_dir\n    # transformations if any\n    self.transform = transform\n\n    if csv_file:\n      # read csv file\n      self.df = pd.read_csv(csv_file)\n\n      # {class: lbl}\n      self.annot_dict = {}\n\n      for i, lbl in enumerate(self.df['label'].unique()):\n        self.annot_dict[lbl] = i\n\n      # {lbl: class}\n      self.annot_dict_reversed = {v:k for k,v in self.annot_dict.items()}\n\n      # add a column with decoded labels\n      self.df['encoded'] = self.df['label'].map(self.annot_dict)\n\n    else: \n      # if no csv file provided -> create a df, fill labels with 0's\n      self.df = pd.DataFrame({\n          'id': list(range(1, len(os.listdir(self.root_dir)) + 1)),\n          'label': np.zeros(len(os.listdir(self.root_dir))),\n          'encoded': np.zeros(len(os.listdir(self.root_dir)))\n      })\n\n\n  def __len__(self):\n    # num of records in the df\n    return len(self.df)\n\n  def __getitem__(self, index):\n    # path to the image\n    img_path = os.path.join(self.root_dir, str(self.df.iloc[index, 0]) + '.png')\n    # read image\n    image = np.array(Image.open(img_path).convert('RGB'))\n    # get label\n    y_label = torch.tensor(int(self.df.iloc[index, 2]))\n\n    # apply transformations\n    if self.transform:\n      image = self.transform(image)\n    \n    return (image, y_label)\n","metadata":{"papermill":{"duration":0.036812,"end_time":"2023-10-07T08:29:16.916431","exception":false,"start_time":"2023-10-07T08:29:16.879619","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:32:18.629773Z","iopub.execute_input":"2023-10-16T12:32:18.630541Z","iopub.status.idle":"2023-10-16T12:32:18.643692Z","shell.execute_reply.started":"2023-10-16T12:32:18.630510Z","shell.execute_reply":"2023-10-16T12:32:18.642663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# transform tensors to normalized range form [0, 1] to [-1, 1]\nmean = np.array([0.5, 0.5, 0.5])\nstd = np.array([0.25, 0.25, 0.25])\n\ntr = transforms.Compose([\n        transforms.ToPILImage(),\n        transforms.Resize((224, 224)),  \n        transforms.ToTensor(),        \n        transforms.Normalize(mean, std)\n    ])","metadata":{"papermill":{"duration":0.029111,"end_time":"2023-10-07T08:29:16.968023","exception":false,"start_time":"2023-10-07T08:29:16.938912","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:32:18.644869Z","iopub.execute_input":"2023-10-16T12:32:18.645735Z","iopub.status.idle":"2023-10-16T12:32:18.663602Z","shell.execute_reply.started":"2023-10-16T12:32:18.645706Z","shell.execute_reply":"2023-10-16T12:32:18.662667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# unzip train and test data\nshutil.unpack_archive('../input/cifar-10/train.7z')","metadata":{"papermill":{"duration":45.808791,"end_time":"2023-10-07T08:30:02.798151","exception":false,"start_time":"2023-10-07T08:29:16.989360","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:32:18.664939Z","iopub.execute_input":"2023-10-16T12:32:18.665262Z","iopub.status.idle":"2023-10-16T12:33:00.741550Z","shell.execute_reply.started":"2023-10-16T12:32:18.665226Z","shell.execute_reply":"2023-10-16T12:33:00.740566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = CifarLoader(csv_file = '../input/cifar-10/trainLabels.csv', \n                      root_dir = './train',\n                      transform = tr)\n\nprint(dataset.df.head())","metadata":{"papermill":{"duration":0.072447,"end_time":"2023-10-07T08:30:02.894539","exception":false,"start_time":"2023-10-07T08:30:02.822092","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:00.742973Z","iopub.execute_input":"2023-10-16T12:33:00.743319Z","iopub.status.idle":"2023-10-16T12:33:00.800881Z","shell.execute_reply.started":"2023-10-16T12:33:00.743287Z","shell.execute_reply":"2023-10-16T12:33:00.799991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"############################### SPLIT THE DATA #################################\n\nindexes = list(range(len(dataset)))\n\ntrain_indexes, val_indexes = train_test_split(indexes, test_size=0.2)\n\ndata = {}\ndata['train'] = Subset(dataset, train_indexes)\ndata['val'] = Subset(dataset, val_indexes)\n\ndataloader_train = DataLoader(dataset = data['train'], batch_size = batch_size, shuffle=False)\ndataloader_val = DataLoader(dataset = data['val'], batch_size = batch_size, shuffle=False)","metadata":{"papermill":{"duration":0.045648,"end_time":"2023-10-07T08:30:02.962372","exception":false,"start_time":"2023-10-07T08:30:02.916724","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:00.802317Z","iopub.execute_input":"2023-10-16T12:33:00.802943Z","iopub.status.idle":"2023-10-16T12:33:00.819685Z","shell.execute_reply.started":"2023-10-16T12:33:00.802910Z","shell.execute_reply":"2023-10-16T12:33:00.818791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(train_indexes), len(val_indexes))","metadata":{"papermill":{"duration":0.030349,"end_time":"2023-10-07T08:30:03.016101","exception":false,"start_time":"2023-10-07T08:30:02.985752","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:00.821191Z","iopub.execute_input":"2023-10-16T12:33:00.821491Z","iopub.status.idle":"2023-10-16T12:33:00.831702Z","shell.execute_reply.started":"2023-10-16T12:33:00.821462Z","shell.execute_reply":"2023-10-16T12:33:00.830780Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################ SHOW IMAGES ##################################\n\ndef images_show(images, lbls=None):\n  # show only 4 first images from each batch\n  for i in range(4):\n    plt.subplot(1, 4, i + 1)\n    # convert to numpy\n    img = images[i].numpy().transpose((1, 2, 0))\n    # unnormalize\n    img = img * std + mean \n    img = np.clip(img, a_min=0, a_max=1)\n    plt.imshow(img)\n \n    if lbls != None:\n      # decode labels using reversed annotation dictionary\n      plt.title(dataset.annot_dict_reversed[lbls[i].item()])\n    plt.axis('off')\n  plt.tight_layout(pad=0.5)\n  plt.show()","metadata":{"papermill":{"duration":0.03074,"end_time":"2023-10-07T08:30:03.069012","exception":false,"start_time":"2023-10-07T08:30:03.038272","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:00.835651Z","iopub.execute_input":"2023-10-16T12:33:00.836257Z","iopub.status.idle":"2023-10-16T12:33:00.844176Z","shell.execute_reply.started":"2023-10-16T12:33:00.836234Z","shell.execute_reply":"2023-10-16T12:33:00.843263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Load pretrained Resnet-152.","metadata":{"papermill":{"duration":0.028554,"end_time":"2023-10-07T08:30:04.514012","exception":false,"start_time":"2023-10-07T08:30:04.485458","status":"completed"},"tags":[]}},{"cell_type":"code","source":"################################ FINETUNING ##################################\n\n# Load a pretrained model and reset final fully connected layer\n\n# load a pretrained model \nmodel = models.resnet152(pretrained=True)\n\n# reset final fully connected layer\nnum_ftrs = model.fc.in_features\n\nmodel.classifier = nn.Sequential(\n                        nn.Linear(num_ftrs, 256),  \n                        nn.ReLU(), \n                        nn.Dropout(0.3),\n                        nn.Linear(256, 10))\n\n# copy weights for futher retraining on full train dataset\nmodel_wts = copy.deepcopy(model.state_dict())\n\n# move model to a device\nmodel = model.to(device)\n\n# loss\ncriterion = nn.CrossEntropyLoss()\n\n# all parameters are being optimized\noptimizer = optim.SGD(model.parameters(), lr=lr)","metadata":{"papermill":{"duration":6.915398,"end_time":"2023-10-07T08:30:11.457883","exception":false,"start_time":"2023-10-07T08:30:04.542485","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:00.845511Z","iopub.execute_input":"2023-10-16T12:33:00.846303Z","iopub.status.idle":"2023-10-16T12:33:06.985954Z","shell.execute_reply.started":"2023-10-16T12:33:00.846272Z","shell.execute_reply":"2023-10-16T12:33:06.984819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################ TRAINING FUNC ################################\n\ndef train(model, criterion, optimizer, num_epochs, \n          dataloader_train, dataloader_val = None):\n\n  history = {\n        'loss': [],\n        'accuracy': [],\n        'val_loss': [],\n        'val_accuracy': [],\n        'best train acc': (0, 0)\n        }\n\n  best_model_wts = copy.deepcopy(model.state_dict())\n  best_acc = 0.0\n\n\n  for epoch in range(num_epochs):\n    print('Epoch {}/{}'.format(epoch + 1, num_epochs))\n\n    # set model to the training mode\n    model.train()\n\n    n_samples = 0\n    correct_train = 0\n    epoch_loss_train = 0\n    epoch_loss_val = 0\n\n\n    for i, (images, labels) in enumerate(dataloader_train):\n      # origin shape: [4, 3, 32, 32] = 4, 3, 1024\n    \n      images = images.to(device)\n      labels = labels.to(device)\n\n      # forward pass (pred)\n      pred = model(images)\n\n      # loss\n      loss = criterion(pred, labels)\n\n      # mean loss * num samples in batch\n      epoch_loss_train += labels.shape[0] * loss.item()\n\n      # empty gradients\n      optimizer.zero_grad()\n\n      # gradient (backpropagation)\n      loss.backward()\n\n      # update weights\n      optimizer.step()\n\n      # values, indexes\n      value, predicted = torch.max(pred, 1)\n\n      # += batch_size\n      n_samples += labels.shape[0]\n      # num of correctly predicted in this batch\n      correct_train += (predicted==labels).sum().item()\n\n    # train acc per epoch\n    train_acc = 100 * correct_train / n_samples\n    # train loss per epoch\n    epoch_loss_train = epoch_loss_train / n_samples\n\n    print(f'Train accuracy: {train_acc:.2f}, loss: {epoch_loss_train:.2f}')\n    #print(f'Best accuracy: {best_acc:.2f}')\n\n    history['accuracy'].append(train_acc)\n    history['loss'].append(epoch_loss_train)\n\n    # find best accuracy on training data\n    if train_acc > best_acc:\n\n      #print('*New best accuracy*')\n      best_acc = train_acc\n\n      # copy current model weights\n      best_model_wts = copy.deepcopy(model.state_dict())\n      history['best train acc'] = (epoch, best_acc)\n\n\n\n    if dataloader_val:\n\n      # evaluation mode\n      model.eval()\n\n      with torch.no_grad():\n        correct_val = 0\n        n_samples = 0\n\n        for images, labels in dataloader_val: \n          images = images.to(device)\n          labels = labels.to(device)\n\n          outputs = model(images)\n\n          loss = criterion(outputs, labels)\n          epoch_loss_val += labels.shape[0] * loss.item()\n\n          # value, index\n          _, pred = torch.max(outputs, 1)\n          n_samples += labels.shape[0]\n          correct_val += (pred==labels).sum().item()\n\n        # calculate validation accuracy and loss for each epoch\n        val_acc = 100 * correct_val / len(data['val'])\n        epoch_loss_val = epoch_loss_val / len(data['val'])\n\n        print(f'Val accuracy: {val_acc:.2f}, loss: {epoch_loss_val:.2f}')\n\n        history['val_accuracy'].append(val_acc)\n        history['val_loss'].append(epoch_loss_val)\n      \n    print('=' * 80)\n\n\n  print('Best train acc: {:2f}'.format(best_acc))\n\n  # load best weights\n  model.load_state_dict(best_model_wts)\n\n  return model, history","metadata":{"papermill":{"duration":0.118706,"end_time":"2023-10-07T08:30:11.642833","exception":false,"start_time":"2023-10-07T08:30:11.524127","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:06.987398Z","iopub.execute_input":"2023-10-16T12:33:06.987787Z","iopub.status.idle":"2023-10-16T12:33:06.999626Z","shell.execute_reply.started":"2023-10-16T12:33:06.987735Z","shell.execute_reply":"2023-10-16T12:33:06.998740Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model, history = train(model, criterion, optimizer, num_epochs, \n                       dataloader_train, dataloader_val)","metadata":{"papermill":{"duration":1722.843117,"end_time":"2023-10-07T08:58:54.533978","exception":false,"start_time":"2023-10-07T08:30:11.690861","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T12:33:07.001000Z","iopub.execute_input":"2023-10-16T12:33:07.001571Z","iopub.status.idle":"2023-10-16T13:02:37.378857Z","shell.execute_reply.started":"2023-10-16T12:33:07.001537Z","shell.execute_reply":"2023-10-16T13:02:37.377937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_history(history):\n   \n    loss = history['loss']\n    accuracy = history['accuracy']\n    val_loss = history['val_loss']\n    val_accuracy = history['val_accuracy']\n    x = range(len(loss))\n\n    plt.figure(figsize=(12, 5))\n    plt.subplot(1, 2, 1)\n    plt.plot(x, accuracy, label='Training acc', color='#03045e', linewidth=2)\n    if len(val_loss) != 0:\n      plt.plot(x, val_accuracy, label='Validation acc', color='#48cae4', linewidth=2)\n    plt.plot(history['best train acc'][0], \n             history['best train acc'][1], \n             'bo', label='Best train acc', markersize=7, color='black')\n    plt.title('Accuracy')\n    plt.grid(True)\n    plt.legend()\n    \n    \n    plt.subplot(1, 2, 2)\n    plt.plot(x, loss, label='Training loss', color='#03045e', linewidth=2)\n    if len(val_loss) != 0:\n      plt.plot(x, val_loss, label='Validation loss', color='#48cae4', linewidth=2)\n    plt.title('Loss')\n    plt.grid(True)\n    plt.legend()","metadata":{"papermill":{"duration":0.039414,"end_time":"2023-10-07T08:58:54.603639","exception":false,"start_time":"2023-10-07T08:58:54.564225","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:02:37.380573Z","iopub.execute_input":"2023-10-16T13:02:37.381396Z","iopub.status.idle":"2023-10-16T13:02:37.389274Z","shell.execute_reply.started":"2023-10-16T13:02:37.381361Z","shell.execute_reply":"2023-10-16T13:02:37.388400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_history(history)","metadata":{"papermill":{"duration":0.514896,"end_time":"2023-10-07T08:58:55.148041","exception":false,"start_time":"2023-10-07T08:58:54.633145","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:02:37.390768Z","iopub.execute_input":"2023-10-16T13:02:37.391419Z","iopub.status.idle":"2023-10-16T13:02:37.954129Z","shell.execute_reply.started":"2023-10-16T13:02:37.391387Z","shell.execute_reply":"2023-10-16T13:02:37.953238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################## EVALUATE ##################################\ndef evaluate(model, dataloader):\n\n  with torch.no_grad():\n    model.eval()\n    n_correct = 0\n    n_samples = 0\n\n    for images, labels in dataloader: \n      images = images.to(device)\n      labels = labels.to(device)\n\n      outputs = model(images)\n\n      # value, index\n      v, pred = torch.max(outputs, 1)\n\n      n_samples += labels.shape[0]\n      n_correct += (pred==labels).sum().item()\n\n    acc = 100.0 * n_correct / n_samples\n    print(acc)","metadata":{"papermill":{"duration":0.039181,"end_time":"2023-10-07T08:58:55.218572","exception":false,"start_time":"2023-10-07T08:58:55.179391","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:02:37.955148Z","iopub.execute_input":"2023-10-16T13:02:37.955469Z","iopub.status.idle":"2023-10-16T13:02:37.962345Z","shell.execute_reply.started":"2023-10-16T13:02:37.955439Z","shell.execute_reply":"2023-10-16T13:02:37.961191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"evaluate(model, dataloader_val)","metadata":{"papermill":{"duration":52.605587,"end_time":"2023-10-07T08:59:47.854832","exception":false,"start_time":"2023-10-07T08:58:55.249245","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:02:37.964202Z","iopub.execute_input":"2023-10-16T13:02:37.964907Z","iopub.status.idle":"2023-10-16T13:03:31.300411Z","shell.execute_reply.started":"2023-10-16T13:02:37.964877Z","shell.execute_reply":"2023-10-16T13:03:31.299431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Retrain model on full training set.","metadata":{"papermill":{"duration":0.033855,"end_time":"2023-10-07T08:59:47.920113","exception":false,"start_time":"2023-10-07T08:59:47.886258","status":"completed"},"tags":[]}},{"cell_type":"code","source":"############################## COMPLETE DATASET ###############################\n\ndataloader = DataLoader(dataset = dataset, batch_size = batch_size, shuffle=False)","metadata":{"papermill":{"duration":0.038263,"end_time":"2023-10-07T08:59:47.989923","exception":false,"start_time":"2023-10-07T08:59:47.951660","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:03:31.301899Z","iopub.execute_input":"2023-10-16T13:03:31.302486Z","iopub.status.idle":"2023-10-16T13:03:31.307648Z","shell.execute_reply.started":"2023-10-16T13:03:31.302452Z","shell.execute_reply":"2023-10-16T13:03:31.306442Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.unpack_archive('../input/cifar-10/test.7z')\ndataset_test = CifarLoader(root_dir = './test',\n                      transform = tr)\n\ndataloader_test = DataLoader(dataset = dataset_test, \n                             batch_size = batch_size, shuffle=False)","metadata":{"papermill":{"duration":823.768927,"end_time":"2023-10-07T09:13:31.791209","exception":false,"start_time":"2023-10-07T08:59:48.022282","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:03:31.309139Z","iopub.execute_input":"2023-10-16T13:03:31.309502Z","iopub.status.idle":"2023-10-16T13:16:51.503102Z","shell.execute_reply.started":"2023-10-16T13:03:31.309471Z","shell.execute_reply":"2023-10-16T13:16:51.502224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################# RESET MODEL ##################################\n\nmodel.load_state_dict(model_wts)\n\n# loss\ncriterion = nn.CrossEntropyLoss()\n\n# all parameters are being optimized\noptimizer = optim.SGD(model.parameters(), lr=lr)","metadata":{"papermill":{"duration":0.175783,"end_time":"2023-10-07T09:13:31.999582","exception":false,"start_time":"2023-10-07T09:13:31.823799","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:16:51.504704Z","iopub.execute_input":"2023-10-16T13:16:51.505067Z","iopub.status.idle":"2023-10-16T13:16:51.612533Z","shell.execute_reply.started":"2023-10-16T13:16:51.505019Z","shell.execute_reply":"2023-10-16T13:16:51.611614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model, history = train(model, criterion, optimizer, 3, dataloader)","metadata":{"papermill":{"duration":1941.951723,"end_time":"2023-10-07T09:45:53.983369","exception":false,"start_time":"2023-10-07T09:13:32.031646","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:16:51.613955Z","iopub.execute_input":"2023-10-16T13:16:51.614305Z","iopub.status.idle":"2023-10-16T13:50:10.822036Z","shell.execute_reply.started":"2023-10-16T13:16:51.614276Z","shell.execute_reply":"2023-10-16T13:50:10.821128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(dataset_test))","metadata":{"papermill":{"duration":0.04113,"end_time":"2023-10-07T09:45:54.057067","exception":false,"start_time":"2023-10-07T09:45:54.015937","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:50:10.824100Z","iopub.execute_input":"2023-10-16T13:50:10.824647Z","iopub.status.idle":"2023-10-16T13:50:10.829887Z","shell.execute_reply.started":"2023-10-16T13:50:10.824614Z","shell.execute_reply":"2023-10-16T13:50:10.828897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"################################### PREDICT ####################################\n\npredictions = np.array([])\n\nwith torch.no_grad():\n    model.eval()\n\n    for images, _ in dataloader_test:\n      images = images.to(device)\n\n      outputs = model(images)\n\n      # value, index\n      v, pred = torch.max(outputs, 1)\n\n      pred = pred.cpu().numpy()\n\n      predictions = np.concatenate((predictions, pred), axis = None)","metadata":{"papermill":{"duration":1581.602113,"end_time":"2023-10-07T10:12:15.691800","exception":false,"start_time":"2023-10-07T09:45:54.089687","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T13:50:10.831269Z","iopub.execute_input":"2023-10-16T13:50:10.831803Z","iopub.status.idle":"2023-10-16T14:17:10.706446Z","shell.execute_reply.started":"2023-10-16T13:50:10.831774Z","shell.execute_reply":"2023-10-16T14:17:10.705433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_test.df['encoded'] = predictions.astype(int)","metadata":{"papermill":{"duration":0.042316,"end_time":"2023-10-07T10:12:15.768291","exception":false,"start_time":"2023-10-07T10:12:15.725975","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T14:17:10.707978Z","iopub.execute_input":"2023-10-16T14:17:10.708672Z","iopub.status.idle":"2023-10-16T14:17:10.750014Z","shell.execute_reply.started":"2023-10-16T14:17:10.708641Z","shell.execute_reply":"2023-10-16T14:17:10.749099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_test.df['label'] = dataset_test.df['encoded'].map(dataset.annot_dict_reversed)","metadata":{"papermill":{"duration":0.04683,"end_time":"2023-10-07T10:12:15.847449","exception":false,"start_time":"2023-10-07T10:12:15.800619","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T14:17:10.751347Z","iopub.execute_input":"2023-10-16T14:17:10.751678Z","iopub.status.idle":"2023-10-16T14:17:10.764099Z","shell.execute_reply.started":"2023-10-16T14:17:10.751648Z","shell.execute_reply":"2023-10-16T14:17:10.763167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_test.df.head()","metadata":{"papermill":{"duration":0.044336,"end_time":"2023-10-07T10:12:15.924207","exception":false,"start_time":"2023-10-07T10:12:15.879871","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T14:17:37.099521Z","iopub.execute_input":"2023-10-16T14:17:37.099893Z","iopub.status.idle":"2023-10-16T14:17:37.109815Z","shell.execute_reply.started":"2023-10-16T14:17:37.099867Z","shell.execute_reply":"2023-10-16T14:17:37.108488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Submission file:","metadata":{"papermill":{"duration":0.040211,"end_time":"2023-10-07T10:12:17.210149","exception":false,"start_time":"2023-10-07T10:12:17.169938","status":"completed"},"tags":[]}},{"cell_type":"code","source":"dataset_test.df.drop(columns ='encoded', inplace=True)\ndataset_test.df.to_csv('submission.csv', index=False)","metadata":{"papermill":{"duration":0.370897,"end_time":"2023-10-07T10:12:17.620640","exception":false,"start_time":"2023-10-07T10:12:17.249743","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-10-16T14:17:40.267175Z","iopub.execute_input":"2023-10-16T14:17:40.267527Z","iopub.status.idle":"2023-10-16T14:17:40.618816Z","shell.execute_reply.started":"2023-10-16T14:17:40.267501Z","shell.execute_reply":"2023-10-16T14:17:40.617831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\n\n# Saving the model\ntorch.save(model, 'model.pth')\n\n# Loading the model\nmodel = torch.load('model.pth')\n","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:20:01.077181Z","iopub.execute_input":"2023-10-16T14:20:01.077639Z","iopub.status.idle":"2023-10-16T14:20:02.555664Z","shell.execute_reply.started":"2023-10-16T14:20:01.077604Z","shell.execute_reply":"2023-10-16T14:20:02.554578Z"},"trusted":true},"execution_count":null,"outputs":[]}]}