{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.8.17","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\n\nfrom torch.utils.data import DataLoader\nfrom torch.utils.data import Dataset\nimport torchvision\nfrom torchvision import datasets , transforms\nfrom torchvision import models","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-05T16:39:34.775320Z","iopub.execute_input":"2023-09-05T16:39:34.775707Z","iopub.status.idle":"2023-09-05T16:39:34.780973Z","shell.execute_reply.started":"2023-09-05T16:39:34.775677Z","shell.execute_reply":"2023-09-05T16:39:34.779961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((300,300)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))\n])\n\ntransform_tests = torchvision.transforms.Compose([\n    transforms.Resize((300,300)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))\n    ])","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:35.700489Z","iopub.execute_input":"2023-09-05T16:39:35.700888Z","iopub.status.idle":"2023-09-05T16:39:35.707712Z","shell.execute_reply.started":"2023-09-05T16:39:35.700854Z","shell.execute_reply":"2023-09-05T16:39:35.706834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import zipfile\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip', 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/train')\n\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip', 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/test')","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:36.589981Z","iopub.execute_input":"2023-09-05T16:39:36.590950Z","iopub.status.idle":"2023-09-05T16:39:50.230852Z","shell.execute_reply.started":"2023-09-05T16:39:36.590910Z","shell.execute_reply":"2023-09-05T16:39:50.229942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '/kaggle/working/train/train'\ntest_dir = '/kaggle/working/test/test'","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:50.232740Z","iopub.execute_input":"2023-09-05T16:39:50.233097Z","iopub.status.idle":"2023-09-05T16:39:50.236854Z","shell.execute_reply.started":"2023-09-05T16:39:50.233054Z","shell.execute_reply":"2023-09-05T16:39:50.236065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\ndata = {\"imgpath\": [] , \"labels\": [] }\n\nfiles = os.listdir(train_dir)\n\nfor file in files:\n    name = file.split('.')\n    imgpath = train_dir + \"/\" +  file\n    label = name[0]\n    data['imgpath'].append(imgpath)\n    data['labels'].append(label)\n    \n\nfiles = os.listdir(test_dir)\n\nfor file in files:\n    name = file.split('.')\n    imgpath = test_dir + \"/\" +  file\n    label = name[0]\n    data['imgpath'].append(imgpath)\n    data['labels'].append(label)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:50.238112Z","iopub.execute_input":"2023-09-05T16:39:50.238400Z","iopub.status.idle":"2023-09-05T16:39:50.316195Z","shell.execute_reply.started":"2023-09-05T16:39:50.238375Z","shell.execute_reply":"2023-09-05T16:39:50.315462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nimport pandas as pd\n\nanimal_df = pd.DataFrame(data)\n\nlb = LabelEncoder()\nanimal_df['encoded_labels'] = lb.fit_transform(animal_df['labels'])\nlb.classes_\n\ndic = {}\n\nfor cnt , ele in enumerate(lb.classes_):\n    dic[ele] = cnt","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:50.318134Z","iopub.execute_input":"2023-09-05T16:39:50.318422Z","iopub.status.idle":"2023-09-05T16:39:51.167598Z","shell.execute_reply.started":"2023-09-05T16:39:50.318396Z","shell.execute_reply":"2023-09-05T16:39:51.166595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntraining_set , temp_set = train_test_split(animal_df , test_size = 0.2 , random_state = 69)\nvalid_set , test_set = train_test_split(temp_set , test_size = 0.5 , random_state = 69)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:51.168787Z","iopub.execute_input":"2023-09-05T16:39:51.169217Z","iopub.status.idle":"2023-09-05T16:39:51.212494Z","shell.execute_reply.started":"2023-09-05T16:39:51.169189Z","shell.execute_reply":"2023-09-05T16:39:51.211473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import Dataset\nimport cv2\nfrom PIL import Image\n\nclass AnimalDataset(Dataset):\n    def __init__(self, image_paths , image_labels):\n        self.image_paths = image_paths\n        self.image_labels = image_labels\n        self.transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])\n        \n    def __len__(self):\n        return len(self.image_paths)\n\n    def __getitem__(self, idx):\n        image_filepath = self.image_paths[idx]\n        image = Image.open(image_filepath)\n        \n        label = self.image_labels[idx]\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return image , label","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:51.213736Z","iopub.execute_input":"2023-09-05T16:39:51.214028Z","iopub.status.idle":"2023-09-05T16:39:51.250479Z","shell.execute_reply.started":"2023-09-05T16:39:51.214001Z","shell.execute_reply":"2023-09-05T16:39:51.249721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = AnimalDataset(list(training_set[\"imgpath\"])  ,   list(training_set['encoded_labels']))\ntest_dataset = AnimalDataset(list(test_set[\"imgpath\"]) ,     list(test_set['encoded_labels']))\nval_dataset = AnimalDataset(list(valid_set[\"imgpath\"]) ,     list(valid_set['encoded_labels']))","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:51.251528Z","iopub.execute_input":"2023-09-05T16:39:51.251832Z","iopub.status.idle":"2023-09-05T16:39:51.270783Z","shell.execute_reply.started":"2023-09-05T16:39:51.251804Z","shell.execute_reply":"2023-09-05T16:39:51.269923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    train_dataset, batch_size=64, shuffle=True\n)\n\nvalid_loader = DataLoader(\n    val_dataset, batch_size=64, shuffle=True\n)\n\n\ntest_loader = DataLoader(\n    test_dataset, batch_size=64, shuffle=True\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:51.271981Z","iopub.execute_input":"2023-09-05T16:39:51.272337Z","iopub.status.idle":"2023-09-05T16:39:51.283178Z","shell.execute_reply.started":"2023-09-05T16:39:51.272306Z","shell.execute_reply":"2023-09-05T16:39:51.282261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\n\nmodel = models.resnet50(weights='ResNet50_Weights.IMAGENET1K_V2')\nfc_inputs = model.fc.in_features\n\nfor param in model.parameters():\n    param.requires_grad = False\n\nfc_inputs = model.fc.in_features\nmodel.fc = nn.Sequential(\n    nn.Linear(fc_inputs, 500),\n    nn.ReLU(),\n    nn.Dropout(0.6),\n    nn.Linear(500 , 100),\n    nn.ReLU(),\n    nn.Dropout(0.4),\n    nn.Linear(100, len(lb.classes_)), \n    nn.LogSoftmax(dim=1) # For using NLLLoss()\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:51.284262Z","iopub.execute_input":"2023-09-05T16:39:51.284553Z","iopub.status.idle":"2023-09-05T16:39:51.870803Z","shell.execute_reply.started":"2023-09-05T16:39:51.284528Z","shell.execute_reply":"2023-09-05T16:39:51.869854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch_xla\nimport torch_xla.core.xla_model as xm\nimport torch_xla.distributed.parallel_loader as pl","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:51.873624Z","iopub.execute_input":"2023-09-05T16:39:51.873914Z","iopub.status.idle":"2023-09-05T16:39:52.187825Z","shell.execute_reply.started":"2023-09-05T16:39:51.873888Z","shell.execute_reply":"2023-09-05T16:39:52.186477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = xm.xla_device()\nmodel = model.to(device)\n\n# Define loss and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model.parameters(), lr=0.001)\n\ntrain_loader = pl.ParallelLoader(train_loader, [device])\n\n# Training loop\nnum_epochs = 25\nfor epoch in range(num_epochs):\n    model.train()\n    for batch in train_loader.per_device_loader(device):\n        inputs, labels = batch\n        \n        # Move data to TPU device\n        inputs = inputs.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        xm.optimizer_step(optimizer)\n\n    print(f'Epoch [{epoch+1}/{num_epochs}] Loss: {loss.item():.4f}')\n","metadata":{"execution":{"iopub.status.busy":"2023-09-05T16:39:52.189437Z","iopub.execute_input":"2023-09-05T16:39:52.189783Z","iopub.status.idle":"2023-09-05T16:43:43.174459Z","shell.execute_reply.started":"2023-09-05T16:39:52.189737Z","shell.execute_reply":"2023-09-05T16:43:43.173429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}],"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"}}