{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Dataload","execution_count":null},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import torch\nimport os\nfrom skimage import io\nimport matplotlib.pyplot as plt\nfrom torch.utils.data import Dataset, DataLoader, ConcatDataset\nimport numpy as np\nimport torchvision.transforms as transforms\nimport torch.nn.functional as F\n\nUSE_CUDA = torch.cuda.is_available()\nDEVICE = torch.device(\"cuda\" if USE_CUDA else \"cpu\")\n\ntransforms = transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean=[0.485,0.456,0.406],\n                                                                             std=[0.229,0.224,0.225])])\n\nclass MyDataset(Dataset):\n  def __init__(self, image_dir, label, transforms=None):\n    self.image_dir = image_dir\n    self.label = label\n    self.image_list = os.listdir(self.image_dir)\n    self.transforms = transforms\n  \n  def __len__(self):\n    return len(self.image_list)\n  \n  def __getitem__(self,idx):\n    # if torch.is_tensor(idx):\n    #   idx = idx.tolist()\n\n    image_name = os.path.join(self.image_dir, self.image_list[idx])\n    image = io.imread(image_name)\n\n    ### transform\n    image = transforms(image)\n\n    return (image,self.label)\n\nroot = '/kaggle/input/'\ninter = os.listdir(root)[0]\nroot = root + inter\n#cheetah : 0 , jaguar : 1, tiger : 2, hyena : 3\n\ncheetah_train = MyDataset(root+\"/train/cheetah_train_resized\",0,transforms)\njaguar_train = MyDataset(root+\"/train/jaguar_train_resized\",1,transforms)\ntiger_train = MyDataset(root+\"/train/tiger_train_resized\",2,transforms)\nhyena_train = MyDataset(root+\"/train/hyena_train_resized\",3,transforms)\ntrain_set = ConcatDataset([cheetah_train, jaguar_train, tiger_train, hyena_train])\nprint(\"Number of Training set images : \", len(train_set))\n\ncheetah_val = MyDataset(root+\"/validation/cheetah_validation_resized\",0, transforms)\njaguar_val = MyDataset(root+\"/validation/jaguar_validation_resized\",1, transforms)\ntiger_val = MyDataset(root+\"/validation/tiger_validation_resized\",2, transforms)\nhyena_val = MyDataset(root+\"/validation/hyena_validation_resized\",3,transforms)\nval_set = ConcatDataset([cheetah_val, jaguar_val, tiger_val, hyena_val])\nprint(\"Numver of Validation set images : \", len(val_set))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# MODEL","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch.nn as nn\nimport torch.optim as optim\nimport torchvision.models as models\n\n### learning rate\nLR = 0.001\nEPOCH = 5\nBATCH_SIZE = 32\n\n\ntrain_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle = True)\nval_loader = DataLoader(val_set, batch_size=BATCH_SIZE, shuffle=True)\n\nmodel = models.resnet18(pretrained=False).to(DEVICE)\noptimizer = optim.Adam(model.parameters(), lr=LR)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# TRAIN","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def train(model, train_loader, optimizer, epoch):\n  model.train()\n  for batch_idx, (image, target) in enumerate(train_loader):\n    data, target = image.to(DEVICE), target.to(DEVICE)\n    optimizer.zero_grad()\n    output = model(data)\n    loss = F.cross_entropy(output, target)\n    loss.backward()\n    optimizer.step()\n\n    if batch_idx % 100 == 0 :\n      print('Train Epoch : {} [{}/{} ({:.0f})%]\\tLoss: {:.6f}'\n      .format(epoch, batch_idx*len(image),len(train_loader.dataset), 100.*batch_idx / len(train_loader), loss.item()))\n\ndef evaluate(model, test_loader):\n  model.eval()\n  test_loss =0\n  correct =0\n  with torch.no_grad():\n    for (image, target) in test_loader:\n      image, label = image.to(DEVICE), target.to(DEVICE)\n      output = model(image)\n\n      test_loss += F.cross_entropy(output, label, reduction='sum').item()\n      pred = output.max(1, keepdim=True)[1]\n      correct+= pred.eq(label.view_as(pred)).sum().item()\n  \n  test_loss /= len(test_loader.dataset)\n  test_accuracy = 100. * correct / len(test_loader.dataset)\n  return test_loss, test_accuracy","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# EXECUTE","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"for epoch in range(1, EPOCH+1):\n    train(model, train_loader, optimizer, epoch)\n    test_loss, test_accuracy = evaluate(model, val_loader)\n    print('[{}] Test Loss : {:.4f}, Accuracy : {:.4f}%'.format(epoch, test_loss, test_accuracy))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# TEST LOADER","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"class TestDataset(Dataset):\n  def __init__(self, image_dir, transforms=None):\n    self.image_dir = image_dir\n    self.image_list = os.listdir(self.image_dir)\n    self.transforms = transforms\n  \n  def __len__(self):\n    return len(self.image_list)\n  \n  def __getitem__(self,idx):\n    # if torch.is_tensor(idx):\n    #   idx = idx.tolist()\n\n    image_name = os.path.join(self.image_dir, self.image_list[idx])\n    image = io.imread(image_name)\n\n    ### transform\n    image = transforms(image)\n\n    return (image,self.image_list[idx].split('.')[0])\n\n\nroot = '/kaggle/input/testoftest'\n\ntest_set = TestDataset(root, transforms)\ntest_loader = DataLoader(test_set)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Get prediction","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\n\n\n#cheetah : 0 , jaguar : 1, tiger : 2, hyena : 3\nmap = ['cheetah','jaguar','tiger','hyena']\n\nmodel.eval()\ndf = pd.DataFrame(columns=['id','category'])\nwith torch.no_grad():\n    for (image, image_name) in test_loader:\n        image = image.to(DEVICE)\n        output = model(image)\n        pred = output.max(1, keepdim=True)[1]\n        df = df.append(pd.DataFrame([[image_name[0], map[pred.squeeze().tolist()]]], columns=['id','category']))\n\ndf\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Save CSV","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"df.to_csv('/kaggle/working/'+'res.csv', index=False)","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}