{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"},{"sourceId":1243687,"sourceType":"datasetVersion","datasetId":690737}],"dockerImageVersionId":30636,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"https://www.kaggle.com/competitions/siim-isic-melanoma-classification","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\n# Input data folders are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all folders under the input directory\n\ninput_directory = '/kaggle/input'\n\nfor dirpath, dirnames, filenames in os.walk(input_directory):\n    for dirname in dirnames:\n        print(dirname)","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:51:49.708443Z","iopub.execute_input":"2024-01-30T09:51:49.709500Z","iopub.status.idle":"2024-01-30T09:54:27.253996Z","shell.execute_reply.started":"2024-01-30T09:51:49.709459Z","shell.execute_reply":"2024-01-30T09:54:27.252976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n!pip install -q efficientnet_pytorch\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\nimport cv2\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader,Dataset\nfrom torchvision import datasets, transforms, models # add models to the list\nfrom torchvision.utils import make_grid\nimport os\nfrom sklearn.model_selection import train_test_split\nfrom PIL import Image\nimport os\nfrom sklearn.metrics import auc,roc_auc_score\ndevice = torch.device(\"cpu\")\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nfrom efficientnet_pytorch import EfficientNet\nfrom torch.optim.lr_scheduler import ReduceLROnPlateau\nfrom sklearn.metrics import accuracy_score, roc_auc_score\nfrom sklearn.model_selection import StratifiedKFold, GroupKFold\nimport time\nimport datetime\nimport warnings\nimport random\nimport gc\nimport pickle\nimport warnings\n\n# Code where you want to ignore warnings\nwith warnings.catch_warnings():\n    warnings.simplefilter(\"ignore\")\nimport wandb\n#wandb.init(project='Skin Melanoma Detection', save_code=True,)","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:27.256322Z","iopub.execute_input":"2024-01-30T09:54:27.256763Z","iopub.status.idle":"2024-01-30T09:54:50.864450Z","shell.execute_reply.started":"2024-01-30T09:54:27.256721Z","shell.execute_reply":"2024-01-30T09:54:50.863579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir=('/kaggle/input/siim-isic-melanoma-classification/jpeg/train/')\ntest_dir=('/kaggle/input/siim-isic-melanoma-classification/jpeg/test/')\ntrain=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ntest=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')\nsubmission=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:50.865676Z","iopub.execute_input":"2024-01-30T09:54:50.865973Z","iopub.status.idle":"2024-01-30T09:54:51.016300Z","shell.execute_reply.started":"2024-01-30T09:54:50.865947Z","shell.execute_reply":"2024-01-30T09:54:51.015202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['target'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.018455Z","iopub.execute_input":"2024-01-30T09:54:51.018805Z","iopub.status.idle":"2024-01-30T09:54:51.040720Z","shell.execute_reply.started":"2024-01-30T09:54:51.018776Z","shell.execute_reply":"2024-01-30T09:54:51.039667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_0=train[train['target']==0].sample(6000)\ndf_1=train[train['target']==1]\ntrain=pd.concat([df_0,df_1])\ntrain=train.reset_index()","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.042025Z","iopub.execute_input":"2024-01-30T09:54:51.042372Z","iopub.status.idle":"2024-01-30T09:54:51.070338Z","shell.execute_reply.started":"2024-01-30T09:54:51.042343Z","shell.execute_reply":"2024-01-30T09:54:51.069325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels=[]\ndata=[]\nfor i in range(train.shape[0]):\n    data.append(train_dir + train['image_name'].iloc[i]+'.jpg')\n    if i == 1:\n        print(data)\n    labels.append(train['target'].iloc[i])\ndf=pd.DataFrame(data)\ndf.columns=['images']\ndf['target']=labels","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.071753Z","iopub.execute_input":"2024-01-30T09:54:51.072169Z","iopub.status.idle":"2024-01-30T09:54:51.364144Z","shell.execute_reply.started":"2024-01-30T09:54:51.072133Z","shell.execute_reply":"2024-01-30T09:54:51.363024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data=[]\nfor i in range(test.shape[0]):\n    test_data.append(test_dir + test['image_name'].iloc[i]+'.jpg')\ndf_test=pd.DataFrame(test_data)\ndf_test.columns=['images']","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.365617Z","iopub.execute_input":"2024-01-30T09:54:51.366019Z","iopub.status.idle":"2024-01-30T09:54:51.575082Z","shell.execute_reply.started":"2024-01-30T09:54:51.365982Z","shell.execute_reply":"2024-01-30T09:54:51.574065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_transform = transforms.Compose([\n        transforms.RandomRotation(10),      # rotate +/- 10 degrees\n        transforms.RandomHorizontalFlip(),  # reverse 50% of images\n        transforms.Resize(224),             # resize shortest side to 224 pixels\n        transforms.CenterCrop(224),         # crop longest side to 224 pixels at center\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406],\n                             [0.229, 0.224, 0.225])\n    ])\n\ntest_transform = transforms.Compose([\n        transforms.Resize(224),\n        transforms.CenterCrop(224),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406],\n                             [0.229, 0.224, 0.225])\n    ])","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.576500Z","iopub.execute_input":"2024-01-30T09:54:51.576944Z","iopub.status.idle":"2024-01-30T09:54:51.585125Z","shell.execute_reply.started":"2024-01-30T09:54:51.576906Z","shell.execute_reply":"2024-01-30T09:54:51.584043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageDataset(Dataset):\n    \n    def __init__(self, data_paths, labels, transform=None, mode='train'):\n        self.data = data_paths\n        self.labels = labels\n        self.transform = transform\n        self.mode = mode\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        img_name = self.data[idx]\n        try:\n            img = cv2.imread(img_name)\n            if img is None:\n                raise ValueError(f\"Error reading image: {img_name}\")\n            \n            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n            img = Image.fromarray(img)\n\n            if self.transform is not None:\n                img = self.transform(img)\n\n            img = img.cuda()\n\n            if self.mode == 'test':\n                return img\n            else:\n                labels = torch.tensor(self.labels[idx]).cuda()\n                return img, labels\n\n        except Exception as e:\n            print(f\"Error loading image: {img_name}. Error: {e}\")\n            return None, None  # You can choose to skip or handle this case\n","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.586463Z","iopub.execute_input":"2024-01-30T09:54:51.586847Z","iopub.status.idle":"2024-01-30T09:54:51.598501Z","shell.execute_reply.started":"2024-01-30T09:54:51.586817Z","shell.execute_reply":"2024-01-30T09:54:51.597424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class FocalLoss(nn.Module):\n    def __init__(self, alpha=0.25, gamma=2.0, logits=False, reduce=True):\n        super(FocalLoss, self).__init__()\n        self.alpha = alpha\n        self.gamma = gamma\n        self.logits = logits\n        self.reduce = reduce\n\n    def forward(self, inputs, targets):\n        if self.logits:\n            BCE_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduce=False)\n        else:\n            BCE_loss = F.binary_cross_entropy(inputs, targets, reduce=False)\n        pt = torch.exp(-BCE_loss)\n        F_loss = self.alpha * (1-pt)**self.gamma * BCE_loss\n\n        if self.reduce:\n            return torch.mean(F_loss)\n        else:\n            return F_loss","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.602333Z","iopub.execute_input":"2024-01-30T09:54:51.602671Z","iopub.status.idle":"2024-01-30T09:54:51.613601Z","shell.execute_reply.started":"2024-01-30T09:54:51.602642Z","shell.execute_reply":"2024-01-30T09:54:51.612601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import accuracy_score\n\n# Assuming df is the DataFrame containing your data\nnum_splits = 5  # Number of folds\nstratified_kfold = StratifiedKFold(n_splits=num_splits, shuffle=True, random_state=42)\n\nfor fold, (train_idx, val_idx) in enumerate(stratified_kfold.split(df['images'], df['target'])):\n    print(f\"Fold {fold + 1}\")\n    \n    # Create training dataset for this fold\n    train_fold_dataset = ImageDataset(data_paths=df['images'].iloc[train_idx].tolist(),\n                                      labels=df['target'].iloc[train_idx].tolist(),\n                                      transform=train_transform, mode='train')\n    \n    # Create validation dataset for this fold\n    val_fold_dataset = ImageDataset(data_paths=df['images'].iloc[val_idx].tolist(),\n                                    labels=df['target'].iloc[val_idx].tolist(),\n                                    transform=test_transform, mode='train')\n    \n   ","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.616060Z","iopub.execute_input":"2024-01-30T09:54:51.616466Z","iopub.status.idle":"2024-01-30T09:54:51.638888Z","shell.execute_reply.started":"2024-01-30T09:54:51.616429Z","shell.execute_reply":"2024-01-30T09:54:51.637640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" # Create data loaders for this fold\ntrain_fold_loader = DataLoader(train_fold_dataset, batch_size=32, shuffle=True, num_workers=4)\nval_fold_loader = DataLoader(val_fold_dataset, batch_size=32, shuffle=False, num_workers=4)\n    \n    # Now, you can use train_fold_loader and val_fold_loader in your training loop for this fold\n","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.640119Z","iopub.execute_input":"2024-01-30T09:54:51.640442Z","iopub.status.idle":"2024-01-30T09:54:51.646515Z","shell.execute_reply.started":"2024-01-30T09:54:51.640414Z","shell.execute_reply":"2024-01-30T09:54:51.645244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nfrom efficientnet_pytorch import EfficientNet\n\nclass CustomEfficientNetB3(nn.Module):\n    def __init__(self, num_classes):\n        super(CustomEfficientNetB3, self).__init__()\n        \n        # Load pre-trained EfficientNet-B3 model\n        self.efficientnet = EfficientNet.from_pretrained('efficientnet-b3')\n        \n        # Modify the classifier to match the number of output classes\n        in_features = self.efficientnet._fc.in_features\n        self.efficientnet._fc = nn.Linear(in_features, num_classes)\n\n    def forward(self, x):\n        return self.efficientnet(x)\n\n# Example usage:\n# num_classes is the number of output classes in your classification task\nnum_classes = 2  # Assuming a binary classification task, adjust based on your dataset\nmodel1 = CustomEfficientNetB3(num_classes)\nmodel=model1\n","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:51.647721Z","iopub.execute_input":"2024-01-30T09:54:51.648084Z","iopub.status.idle":"2024-01-30T09:54:52.427377Z","shell.execute_reply.started":"2024-01-30T09:54:51.648057Z","shell.execute_reply":"2024-01-30T09:54:52.426313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimport torch.optim as optim\nfrom torch.optim.lr_scheduler import ReduceLROnPlateau\n\nnum_classes=2\n# Function to instantiate model, optimizer, and scheduler\n#def get_model_optimizer_scheduler(num_classes):\nmodel = model1\noptimizer = optim.Adam(model.parameters(), lr=0.001)\nscheduler = ReduceLROnPlateau(optimizer, patience=3, factor=0.1)\n    #return model, optimizer, scheduler\n\n","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:52.428678Z","iopub.execute_input":"2024-01-30T09:54:52.429001Z","iopub.status.idle":"2024-01-30T09:54:52.437269Z","shell.execute_reply.started":"2024-01-30T09:54:52.428973Z","shell.execute_reply":"2024-01-30T09:54:52.436307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import wandb\n\n# Set up W&B configuration\nwandb_config = {\n    'model': 'CustomEfficientNetB3',\n    'learning_rate': 0.001,\n    'batch_size': 32,\n    'num_epochs': 10,\n}\n\n#wandb.init(project='Skin_Melanoma_Detection', config=wandb_config)\n\n# Training loop\nfor epoch in range(wandb_config['num_epochs']):\n    model.train()\n    total_loss = 0.0\n    correct_train_predictions = 0\n    total_train_samples = 0\n    \n    for inputs, labels in train_fold_loader:\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        \n        total_loss += loss.item()\n\n        # Calculate training accuracy\n        preds = torch.sigmoid(outputs) > 0.5\n        correct_train_predictions += torch.sum(preds == labels).item()\n        total_train_samples += labels.size(0)\n\n    # Log training loss and accuracy for the epoch\n    avg_train_loss = total_loss / len(train_fold_loader)\n    train_accuracy = correct_train_predictions / total_train_samples\n    #wandb.log({'train_loss': avg_train_loss, 'train_accuracy': train_accuracy})\n\n    # Validation loop\n    model.eval()\n    all_val_preds = []\n    all_val_labels = []\n    total_val_loss = 0.0\n    correct_val_predictions = 0\n    total_val_samples = 0\n    \n    with torch.no_grad():\n        for val_inputs, val_labels in val_fold_loader:\n            val_outputs = model(val_inputs)\n            val_preds = torch.sigmoid(val_outputs).cpu().numpy()\n            all_val_preds.extend(val_preds)\n            all_val_labels.extend(val_labels.cpu().numpy())\n            \n            val_loss = criterion(val_outputs, val_labels)\n            total_val_loss += val_loss.item()\n\n            # Calculate validation accuracy\n            preds = torch.sigmoid(val_outputs) > 0.5\n            correct_val_predictions += torch.sum(preds == val_labels).item()\n            total_val_samples += val_labels.size(0)\n\n    # Calculate validation metrics\n    val_accuracy = correct_val_predictions / total_val_samples\n    avg_val_loss = total_val_loss / len(val_fold_loader)\n\n    # Log validation metrics for the epoch\n    #wandb.log({'val_loss': avg_val_loss, 'val_accuracy': val_accuracy})\n\n    print(f\"Epoch {epoch + 1}/{wandb_config['num_epochs']}, \"\n          f\"Train Loss: {avg_train_loss:.4f}, Train Accuracy: {train_accuracy:.4f}, \"\n          f\"Val Loss: {avg_val_loss:.4f}, Val Accuracy: {val_accuracy:.4f}\")\n\n# Save the trained model\n#wandb.save('final_trained_model.pth')\n#wandb.finish()  # Finish the W&B run\n","metadata":{"execution":{"iopub.status.busy":"2024-01-30T09:54:52.438795Z","iopub.execute_input":"2024-01-30T09:54:52.439098Z","iopub.status.idle":"2024-01-30T09:55:35.414158Z","shell.execute_reply.started":"2024-01-30T09:54:52.439071Z","shell.execute_reply":"2024-01-30T09:55:35.412523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}