{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#!pip install pretrainedmodels\n#!pip install albumentations\n#!pip install --upgrade efficientnet-pytorch","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.579989Z","iopub.execute_input":"2023-05-14T17:50:44.580344Z","iopub.status.idle":"2023-05-14T17:50:44.586653Z","shell.execute_reply.started":"2023-05-14T17:50:44.580316Z","shell.execute_reply":"2023-05-14T17:50:44.584841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\n\nimport torch\nimport torch.nn as nn\nimport torchvision\nfrom torchvision import transforms\nfrom torchvision.models import efficientnet_b7\nfrom torch.utils.data import Dataset, DataLoader\n\nfrom tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.592134Z","iopub.execute_input":"2023-05-14T17:50:44.5928Z","iopub.status.idle":"2023-05-14T17:50:44.599437Z","shell.execute_reply.started":"2023-05-14T17:50:44.592765Z","shell.execute_reply":"2023-05-14T17:50:44.597734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv_path = '../input/happy-whale-and-dolphin/train.csv'\ntrain_df = pd.read_csv(train_csv_path)\ntrain_df.head()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-14T17:50:44.602874Z","iopub.execute_input":"2023-05-14T17:50:44.603524Z","iopub.status.idle":"2023-05-14T17:50:44.667579Z","shell.execute_reply.started":"2023-05-14T17:50:44.603493Z","shell.execute_reply":"2023-05-14T17:50:44.666507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDataset(Dataset):\n    def __init__(self, root_dir, df, label_to_id, transform):\n        self.root_dir = root_dir\n        self.df = df\n        self.label_to_id = label_to_id\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, index):\n        image_path = os.path.join(self.root_dir, self.df.iloc[index, 0])\n        image = cv2.imread(image_path, cv2.IMREAD_COLOR)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        label = self.df.iloc[index, 2]\n        target = self.label_to_id[label]\n        \n        image = self.transform(image)\n        return image, torch.tensor(target)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.669511Z","iopub.execute_input":"2023-05-14T17:50:44.670093Z","iopub.status.idle":"2023-05-14T17:50:44.678797Z","shell.execute_reply.started":"2023-05-14T17:50:44.670059Z","shell.execute_reply":"2023-05-14T17:50:44.677853Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_transforms = transforms.Compose([transforms.ToPILImage(),\n                                       transforms.Resize((600,600)),\n                                       transforms.RandomHorizontalFlip(),\n                                       transforms.ToTensor(),\n                                       transforms.Normalize([0.5,0.5,0.5],\n                                                            [0.5,0.5,0.5])])","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.680369Z","iopub.execute_input":"2023-05-14T17:50:44.6808Z","iopub.status.idle":"2023-05-14T17:50:44.6908Z","shell.execute_reply.started":"2023-05-14T17:50:44.680699Z","shell.execute_reply":"2023-05-14T17:50:44.689905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_individual_ids = train_df.individual_id.unique()\nlabel_to_id = {}\nid_to_label = {}\nidx = 0\nfor label in unique_individual_ids:\n    label_to_id[label] = idx\n    id_to_label[idx] = label\n    idx += 1","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.693478Z","iopub.execute_input":"2023-05-14T17:50:44.693936Z","iopub.status.idle":"2023-05-14T17:50:44.716733Z","shell.execute_reply.started":"2023-05-14T17:50:44.693905Z","shell.execute_reply":"2023-05-14T17:50:44.715917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"root_dir = '../input/happy-whale-and-dolphin/train_images'\n\ndataset = CustomDataset(root_dir,\n                        train_df,\n                        label_to_id,\n                        train_transforms)\n\ntrain_loader = DataLoader(dataset, batch_size=8, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.718325Z","iopub.execute_input":"2023-05-14T17:50:44.718662Z","iopub.status.idle":"2023-05-14T17:50:44.724362Z","shell.execute_reply.started":"2023-05-14T17:50:44.718632Z","shell.execute_reply":"2023-05-14T17:50:44.723114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = efficientnet_b7(weights ='IMAGENET1K_V1')","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:44.726469Z","iopub.execute_input":"2023-05-14T17:50:44.726824Z","iopub.status.idle":"2023-05-14T17:50:46.154357Z","shell.execute_reply.started":"2023-05-14T17:50:44.726794Z","shell.execute_reply":"2023-05-14T17:50:46.153429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.classifier = nn.Sequential(\n    nn.Dropout(),\n    nn.Linear(2560, len(label_to_id))\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:46.155976Z","iopub.execute_input":"2023-05-14T17:50:46.156345Z","iopub.status.idle":"2023-05-14T17:50:46.533234Z","shell.execute_reply.started":"2023-05-14T17:50:46.156312Z","shell.execute_reply":"2023-05-14T17:50:46.532285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for name, param in model.named_parameters():\n    if 'classifier' not in name:\n        param.requires_grad = False","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:46.536245Z","iopub.execute_input":"2023-05-14T17:50:46.536621Z","iopub.status.idle":"2023-05-14T17:50:46.54744Z","shell.execute_reply.started":"2023-05-14T17:50:46.536589Z","shell.execute_reply":"2023-05-14T17:50:46.544797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#images, targets = next(iter(train_loader))\n#images.shape, targets.shape","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:46.54912Z","iopub.execute_input":"2023-05-14T17:50:46.549856Z","iopub.status.idle":"2023-05-14T17:50:46.556514Z","shell.execute_reply.started":"2023-05-14T17:50:46.549798Z","shell.execute_reply":"2023-05-14T17:50:46.555545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#output = model(images.cpu())\n#output.shape","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:46.55822Z","iopub.execute_input":"2023-05-14T17:50:46.558977Z","iopub.status.idle":"2023-05-14T17:50:46.565547Z","shell.execute_reply.started":"2023-05-14T17:50:46.558911Z","shell.execute_reply":"2023-05-14T17:50:46.564608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\ndevice","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:46.567173Z","iopub.execute_input":"2023-05-14T17:50:46.568079Z","iopub.status.idle":"2023-05-14T17:50:46.577659Z","shell.execute_reply.started":"2023-05-14T17:50:46.568022Z","shell.execute_reply":"2023-05-14T17:50:46.576729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train model\n\nmodel.to(device)\nEPOCHS = 1\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.0001)\n\nlast_train_loss = 0\n\nfor epoch in range(EPOCHS):\n    print(f'Epoch: {epoch+1}/{EPOCHS}')\n    \n    correct = 0\n    total = 0\n    losses = []\n    \n    for batch_idx, data in enumerate(tqdm(train_loader)):\n        images, targets = data\n        images = images.to(device)\n        targets = targets.to(device)\n        \n        output = model(images)  # (batch_size, num_classes)\n        \n        loss = criterion(output, targets)\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        _, pred = torch.max(output, 1)\n        correct += (pred == targets).sum().item()\n        total += pred.size(0)\n        \n        losses.append(loss.item())\n        \n    train_loss = np.mean(losses)\n    train_acc = correct * 1.0 / total\n    \n    last_train_loss = train_loss\n    print(f'Train Loss: {train_loss}\\tTrain Acc: {train_acc}')","metadata":{"execution":{"iopub.status.busy":"2023-05-14T17:50:46.578949Z","iopub.execute_input":"2023-05-14T17:50:46.579953Z","iopub.status.idle":"2023-05-14T19:59:20.718356Z","shell.execute_reply.started":"2023-05-14T17:50:46.579884Z","shell.execute_reply":"2023-05-14T19:59:20.71744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save({\n    'epoch': EPOCHS,\n    'model_state_dict': model.state_dict(),\n    'optimizer_state_dict': optimizer.state_dict(),\n    'loss': last_train_loss\n}, 'last_checkpoint.pth.tar')","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:00:25.089546Z","iopub.execute_input":"2023-05-14T20:00:25.089988Z","iopub.status.idle":"2023-05-14T20:00:26.608851Z","shell.execute_reply.started":"2023-05-14T20:00:25.08996Z","shell.execute_reply":"2023-05-14T20:00:26.607886Z"},"trusted":true},"execution_count":null,"outputs":[]}]}