{"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":"#COMP4121 MODEL 3 INFERENCE\n\nimport os\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader, Dataset\nimport torchvision.transforms as T\nimport torch\nimport torch.nn as nn\nfrom torchvision.utils import make_grid\nfrom torchvision.utils import save_image\nfrom IPython.display import Image\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport random\nimport torch.optim as optim\nimport time\nfrom PIL import Image\nimport pandas as pd\n\ntrain_image_path = '../input/resized-plant2021/img_sz_256/' #uses smaller version of dataset for efficiency\ntest_image_path = '../input/plant-pathology-2021-fgvc8/test_images/'\ntrain_df_path = '../input/plant-pathology-2021-fgvc8/train.csv'\ntest_df_path = '../input/plant-pathology-2021-fgvc8/sample_submission.csv'\n\ntrain_df = pd.read_csv(train_df_path)\n\nclasses_ = train_df.labels.unique().tolist()\n\nclass PlantDataSet(Dataset):\n    def __init__(self, main_dir, transform):\n        self.main_dir = main_dir\n        self.transform = transform\n        self.all_imgs = os.listdir(main_dir)\n\n    def __len__(self):\n        return len(self.all_imgs)\n\n    def __getitem__(self, idx):\n        img_loc = os.path.join(self.main_dir, self.all_imgs[idx])\n        image = Image.open(img_loc).convert(\"RGB\")\n        tensor_image = self.transform(image)\n        label = classes_.index(train_df.iloc[idx]['labels'])\n        return tensor_image, label\n    \ntransform = transforms.Compose(\n    [transforms.RandomHorizontalFlip(),\n     transforms.RandomResizedCrop(256),\n     transforms.ToTensor()])\n\nBATCH_SIZE = 256\n\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nclass Net(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.conv1 = nn.Conv2d(3, 6, 5)\n        self.pool = nn.MaxPool2d(2, 2)\n        self.conv2 = nn.Conv2d(6, 16, 5)\n        self.fc1 = nn.Linear(59536, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 12)\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\n\nnet = Net()\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)\n\nnet = Net()\nnet.load_state_dict(torch.load(\"../input/plant-cnn/cifar_net.pth\"))\n\nmy_dataset = PlantDataSet(test_image_path, transform=transform)\ntestloader = DataLoader(my_dataset , batch_size=256)\n\npreds = []\n\nwith torch.no_grad():\n    for data in testloader:\n        images, labels = data\n        # calculate outputs by running images through the network\n        outputs = net(images)\n        # the class with the highest energy is what we choose as prediction\n        _, predicted = torch.max(outputs.data, 1)\n        for pred in predicted:\n            preds.append(classes_[pred])\n        \ntest_df = pd.read_csv(test_df_path)\ntest_df['labels'] = preds\ntest_df.to_csv('submission.csv', index=False)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-12-05T06:52:49.823212Z","iopub.execute_input":"2021-12-05T06:52:49.823812Z","iopub.status.idle":"2021-12-05T06:52:50.714606Z","shell.execute_reply.started":"2021-12-05T06:52:49.823759Z","shell.execute_reply":"2021-12-05T06:52:50.713740Z"},"trusted":true},"execution_count":null,"outputs":[]}]}