{"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":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tqdm\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F","metadata":{"papermill":{"duration":2.709798,"end_time":"2023-06-21T21:24:17.970212","exception":false,"start_time":"2023-06-21T21:24:15.260414","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:01:48.792264Z","iopub.execute_input":"2023-08-07T13:01:48.792741Z","iopub.status.idle":"2023-08-07T13:01:52.424599Z","shell.execute_reply.started":"2023-08-07T13:01:48.792704Z","shell.execute_reply":"2023-08-07T13:01:52.422966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if(torch.cuda.is_available()):\n    device = torch.device('cuda')\nelif(torch.backends.mps.is_available()):\n    device = torch.device('mps')\nelse:\n    device = torch.device('cpu')","metadata":{"papermill":{"duration":0.078558,"end_time":"2023-06-21T21:24:18.053630","exception":false,"start_time":"2023-06-21T21:24:17.975072","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:01:52.426864Z","iopub.execute_input":"2023-08-07T13:01:52.427498Z","iopub.status.idle":"2023-08-07T13:01:52.434364Z","shell.execute_reply.started":"2023-08-07T13:01:52.427463Z","shell.execute_reply":"2023-08-07T13:01:52.433089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform_train = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.RandomHorizontalFlip(0.1),\n    transforms.RandomRotation(20),\n    transforms.ToTensor(),\n    transforms.RandomAdjustSharpness(sharpness_factor = 2, p = 0.1),\n    transforms.ColorJitter(brightness = 0.1, contrast = 0.1, saturation = 0.1),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261)),\n    # These values are mostly used by researchers as found to very useful in fast convergence\n\n    transforms.RandomErasing(p=0.75,scale=(0.02, 0.1),value = 1.0, inplace = False)\n])\n\ntransform_test = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Resize((224, 224)),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261)),\n])","metadata":{"execution":{"iopub.status.busy":"2023-08-07T13:01:52.436254Z","iopub.execute_input":"2023-08-07T13:01:52.437640Z","iopub.status.idle":"2023-08-07T13:01:52.451877Z","shell.execute_reply.started":"2023-08-07T13:01:52.437560Z","shell.execute_reply":"2023-08-07T13:01:52.450426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMAGE_SIZE = 32\nbatch_size = 64\nmean, std = torch.tensor([0.4914, 0.4822, 0.4465]), torch.tensor([0.247, 0.243, 0.261])\n# These values are mostly used by researchers as found to very useful in fast convergence\n\ntrain_dataset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform_train)\nval_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)\n\ntrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size , shuffle = True)\n\nval_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size , shuffle = False)\n\nclasses = [ 'airplane', 'automobile', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck']","metadata":{"papermill":{"duration":8.30103,"end_time":"2023-06-21T21:24:26.359209","exception":false,"start_time":"2023-06-21T21:24:18.058179","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:01:54.547248Z","iopub.execute_input":"2023-08-07T13:01:54.547807Z","iopub.status.idle":"2023-08-07T13:02:02.234719Z","shell.execute_reply.started":"2023-08-07T13:01:54.547761Z","shell.execute_reply":"2023-08-07T13:02:02.233503Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def imshow(img):\n    img = img / 2 + 0.5     # unnormalize\n    npimg = img.numpy()\n    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n    plt.show()\n\n\n# get some random training images\ndataiter = iter(train_loader)\nimages, labels = next(dataiter)\n\n# show images\nimshow(torchvision.utils.make_grid(images))\n# print labels\nprint(' '.join(f'{classes[labels[j]]:5s}' for j in range(batch_size)))","metadata":{"papermill":{"duration":0.405268,"end_time":"2023-06-21T21:24:26.769871","exception":false,"start_time":"2023-06-21T21:24:26.364603","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:02.236975Z","iopub.execute_input":"2023-08-07T13:02:02.237356Z","iopub.status.idle":"2023-08-07T13:02:03.839455Z","shell.execute_reply.started":"2023-08-07T13:02:02.237325Z","shell.execute_reply":"2023-08-07T13:02:03.838646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_dataset.data.shape  , \" - \" , val_dataset.data.shape)\nprint(len(train_dataset.targets))","metadata":{"papermill":{"duration":0.017845,"end_time":"2023-06-21T21:24:26.795953","exception":false,"start_time":"2023-06-21T21:24:26.778108","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:03.840537Z","iopub.execute_input":"2023-08-07T13:02:03.840887Z","iopub.status.idle":"2023-08-07T13:02:03.850506Z","shell.execute_reply.started":"2023-08-07T13:02:03.840857Z","shell.execute_reply":"2023-08-07T13:02:03.849398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# functions to show an image\n\ndef unnormalize(img):\n        # unnormalize\n    img[0]= img[0]*std[0] + mean[0]\n    img[1]= img[1]*std[1] + mean[1]\n    img[2]= img[2]*std[2] + mean[2]\n    return img\n    \ndef imshow(img):\n    # unnormalize\n    img = unnormalize(img)\n    npimg = img.numpy()\n    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n    plt.show()\n    \ndef im_convert(tensor):\n    img = tensor.cpu().clone().detach().numpy() #\n    img = img.transpose(1, 2, 0)\n    img = img * np.array(tuple(mean)) + np.array(tuple(std))\n    img = img.clip(0, 1) # Clipping the size to print the images later\n    return img\n","metadata":{"papermill":{"duration":0.021607,"end_time":"2023-06-21T21:24:26.825829","exception":false,"start_time":"2023-06-21T21:24:26.804222","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:03.853562Z","iopub.execute_input":"2023-08-07T13:02:03.854059Z","iopub.status.idle":"2023-08-07T13:02:03.868874Z","shell.execute_reply.started":"2023-08-07T13:02:03.854017Z","shell.execute_reply":"2023-08-07T13:02:03.867319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(20, 10)) \n\nfor i in range(len(classes)):\n    dataiter = iter(train_loader)\n    images, labels = next(dataiter)\n    for j in range (len(labels)):\n        if(labels[j].item() == i):\n            ax = fig.add_subplot(2, 5, i+1, xticks=[], yticks=[])\n            plt.imshow(im_convert(images[j]))\n            ax.set_title(classes[i])\n\n","metadata":{"papermill":{"duration":1.983979,"end_time":"2023-06-21T21:24:28.818680","exception":false,"start_time":"2023-06-21T21:24:26.834701","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:03.870985Z","iopub.execute_input":"2023-08-07T13:02:03.871456Z","iopub.status.idle":"2023-08-07T13:02:13.204954Z","shell.execute_reply.started":"2023-08-07T13:02:03.871417Z","shell.execute_reply":"2023-08-07T13:02:13.203664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(len(classes)):\n    dataiter = iter(train_loader)\n    images, labels = next(dataiter)\n    for j in range (len(labels)):\n        if(labels[j].item() == i):\n            print(classes[i])\n            imshow(images[j])\n            break","metadata":{"papermill":{"duration":2.319529,"end_time":"2023-06-21T21:24:31.148381","exception":false,"start_time":"2023-06-21T21:24:28.828852","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:13.206779Z","iopub.execute_input":"2023-08-07T13:02:13.207245Z","iopub.status.idle":"2023-08-07T13:02:18.958591Z","shell.execute_reply.started":"2023-08-07T13:02:13.207213Z","shell.execute_reply":"2023-08-07T13:02:18.957665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install validators matplotlib","metadata":{"execution":{"iopub.status.busy":"2023-08-07T13:02:18.960016Z","iopub.execute_input":"2023-08-07T13:02:18.960924Z","iopub.status.idle":"2023-08-07T13:02:36.497410Z","shell.execute_reply.started":"2023-08-07T13:02:18.960885Z","shell.execute_reply":"2023-08-07T13:02:36.495687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"efficientnet = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_efficientnet_widese_b4', pretrained=True)\n# Define the new classifier with 10 output classes\nefficientnet.classifier.fc = nn.Linear(1792, 10)\nefficientnet","metadata":{"papermill":{"duration":0.03296,"end_time":"2023-06-21T21:24:31.194396","exception":false,"start_time":"2023-06-21T21:24:31.161436","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:36.499628Z","iopub.execute_input":"2023-08-07T13:02:36.500212Z","iopub.status.idle":"2023-08-07T13:02:50.742750Z","shell.execute_reply.started":"2023-08-07T13:02:36.500162Z","shell.execute_reply":"2023-08-07T13:02:50.741425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = efficientnet\nmodel.to(device)\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model.parameters(), lr=0.001,momentum=0.9)","metadata":{"papermill":{"duration":2.722416,"end_time":"2023-06-21T21:24:33.931402","exception":false,"start_time":"2023-06-21T21:24:31.208986","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T13:02:50.744470Z","iopub.execute_input":"2023-08-07T13:02:50.744909Z","iopub.status.idle":"2023-08-07T13:02:50.768857Z","shell.execute_reply.started":"2023-08-07T13:02:50.744873Z","shell.execute_reply":"2023-08-07T13:02:50.767137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_epochs = 25\n# Training loop\ntrain_acc = []\ntrain_loss = []\nval_acc = []\nval_loss = []\nfor epoch in range(num_epochs):\n    running_loss = 0.0\n    correct_train = 0\n    total_train = 0\n\n    model.train()  # Set the model to training mode\n\n    for images, labels in train_loader:\n        images = images.to(device)  # Move the input tensor to the GPU\n        labels = labels.to(device)  # Move the labels tensor to the GPU\n\n        optimizer.zero_grad()\n        \n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        # Backward pass and optimization\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n\n        # Calculate training accuracy\n        _, predicted = torch.max(outputs.data, 1)\n        total_train += labels.size(0)\n        correct_train += (predicted == labels).sum().item()\n\n    training_loss = running_loss / len(train_loader)\n    training_accuracy = 100 * correct_train / total_train\n    \n\n    # Evaluation on test set\n    model.eval()  # Set the model to evaluation mode\n    test_loss = 0.0\n    correct_test = 0\n    total_test = 0\n\n    with torch.no_grad():\n        for images, labels in val_loader:\n            images = images.to(device)  # Move the input tensor to the GPU\n            labels = labels.to(device)  # Move the labels tensor to the GPU\n\n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            test_loss += loss.item()\n\n            # Calculate test accuracy\n            _, predicted = torch.max(outputs.data, 1)\n            total_test += labels.size(0)\n            correct_test += (predicted == labels).sum().item()\n\n    test_loss /= len(val_loader)\n    test_accuracy = 100 * correct_test / total_test\n    \n    train_acc.append(training_accuracy)\n    train_loss.append(training_loss)\n    val_acc.append(test_accuracy)\n    val_loss.append(test_loss)\n\n    # Print the average loss and accuracy for this epoch\n    print(f\"Epoch {epoch+1}:\")\n    print(f\"  Train Loss: {training_loss:.4f} | Train Accuracy: {training_accuracy:.2f}%\")\n    print(f\"  Test Loss: {test_loss:.4f} | Test Accuracy: {test_accuracy:.2f}%\")\n    print(\"*************************\")","metadata":{"papermill":{"duration":2251.786242,"end_time":"2023-06-21T22:02:05.731699","exception":false,"start_time":"2023-06-21T21:24:33.945457","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-07T00:20:41.878371Z","iopub.execute_input":"2023-08-07T00:20:41.878730Z","iopub.status.idle":"2023-08-07T00:20:41.886000Z","shell.execute_reply.started":"2023-08-07T00:20:41.878698Z","shell.execute_reply":"2023-08-07T00:20:41.884350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = []\n\nwith torch.no_grad():\n    for data in val_loader:\n        images, labels = data\n        # calculate outputs by running images through the network\n        outputs = model(images.to(device))\n        # the class with the highest energy is what we choose as prediction\n        _, predicted = torch.max(outputs.data, 1)\n        preds.append(predicted)\npreds_transformed = [x.item() for x in torch.cat(preds)]\n","metadata":{"execution":{"iopub.status.busy":"2023-08-07T00:20:44.503836Z","iopub.execute_input":"2023-08-07T00:20:44.504197Z","iopub.status.idle":"2023-08-07T00:21:15.888837Z","shell.execute_reply.started":"2023-08-07T00:20:44.504164Z","shell.execute_reply":"2023-08-07T00:21:15.887761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import csv\nwith open('solution.csv', 'w', encoding='utf-8', newline='') as out:\n    writer = csv.writer(out)\n    writer.writerow([\"ID\",\"Label\"])\n    for i,label in enumerate(preds_transformed):\n        writer.writerow([i,label])","metadata":{"execution":{"iopub.status.busy":"2023-08-07T00:21:15.890737Z","iopub.execute_input":"2023-08-07T00:21:15.891068Z","iopub.status.idle":"2023-08-07T00:21:15.910325Z","shell.execute_reply.started":"2023-08-07T00:21:15.891042Z","shell.execute_reply":"2023-08-07T00:21:15.909429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}