{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nimport torch.autograd as autograd         \nfrom torch import Tensor                 \nimport torch.nn as nn                    \nimport torch.nn.functional as F          \nimport torch.optim\nfrom torch.optim import lr_scheduler\nfrom torch.autograd import Variable\nfrom torch.utils.data import Dataset, DataLoader \nfrom PIL import Image\nimport torchvision\nfrom torchvision import transforms as tf,models\nimport matplotlib.pyplot as plt \n%matplotlib inline\n\nfrom os import listdir, makedirs, getcwd, remove\nfrom os.path import isfile, join, abspath, exists, isdir, expanduser","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.random.seed(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_dir = '../input/dog-breed-identification/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = pd.read_csv('../input/dog-breed-identification/labels.csv')\nbreed_list = list(labels.groupby('breed').count().sort_values(by='id', ascending=True).index)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def split_indices(labels,val_pct):\n    n_val = int(val_pct*labels.shape[0])\n    idxs = np.random.permutation(labels.shape[0])\n    return labels.iloc[idxs[n_val:]], labels.iloc[idxs[:n_val]]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_labels, val_labels = split_indices(labels,val_pct=0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class DogBreedDataset(Dataset):\n    def __init__(self, root_dir, labels, transforms=None):\n        self.root_dir = root_dir\n        self.labels= labels\n        self.transforms = transforms\n        \n    def __len__(self):\n        return(len(self.labels))\n    \n    def __getitem__(self,idx):\n        img_id = '{}.jpg'.format(self.labels.iloc[idx,0])\n        img_dir = (self.root_dir+'train/'+img_id)\n        img = Image.open(img_dir)\n        img_name = self.labels.iloc[idx,1]\n        if self.transforms:\n            img = self.transforms(img)\n        img_class = breed_list.index(img_name)\n        return img, img_class","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"normalize = tf.Normalize(\n   mean=[0.485, 0.456, 0.406],\n   std=[0.229, 0.224, 0.225]\n)\ntransforms = tf.Compose([ tf.CenterCrop(512),\n                         tf.Resize(128),\n                        tf.ToTensor(),\n                        normalize])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ds = DogBreedDataset(data_dir,train_labels,transforms=transforms)\nval_ds = DogBreedDataset(data_dir, val_labels,transforms=transforms)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dl = DataLoader(train_ds,batch_size=32)\nval_dl = DataLoader(val_ds,batch_size=32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"use_gpu = torch.cuda.is_available()\ndevice = torch.device(\"cuda\" if use_gpu else \"cpu\")\n\nmodel = models.resnet18(pretrained=True)\nnum_ftrs = model.fc.in_features\nmodel.fc = torch.nn.Linear(num_ftrs, 120)\nfor param in model.parameters():\n    param.requires_grad = True\nif use_gpu:\n    model = model.cuda()\n\ncriterion = torch.nn.CrossEntropyLoss()\noptimizer = torch.optim.SGD(model.fc.parameters(), lr=0.01,momentum=0.9)\nexp_lr_scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, factor=0.5,patience = 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train_model(model, train_dl,val_dl, criterion, optimizer, scheduler, num_epochs=2):\n    for epoch in range(num_epochs):\n\n        train_loss = 0.0\n        val_loss = 0.0\n        train_correct =0.0\n        val_correct=0.0\n   \n        model.train(True)\n    \n        for batch_i, (data, target) in enumerate(train_dl):\n       \n            if use_gpu:\n                data, target = data.cuda(), target.cuda()\n            optimizer.zero_grad()\n       \n            output = model(data)\n            _, preds = torch.max(output.data, 1)\n            train_correct+= torch.sum(preds == target.data)\n            loss = criterion(output, target)\n            loss.backward()\n            optimizer.step()\n            train_loss+= loss.item()\n\n            \n        model.train(False)\n        \n        for batch_i, (data, target) in enumerate(val_dl):\n            if use_gpu:\n                data, target = data.cuda(), target.cuda()\n            output = model(data)\n            _, preds = torch.max(output.data, 1)\n            val_correct+= torch.sum(preds == target.data)\n            loss = criterion(output, target)\n            val_loss += loss.item() \n            \n    \n        train_acc = train_correct*100/len(train_dl.dataset)\n        val_acc = val_correct*100/len(val_dl.dataset)\n        \n        scheduler.step(val_acc)\n        print('Epoch [{}/{}] train loss: {:.4f} acc: {:.2f} ' \n                  'valid loss: {:.4f} acc: {:.2f} '.format(\n                    epoch+1, num_epochs,\n                    train_loss, train_acc, \n                    val_loss, val_acc))\n        \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = train_model(model,train_dl,val_dl, criterion, optimizer, exp_lr_scheduler, num_epochs=5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}