{"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":"# 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\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\n\n#import os\n#for dirname, _, filenames in os.walk('/kaggle/input'):\n#    for filename in filenames:\n #       print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-12T14:29:35.673712Z","iopub.execute_input":"2023-02-12T14:29:35.674327Z","iopub.status.idle":"2023-02-12T14:29:35.701649Z","shell.execute_reply.started":"2023-02-12T14:29:35.674201Z","shell.execute_reply":"2023-02-12T14:29:35.700496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:35.7042Z","iopub.execute_input":"2023-02-12T14:29:35.705443Z","iopub.status.idle":"2023-02-12T14:29:35.717737Z","shell.execute_reply.started":"2023-02-12T14:29:35.705397Z","shell.execute_reply":"2023-02-12T14:29:35.716518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(\"/kaggle/input/train-df/train_df.csv\")\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:35.718939Z","iopub.execute_input":"2023-02-12T14:29:35.720223Z","iopub.status.idle":"2023-02-12T14:29:36.019308Z","shell.execute_reply.started":"2023-02-12T14:29:35.720187Z","shell.execute_reply":"2023-02-12T14:29:36.018243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nDEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint('Device available now:', DEVICE)","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:36.025107Z","iopub.execute_input":"2023-02-12T14:29:36.027558Z","iopub.status.idle":"2023-02-12T14:29:38.202542Z","shell.execute_reply.started":"2023-02-12T14:29:36.027517Z","shell.execute_reply":"2023-02-12T14:29:38.201232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import Dataset,DataLoader","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:38.206707Z","iopub.execute_input":"2023-02-12T14:29:38.207297Z","iopub.status.idle":"2023-02-12T14:29:38.213113Z","shell.execute_reply.started":"2023-02-12T14:29:38.207249Z","shell.execute_reply":"2023-02-12T14:29:38.212135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torchvision\nfrom PIL import Image\n\ndef get_transforms(aug=False):\n\n    def transforms(img):\n#         img = img.convert('RGB')#.resize((512, 512))\n        if aug:\n            tfm = [\n                torchvision.transforms.RandomHorizontalFlip(0.5),\n                torchvision.transforms.RandomRotation(degrees=(-5, 5)), \n                torchvision.transforms.RandomResizedCrop((1024, 512), scale=(0.8, 1), ratio=(0.45, 0.55)) \n            ]\n        else:\n            tfm = [\n                torchvision.transforms.RandomHorizontalFlip(0.5),\n                torchvision.transforms.Resize((256, 256))\n            ]\n        img = torchvision.transforms.Compose(tfm + [            \n            torchvision.transforms.ToTensor(),\n            torchvision.transforms.Normalize(mean=0.2179, std=0.0529),\n            \n        ])(img)\n        return img\n\n    return lambda img: transforms(img)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:38.214886Z","iopub.execute_input":"2023-02-12T14:29:38.21569Z","iopub.status.idle":"2023-02-12T14:29:38.463043Z","shell.execute_reply.started":"2023-02-12T14:29:38.215632Z","shell.execute_reply":"2023-02-12T14:29:38.461963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nimg_path = train_df['path']","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:38.467941Z","iopub.execute_input":"2023-02-12T14:29:38.470303Z","iopub.status.idle":"2023-02-12T14:29:38.478772Z","shell.execute_reply.started":"2023-02-12T14:29:38.470263Z","shell.execute_reply":"2023-02-12T14:29:38.477736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class RSNADataset(Dataset):\n    \n    def __init__(self, df, img_path, transforms=None):\n        self.df = df\n        self.img_path = img_path\n        self.transforms = transforms\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        file = self.img_path[idx]\n        file = Image.open(file).convert('RGB')\n        X = self.transforms(file)\n        Y = self.df.loc[idx,'cancer']\n        return X.float(), torch.tensor(Y).float()","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:38.483923Z","iopub.execute_input":"2023-02-12T14:29:38.486611Z","iopub.status.idle":"2023-02-12T14:29:38.496021Z","shell.execute_reply.started":"2023-02-12T14:29:38.486573Z","shell.execute_reply":"2023-02-12T14:29:38.495036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds = RSNADataset(train_df, img_path,get_transforms(False))\n#train_ds[0][0]","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:29:38.50099Z","iopub.execute_input":"2023-02-12T14:29:38.503615Z","iopub.status.idle":"2023-02-12T14:29:38.50958Z","shell.execute_reply.started":"2023-02-12T14:29:38.503579Z","shell.execute_reply":"2023-02-12T14:29:38.50865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.model_selection import train_test_split\n# train_df = train_df.reset_index(drop=True)\n# df_train, df_val = train_test_split(train_df, test_size=0.25)\n# df_train = df_train.reset_index(drop=True)\n# df_val = df_val.reset_index(drop=True)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:31:03.432083Z","iopub.execute_input":"2023-02-12T14:31:03.432459Z","iopub.status.idle":"2023-02-12T14:31:03.437278Z","shell.execute_reply.started":"2023-02-12T14:31:03.432426Z","shell.execute_reply":"2023-02-12T14:31:03.436036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_train","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:31:06.576479Z","iopub.execute_input":"2023-02-12T14:31:06.57686Z","iopub.status.idle":"2023-02-12T14:31:06.581248Z","shell.execute_reply.started":"2023-02-12T14:31:06.576828Z","shell.execute_reply":"2023-02-12T14:31:06.580066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_img_path = df_train['path']\n# valid_img_path = df_val['path']\n","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:31:11.506368Z","iopub.execute_input":"2023-02-12T14:31:11.506756Z","iopub.status.idle":"2023-02-12T14:31:11.511219Z","shell.execute_reply.started":"2023-02-12T14:31:11.506723Z","shell.execute_reply":"2023-02-12T14:31:11.510017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:31:36.947311Z","iopub.execute_input":"2023-02-12T14:31:36.947694Z","iopub.status.idle":"2023-02-12T14:31:36.964049Z","shell.execute_reply.started":"2023-02-12T14:31:36.947645Z","shell.execute_reply":"2023-02-12T14:31:36.963059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N_FOLDS = 5\nfrom sklearn.model_selection import StratifiedGroupKFold\nsplit = StratifiedGroupKFold(N_FOLDS)\nfor k, (_, test_idx) in enumerate(split.split(train_df, train_df.cancer, groups=train_df.patient_id)):\n    train_df.loc[test_idx, 'split'] = k\ntrain_df.split = train_df.split.astype(int)","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:32:49.228586Z","iopub.execute_input":"2023-02-12T14:32:49.229165Z","iopub.status.idle":"2023-02-12T14:32:53.653995Z","shell.execute_reply.started":"2023-02-12T14:32:49.229119Z","shell.execute_reply":"2023-02-12T14:32:53.652976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:33:08.257372Z","iopub.execute_input":"2023-02-12T14:33:08.25775Z","iopub.status.idle":"2023-02-12T14:33:08.275997Z","shell.execute_reply.started":"2023-02-12T14:33:08.257714Z","shell.execute_reply":"2023-02-12T14:33:08.275038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.groupby('split').cancer.mean()","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:33:18.98716Z","iopub.execute_input":"2023-02-12T14:33:18.987529Z","iopub.status.idle":"2023-02-12T14:33:18.997605Z","shell.execute_reply.started":"2023-02-12T14:33:18.987499Z","shell.execute_reply":"2023-02-12T14:33:18.996571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_train","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:33:25.672761Z","iopub.execute_input":"2023-02-12T14:33:25.673124Z","iopub.status.idle":"2023-02-12T14:33:25.677935Z","shell.execute_reply.started":"2023-02-12T14:33:25.673094Z","shell.execute_reply":"2023-02-12T14:33:25.676747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for fold in range(5):\n#     df_train_fold = train_df[train_df['split']==fold]","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:48:05.404781Z","iopub.execute_input":"2023-02-12T14:48:05.405759Z","iopub.status.idle":"2023-02-12T14:48:05.410453Z","shell.execute_reply.started":"2023-02-12T14:48:05.405709Z","shell.execute_reply":"2023-02-12T14:48:05.409278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\ndf_train_fold = df_train_fold.reset_index(drop=True)\ndf_train, df_val = train_test_split(df_train_fold, test_size=0.25)\ndf_train = df_train.reset_index(drop=True)\ndf_val = df_val.reset_index(drop=True)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-12T14:36:00.075175Z","iopub.execute_input":"2023-02-12T14:36:00.075546Z","iopub.status.idle":"2023-02-12T14:36:00.085501Z","shell.execute_reply.started":"2023-02-12T14:36:00.075516Z","shell.execute_reply":"2023-02-12T14:36:00.084549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds = RSNADataset(df_train, train_img_path,get_transforms(False))\nval_ds = RSNADataset(df_val, valid_img_path,get_transforms(False))\n\n# train_sampler = WeightedRandomSampler(df_train['weights'].values, train_samples)\ntrain_loader = DataLoader(train_ds, batch_size=32,shuffle=True,num_workers=4,pin_memory=True)\n\n# val_sampler = WeightedRandomSampler(df_val['weights'].values, val_samples)\nval_loader = DataLoader(val_ds, batch_size=32,shuffle=False,num_workers=4,pin_memory=True)","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.742322Z","iopub.execute_input":"2023-02-11T07:36:01.742672Z","iopub.status.idle":"2023-02-11T07:36:01.749618Z","shell.execute_reply.started":"2023-02-11T07:36:01.742645Z","shell.execute_reply":"2023-02-11T07:36:01.748456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_default_device():\n    \"\"\"Pick GPU if available, else CPU\"\"\"\n    if torch.cuda.is_available():\n        return torch.device('cuda')\n    else:\n        return torch.device('cpu')\n    \ndef to_device(data, device):\n    \"\"\"Move tensor(s) to chosen device\"\"\"\n    if isinstance(data, (list,tuple)):\n        return [to_device(x, device) for x in data]\n    return data.to(device, non_blocking=True)\n\nclass DeviceDataLoader():\n    \"\"\"Wrap a dataloader to move data to a device\"\"\"\n    def __init__(self, dl, device):\n        self.dl = dl\n        self.device = device\n        \n    def __iter__(self):\n        \"\"\"Yield a batch of data after moving it to device\"\"\"\n        for b in self.dl: \n            yield to_device(b, self.device)\n\n    def __len__(self):\n        \"\"\"Number of batches\"\"\"\n        return len(self.dl)","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.751037Z","iopub.execute_input":"2023-02-11T07:36:01.752227Z","iopub.status.idle":"2023-02-11T07:36:01.762601Z","shell.execute_reply.started":"2023-02-11T07:36:01.752186Z","shell.execute_reply":"2023-02-11T07:36:01.761491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\ndevice = get_default_device()\ntrain_dl = DeviceDataLoader(train_loader,device)\nval_dl = DeviceDataLoader(val_loader,device)","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.764038Z","iopub.execute_input":"2023-02-11T07:36:01.764643Z","iopub.status.idle":"2023-02-11T07:36:01.773481Z","shell.execute_reply.started":"2023-02-11T07:36:01.764607Z","shell.execute_reply":"2023-02-11T07:36:01.772603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torchvision\nimport torch.nn as nn\nimport torch.nn.functional as F","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.775352Z","iopub.execute_input":"2023-02-11T07:36:01.775746Z","iopub.status.idle":"2023-02-11T07:36:01.784012Z","shell.execute_reply.started":"2023-02-11T07:36:01.775666Z","shell.execute_reply":"2023-02-11T07:36:01.783024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#out = torch.tensor([32])\n#out = torch.squeeze(out,1)\n#print(out)","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.785577Z","iopub.execute_input":"2023-02-11T07:36:01.785995Z","iopub.status.idle":"2023-02-11T07:36:01.794251Z","shell.execute_reply.started":"2023-02-11T07:36:01.785884Z","shell.execute_reply":"2023-02-11T07:36:01.793332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageClassificationBase(nn.Module):\n    def training_step(self, batch):\n        images, labels = batch \n        out = self(images)\n        k  = nn.Sigmoid()\n        out = k(out)\n        out = torch.squeeze(out,1)\n        loss = F.binary_cross_entropy(out, labels) # Calculate loss\n        return loss\n    \n    def validation_step(self, batch):\n        images, labels = batch \n        out = self(images)\n        k  = nn.Sigmoid()\n        out = k(out)\n        out = torch.squeeze(out,1)\n        #print(out)\n        loss = F.binary_cross_entropy(out, labels)\n        acc = accuracy(out, labels)           # Calculate accuracy\n        return {'val_loss': loss.detach(), 'val_acc': acc}\n        \n    def validation_epoch_end(self, outputs):\n        batch_losses = [x['val_loss'] for x in outputs]\n        epoch_loss = torch.stack(batch_losses).mean()   # Combine losses\n        batch_accs = [x['val_acc'] for x in outputs]\n        epoch_acc = torch.stack(batch_accs).mean()      # Combine accuracies\n        return {'val_loss': epoch_loss.item(), 'val_acc': epoch_acc.item()}\n    \n    def epoch_end(self, epoch, result):\n         print(\"Epoch [{}], train_loss: {:.4f}, val_loss: {:.4f}, val_acc: {:.4f}\".format(\n            epoch, result['train_loss'], result['val_loss'], result['val_acc']))\n        \ndef accuracy(outputs, labels):\n#     _, preds = torch.max(outputs, dim=1)\n#     print(outputs)\n#     print(labels)\n    for i in range(len(outputs)):\n        if (outputs[i]>0.5):\n            outputs[i] = 1\n        else:\n            outputs[i] = 0\n    return torch.tensor(torch.sum(outputs == labels).item() / len(outputs))","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.796048Z","iopub.execute_input":"2023-02-11T07:36:01.796506Z","iopub.status.idle":"2023-02-11T07:36:01.810334Z","shell.execute_reply.started":"2023-02-11T07:36:01.796349Z","shell.execute_reply":"2023-02-11T07:36:01.809386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluate(model, val_loader):\n    model.eval()\n    outputs = [model.validation_step(batch) for batch in val_loader]\n    return model.validation_epoch_end(outputs)\n\ndef fit(epochs, lr, model, train_loader, val_loader, opt_func=torch.optim.SGD):\n    history = []\n    optimizer = opt_func(model.parameters(), lr)\n    for epoch in range(epochs):\n        # Training Phase \n        model.train()\n        train_losses = []\n        for batch in train_loader:\n            loss = model.training_step(batch)\n            train_losses.append(loss)\n            loss.backward()\n            optimizer.step()\n            optimizer.zero_grad()\n        # Validation phase\n        result = evaluate(model, val_loader)\n        result['train_loss'] = torch.stack(train_losses).mean().item()\n        model.epoch_end(epoch, result)\n        history.append(result)\n    return history","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.812224Z","iopub.execute_input":"2023-02-11T07:36:01.812536Z","iopub.status.idle":"2023-02-11T07:36:01.82317Z","shell.execute_reply.started":"2023-02-11T07:36:01.812512Z","shell.execute_reply":"2023-02-11T07:36:01.822188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\ngc.collect()\ntorch.cuda.empty_cache()","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.82463Z","iopub.execute_input":"2023-02-11T07:36:01.825069Z","iopub.status.idle":"2023-02-11T07:36:01.971396Z","shell.execute_reply.started":"2023-02-11T07:36:01.825032Z","shell.execute_reply":"2023-02-11T07:36:01.970276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**model**","metadata":{}},{"cell_type":"code","source":"!pip install efficientnet_pytorch","metadata":{"execution":{"iopub.status.busy":"2023-02-11T07:36:01.97472Z","iopub.execute_input":"2023-02-11T07:36:01.975122Z","iopub.status.idle":"2023-02-11T07:36:14.520916Z","shell.execute_reply.started":"2023-02-11T07:36:01.975066Z","shell.execute_reply":"2023-02-11T07:36:14.519737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport efficientnet_pytorch\nfrom efficientnet_pytorch import EfficientNet\n\n# Initialize the model\nmodel = EfficientNet.from_name('efficientnet-b0')\n#print(model)\nnum_classes = 1 # number of classes in your target dataset\n# Replace the classifier with a custom classifier\n#model.classifier = nn.Sequential(nn.Linear(1280, num_classes), nn.Softmax(dim=1))\n#print(model)\nfor param in model.parameters():\n    param.requires_grad = False\nmodel._fc.requires_grad = True\n\n# Replace the last layer with a new dense layer with the desired number of units and activation function\nmodel._fc = nn.Sequential(\n    nn.Linear(in_features=model._fc.in_features, out_features=1),\n    nn.ReLU()\n)\n\ntarget_dataset  = val_dl\nval_dl\n# Freeze all layers except the classifier\nfor name, param in model.named_parameters():\n    if name.startswith(\"classifier\"):\n        param.requires_grad = True\n    else:\n        param.requires_grad = False\n#print(model)\n# Train the classifier using your target dataset\n\noptimizer = torch.optim.Adam(model.parameters())\nfor epoch in range(1):\n    running_loss = 0.0\n    for inputs, labels in target_dataset:\n       # input_rgb = []\n        optimizer.zero_grad()\n       # for l in range(inputs.shape[0]):\n        #    tmp  = []\n         #   n  = inputs[l][0]\n          #  tmp.append(n.cpu().detach().numpy()); tmp.append(n.cpu().detach().numpy()); tmp.append(n.cpu().detach().numpy())\n          #  input_rgb.append(tmp)\n            \n      #  inputs = torch.from_numpy(np.asarray(input_rgb))\n        labels = labels.to(\"cpu\")\n        labels = labels.unsqueeze(1)\n       # print()      \n       # print(labels.shape)\n        #input_rgb = np.repeat(inputs([...,np.newaxis],3,-3))\n        inputs = inputs.to(\"cpu\")\n        outputs = model(inputs)\n       # print(inputs.shape)\n       # outputs = outputs.squeeze(1)\n      #  print(outputs)\n       # print(outputs.shape)\n        loss = F.binary_cross_entropy_with_logits(outputs, labels)\n        loss = loss.requires_grad_(requires_grad=True)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    print(f\"Epoch: {epoch+1}, Loss: {running_loss/len(target_dataset)}\")\n\n# Fine-tune the model\nfor name, param in model.named_parameters():\n    param.requires_grad = True\n\n# Train the whole model again\noptimizer = torch.optim.Adam(model.parameters())\n\nfor epoch in range(5):\n    running_loss = 0.0\n    for inputs, labels in target_dataset:\n        #input_rgb = []\n        \n        optimizer.zero_grad()\n        #for l in range(inputs.shape[0]):\n        #    tmp  = []\n         #   n  = inputs[l][0]\n         #   tmp.append(n.cpu().detach().numpy()); tmp.append(n.cpu().detach().numpy()); tmp.append(n.cpu().detach().numpy())\n          #  input_rgb.append(tmp)\n            \n        #inputs = torch.from_numpy(np.asarray(input_rgb))\n        labels = labels.to(\"cpu\")\n        labels = labels.unsqueeze(1)\n        inputs = inputs.to(\"cpu\")\n        outputs = model(inputs)\n        loss = F.binary_cross_entropy_with_logits(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    print(f\"Epoch: {epoch+1}, Loss: {running_loss/len(target_dataset)}\")\n\n# Evaluate the performance of the model on your target dataset\nwith torch.no_grad():\n    correct = 0\n    total = 0\n    for inputs, labels in target_dataset:\n        \n#         input_rgb = []\n#         for l in range(inputs.shape[0]):\n            \n#             tmp  = []\n#             n  = inputs[l][0]\n#             tmp.append(n.cpu().detach().numpy()); tmp.append(n.cpu().detach().numpy()); tmp.append(n.cpu().detach().numpy())\n#             input_rgb.append(tmp)\n            \n       # inputs = torch.from_numpy(np.asarray(input_rgb))\n       # print(inputs.shape)\n        labels = labels.to(\"cpu\")\n        labels = labels.unsqueeze(1)\n        inputs = inputs.to(\"cpu\")\n        outputs = model(inputs)\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n    print(f\"Accuracy: { correct / total}%\")","metadata":{"execution":{"iopub.status.busy":"2023-02-11T09:16:39.785633Z","iopub.execute_input":"2023-02-11T09:16:39.786155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(model.state_dict(),f\"model_{fold}.pth\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}