{"cells":[{"metadata":{},"cell_type":"markdown","source":"# CNN with PyTorch"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nimport torchvision\n\nfrom PIL import Image\n\nimport os\n#for dirname, _, filenames in os.walk('/kaggle/input'):\n#    for filename in filenames:\n#        print(os.path.join(dirname, filename))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(DEVICE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"LR = 3e-3\nBATCH_SIZE = 2\nNUM_EPOCHES = 2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"torch.manual_seed(0)\nnp.random.seed(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/cassava-leaf-disease-classification/train.csv\")\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CassavaLeafDiseaseDataset(torch.utils.data.Dataset):\n    def __init__(self, data, transforms, path=\"/kaggle/input/cassava-leaf-disease-classification/train_images/\"):\n        self.data = data\n        self.path = path\n        \n        self.transforms = transforms\n        \n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, index):\n        image_path = self.path + self.data.image_id.iloc[index]\n        return self.transforms(Image.open(image_path)), self.data.label.iloc[index]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(self):\n        super(CNN, self).__init__()\n        self.model = torch.hub.load('pytorch/vision:v0.6.0', 'resnet18', pretrained=True)\n        self.linear = nn.Linear(1000, 5)\n        \n    def forward(self, x):\n        x = self.model(x)\n        x = self.linear(x)\n        return F.softmax(x, dim=-1) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = CNN().to(DEVICE)\nmodel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transforms = torchvision.transforms.Compose([\n    torchvision.transforms.ToTensor(),\n    torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n\ntrain_dataset = CassavaLeafDiseaseDataset(train, transforms=transforms)\ntrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)\nfor img, label in train_loader:\n    print(\"Input Image Size: {}\".format(img.size()))\n    print(\"Input Image Label: {}\".format(label.size()))\n    out = model(img.to(DEVICE))\n    print(\"Output Image Size: {}\".format(out.size()))\n    break","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Training Loop"},{"metadata":{"trusted":true},"cell_type":"code","source":"criterion = nn.NLLLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=LR)\nscheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=1)\n\nloss_hist = {}\nloss_hist[\"train accuracy\"] = []\nloss_hist[\"train loss\"] = []\n\nfor epoch in range(1, NUM_EPOCHES+1):\n    model.train()\n    \n    epoch_train_loss = 0\n        \n    y_true_train = []\n    y_pred_train = []\n        \n    for batch_idx, (img, labels) in enumerate(train_loader):\n        img = img.to(DEVICE)\n        labels = labels.to(DEVICE)\n        \n        preds, teacher_preds = model(img)\n        \n        loss = criterion(preds, labels)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        y_pred_train.extend(preds.detach().argmax(dim=-1).tolist())\n        y_true_train.extend(labels.detach().tolist())\n            \n        epoch_train_loss += loss.item()\n    \n    loss_hist[\"train loss\"].append(epoch_train_loss)\n    \n    total_correct = len([True for x, y in zip(y_pred_train, y_true_train) if x==y])\n    total = len(y_pred_train)\n    accuracy = total_correct * 100 / total\n    \n    loss_hist[\"train accuracy\"].append(accuracy)\n    \n    print(\"-------------------------------------------------\")\n    print(\"Epoch: {} Train mean loss: {:.8f}\".format(epoch, epoch_train_loss))\n    print(\"       Train Accuracy%: \", accuracy, \"==\", total_correct, \"/\", total)\n    print(\"-------------------------------------------------\")","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}