{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport glob\n\nfrom PIL import Image\n\nimport torch \nfrom torch import nn, optim\nfrom torch.utils.data import Dataset, DataLoader\nimport torchvision.transforms as trans\nfrom torchvision import models","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"90e2069b5818c1de989b69a25a39e115cb3139e7","trusted":true},"cell_type":"code","source":"train_images = list(glob.iglob('../input/train/*.jpg'))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cdc95e62bd46debc179d362f856321e317c7f715","trusted":true},"cell_type":"code","source":"transforms = trans.Compose([\n    trans.RandomResizedCrop(224),\n    trans.ToTensor()\n])\n\nclass DogCatDataset:\n    def __init__(self, images, train=True, transform=None):\n        df = pd.DataFrame({'path': images})\n        if train:\n            df['label'] = df.path.map(lambda x: x.split('/')[-1].split('.')[0])\n            df['id'] = df.path.map(lambda x: x.split('/')[-1].split('.')[1])\n        else:\n            df['id'] = df.path.map(lambda x: x.split('/')[-1].split('.')[0])\n\n        self.train = train\n        self.df = df\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, i):\n        img = Image.open(self.df.at[i, 'path'])\n        \n        if self.train:\n            y = 1 if self.df.at[i, 'label'] == 'dog' else 0\n        else:\n            y = self.df.at[i, 'id'].astype('str')\n        \n        if self.transform:\n            img = self.transform(img)\n        return img, y","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ee4e9240daa3ff46adcaff4bdde1dd3f7eca79d0","trusted":true},"cell_type":"code","source":"train_dataset = DogCatDataset(train_images, transform=transforms)\ntrain_dl = DataLoader(train_dataset, batch_size=4, shuffle=True, num_workers=0)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"97e2d405a35dfaa695c3cab7fbb9b74cfef2d919","trusted":true},"cell_type":"code","source":"model = models.resnet18(pretrained=True)\nnum_ftrs = model.fc.in_features\nmodel.fc = nn.Linear(num_ftrs, 2)\ninput_size = 224","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b298473bd2f4941098d20ce424f5245375b23f61","trusted":true},"cell_type":"code","source":"device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')\nmodel = model.to(device)\ncriterion = nn.CrossEntropyLoss()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ba5f5f2427e9c7ef408d7ee595dd8c40f6fec27c"},"cell_type":"code","source":"optimizer = optim.Adam(model.parameters())","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e697f5e7d80c48582d01959aea28cefb2edcbf10","trusted":true},"cell_type":"code","source":"def train(e):\n    model.train()\n    l = a = n = 0\n    for i, (X, Y) in enumerate(train_dl):\n        optimizer.zero_grad()\n        X = X.to(device)\n        Y = Y.to(device)\n        preds = model(X)\n        loss = criterion(preds, Y)\n        loss.backward()\n        optimizer.step()\n        \n        l += loss.item()\n        a += (preds.argmax(dim=1) == Y).sum().item() / Y.shape[0]\n        n += 1\n        if (i+1) % 100 == 0:\n            print(f\"Epoch {e} Iter {i+1} Loss {l/n} Accuracy {a/n}\")\n            l = n = a = 0","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3c1c846110034620f8ccb6101e99402724139533","trusted":true},"cell_type":"code","source":"for i in range(5):\n    train(5)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}