{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":104884,"sourceType":"datasetVersion","datasetId":54339},{"sourceId":9011322,"sourceType":"datasetVersion","datasetId":5429371},{"sourceId":9017693,"sourceType":"datasetVersion","datasetId":5433876}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"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\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\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1'):\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":"2024-07-24T13:30:44.923264Z","iopub.execute_input":"2024-07-24T13:30:44.923880Z","iopub.status.idle":"2024-07-24T13:30:45.955259Z","shell.execute_reply.started":"2024-07-24T13:30:44.923850Z","shell.execute_reply":"2024-07-24T13:30:45.954411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nfrom torch import nn \nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader\nfrom torchvision.transforms import v2\nimport pandas as pd\nimport numpy as np\nimport cv2 as cv\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom PIL import Image\nimport glob \nfrom random import sample","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:48.023693Z","iopub.execute_input":"2024-07-24T13:30:48.024423Z","iopub.status.idle":"2024-07-24T13:30:53.813574Z","shell.execute_reply.started":"2024-07-24T13:30:48.024379Z","shell.execute_reply":"2024-07-24T13:30:53.812767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img =cv.imread(\"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/ISIC_0024872.jpg\")\n\nprint(img.shape)\nplt.imshow(img[...,::-1])\n","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:53.815014Z","iopub.execute_input":"2024-07-24T13:30:53.815534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_path_list = glob.glob(\"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/*\")\nprint(len(img_path_list))","metadata":{"execution":{"iopub.status.idle":"2024-07-24T13:30:54.609296Z","shell.execute_reply.started":"2024-07-24T13:30:54.378412Z","shell.execute_reply":"2024-07-24T13:30:54.608467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_path_sample=sample(img_path_list,9)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:54.611409Z","iopub.execute_input":"2024-07-24T13:30:54.611704Z","iopub.status.idle":"2024-07-24T13:30:54.615951Z","shell.execute_reply.started":"2024-07-24T13:30:54.611678Z","shell.execute_reply":"2024-07-24T13:30:54.615030Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(9,9))\nfor i in range(9):\n    plt.subplot(3,3,i+1)\n    img = cv.imread(img_path_sample[i])\n    plt.imshow(img[...,::-1])\n    plt.title(img.shape)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:54.617208Z","iopub.execute_input":"2024-07-24T13:30:54.617555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata = pd.read_csv(\"/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_metadata.csv\")\n# print(metadata.columns)\n# metadata","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:56.892150Z","iopub.execute_input":"2024-07-24T13:30:56.892461Z","iopub.status.idle":"2024-07-24T13:30:56.896357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata.info()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.642263Z","iopub.execute_input":"2024-07-24T10:48:28.642555Z","iopub.status.idle":"2024-07-24T10:48:28.652110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata = metadata.astype({'image_id': 'string'})\n# metadata.info()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.653322Z","iopub.execute_input":"2024-07-24T10:48:28.653692Z","iopub.status.idle":"2024-07-24T10:48:28.664686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# f1 = '/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_1/'\n# f2 = '/kaggle/input/skin-cancer-mnist-ham10000/HAM10000_images_part_2/'","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.665808Z","iopub.execute_input":"2024-07-24T10:48:28.666127Z","iopub.status.idle":"2024-07-24T10:48:28.673986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata[\"path\"] = metadata[\"image_id\"].apply(lambda x : f1+x+'.jpg' if os.path.exists(f1+x+'.jpg') else f2+x+'.jpg')","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.676850Z","iopub.execute_input":"2024-07-24T10:48:28.677752Z","iopub.status.idle":"2024-07-24T10:48:28.686404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata[\"exists\"] = metadata[\"path\"].apply(lambda x: os.path.exists(x))","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.687516Z","iopub.execute_input":"2024-07-24T10:48:28.687839Z","iopub.status.idle":"2024-07-24T10:48:28.695136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata[\"exists\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.696269Z","iopub.execute_input":"2024-07-24T10:48:28.696866Z","iopub.status.idle":"2024-07-24T10:48:28.704153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# metadata","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.705125Z","iopub.execute_input":"2024-07-24T10:48:28.705412Z","iopub.status.idle":"2024-07-24T10:48:28.713787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata[\"dx\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:28.714793Z","iopub.execute_input":"2024-07-24T10:48:28.715075Z","iopub.status.idle":"2024-07-24T10:48:28.723238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Cases include a representative collection of all important diagnostic categories in the realm of pigmented lesions:\n    Actinic keratoses and intraepithelial carcinoma / Bowen's disease (akiec)\n    basal cell carcinoma (bcc),\n    benign keratosis-like lesions (solar lentigines / seborrheic keratoses and lichen-planus like keratoses, bkl)\n    dermatofibroma (df)\n    melanoma (mel),\n    melanocytic nevi (nv)\n    and vascular lesions (angiomas, angiokeratomas, pyogenic granulomas and hemorrhage, vasc).","metadata":{}},{"cell_type":"code","source":"# metadata2 = metadata[metadata.dx != \"akiec\"]","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:29.471692Z","iopub.execute_input":"2024-07-24T10:48:29.471974Z","iopub.status.idle":"2024-07-24T10:48:29.475788Z","shell.execute_reply.started":"2024-07-24T10:48:29.471951Z","shell.execute_reply":"2024-07-24T10:48:29.474925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata2","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:29.479884Z","iopub.execute_input":"2024-07-24T10:48:29.480161Z","iopub.status.idle":"2024-07-24T10:48:29.484699Z","shell.execute_reply.started":"2024-07-24T10:48:29.480137Z","shell.execute_reply":"2024-07-24T10:48:29.483871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata2[\"label\"] = metadata[\"dx\"].apply(lambda x: 1 if ((x == \"mel\") or (x == \"bcc\")) else 0 )\n# metadata2[metadata.dx == \"mel\"]","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:29.489440Z","iopub.execute_input":"2024-07-24T10:48:29.489694Z","iopub.status.idle":"2024-07-24T10:48:29.493786Z","shell.execute_reply.started":"2024-07-24T10:48:29.489673Z","shell.execute_reply":"2024-07-24T10:48:29.492929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# metadata2.to_csv(\"metadata.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:29.499907Z","iopub.execute_input":"2024-07-24T10:48:29.500625Z","iopub.status.idle":"2024-07-24T10:48:29.504118Z","shell.execute_reply.started":"2024-07-24T10:48:29.500593Z","shell.execute_reply":"2024-07-24T10:48:29.503348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Split the dataset","metadata":{}},{"cell_type":"code","source":"# metadata2.label.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:29.519978Z","iopub.execute_input":"2024-07-24T10:48:29.520218Z","iopub.status.idle":"2024-07-24T10:48:29.524382Z","shell.execute_reply.started":"2024-07-24T10:48:29.520198Z","shell.execute_reply":"2024-07-24T10:48:29.523330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.model_selection import train_test_split\n\n# train ,test = train_test_split(metadata2,\n#                                test_size= 0.2,\n#                                random_state= 42,\n#                                stratify=metadata2[\"label\"]\n#                               )\n# test","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:29.696763Z","iopub.execute_input":"2024-07-24T10:48:29.697107Z","iopub.status.idle":"2024-07-24T10:48:29.701396Z","shell.execute_reply.started":"2024-07-24T10:48:29.697080Z","shell.execute_reply":"2024-07-24T10:48:29.700482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:30.128205Z","iopub.execute_input":"2024-07-24T10:48:30.129043Z","iopub.status.idle":"2024-07-24T10:48:30.132640Z","shell.execute_reply.started":"2024-07-24T10:48:30.129011Z","shell.execute_reply":"2024-07-24T10:48:30.131656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train.label.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:30.523760Z","iopub.execute_input":"2024-07-24T10:48:30.524060Z","iopub.status.idle":"2024-07-24T10:48:30.527852Z","shell.execute_reply.started":"2024-07-24T10:48:30.524036Z","shell.execute_reply":"2024-07-24T10:48:30.526893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.utils import resample\n# df1 = resample(train[train.label == 1],n_samples=3875,random_state=42,replace=True)\n# df1","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:30.898824Z","iopub.execute_input":"2024-07-24T10:48:30.899155Z","iopub.status.idle":"2024-07-24T10:48:30.902987Z","shell.execute_reply.started":"2024-07-24T10:48:30.899127Z","shell.execute_reply":"2024-07-24T10:48:30.902160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # df2 = train[train.label == 0]\n# df2 = resample(train[train.label == 0],n_samples=3875,random_state=42,replace=False)\n# bal_train = pd.concat([df1, df2], axis= 0)\n# bal_train.reset_index(inplace=True,drop = True)\n# bal_train","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:31.309066Z","iopub.execute_input":"2024-07-24T10:48:31.309847Z","iopub.status.idle":"2024-07-24T10:48:31.313837Z","shell.execute_reply.started":"2024-07-24T10:48:31.309819Z","shell.execute_reply":"2024-07-24T10:48:31.312805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df2.image_id.duplicated().value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:31.664328Z","iopub.execute_input":"2024-07-24T10:48:31.665030Z","iopub.status.idle":"2024-07-24T10:48:31.668676Z","shell.execute_reply.started":"2024-07-24T10:48:31.665004Z","shell.execute_reply":"2024-07-24T10:48:31.667701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bal_train.label.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:32.027516Z","iopub.execute_input":"2024-07-24T10:48:32.027804Z","iopub.status.idle":"2024-07-24T10:48:32.031662Z","shell.execute_reply.started":"2024-07-24T10:48:32.027780Z","shell.execute_reply":"2024-07-24T10:48:32.030667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bal_train.to_csv(\"balenced_train.csv\")\n# train.to_csv(\"train.csv\")\n# test.to_csv(\"test.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:32.357084Z","iopub.execute_input":"2024-07-24T10:48:32.357762Z","iopub.status.idle":"2024-07-24T10:48:32.361122Z","shell.execute_reply.started":"2024-07-24T10:48:32.357736Z","shell.execute_reply":"2024-07-24T10:48:32.360251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test = pd.read_csv(\"/kaggle/input/resnet-50/test.csv\")\n# test.label.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:32.667359Z","iopub.execute_input":"2024-07-24T10:48:32.667622Z","iopub.status.idle":"2024-07-24T10:48:32.671368Z","shell.execute_reply.started":"2024-07-24T10:48:32.667601Z","shell.execute_reply":"2024-07-24T10:48:32.670359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.utils import resample\n# dft1 = resample(test[test.label == 1],n_samples=969,random_state=42,replace=True)\n# dft1","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:33.023602Z","iopub.execute_input":"2024-07-24T10:48:33.023918Z","iopub.status.idle":"2024-07-24T10:48:33.027673Z","shell.execute_reply.started":"2024-07-24T10:48:33.023894Z","shell.execute_reply":"2024-07-24T10:48:33.026686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# dft2 = train[train.label == 0]\n# dft2 = resample(test[test.label == 0],n_samples=969,random_state=42,replace=False)\n# bal_test = pd.concat([dft1, dft2], axis= 0)\n# bal_test.reset_index(inplace=True,drop = True)\n# bal_test","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:33.343165Z","iopub.execute_input":"2024-07-24T10:48:33.344010Z","iopub.status.idle":"2024-07-24T10:48:33.347833Z","shell.execute_reply.started":"2024-07-24T10:48:33.343980Z","shell.execute_reply":"2024-07-24T10:48:33.346907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bal_test.label.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:33.616952Z","iopub.execute_input":"2024-07-24T10:48:33.617743Z","iopub.status.idle":"2024-07-24T10:48:33.621247Z","shell.execute_reply.started":"2024-07-24T10:48:33.617712Z","shell.execute_reply":"2024-07-24T10:48:33.620353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bal_test.to_csv(\"balenced_test.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:33.840644Z","iopub.execute_input":"2024-07-24T10:48:33.841264Z","iopub.status.idle":"2024-07-24T10:48:33.845016Z","shell.execute_reply.started":"2024-07-24T10:48:33.841234Z","shell.execute_reply":"2024-07-24T10:48:33.844162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create Custom Dataset","metadata":{}},{"cell_type":"code","source":"transform_main = v2.Compose([\n    \n    v2.Resize(232,interpolation= v2.InterpolationMode.BILINEAR),\n    v2.CenterCrop(224),\n    v2.Compose([v2.ToImage(), v2.ToDtype(torch.float32, scale=True)]),    #ToTensor()\n    v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\ntransform_main","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:58.744112Z","iopub.execute_input":"2024-07-24T13:30:58.744996Z","iopub.status.idle":"2024-07-24T13:30:58.753144Z","shell.execute_reply.started":"2024-07-24T13:30:58.744965Z","shell.execute_reply":"2024-07-24T13:30:58.752190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchvision.transforms import v2\ntransform_aug = v2.Compose([\n            v2.RandomRotation(45),\n            v2.RandomHorizontalFlip(0.5)])\ntransform_aug","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:30:59.199430Z","iopub.execute_input":"2024-07-24T13:30:59.199794Z","iopub.status.idle":"2024-07-24T13:30:59.207262Z","shell.execute_reply.started":"2024-07-24T13:30:59.199765Z","shell.execute_reply":"2024-07-24T13:30:59.206246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_transform = v2.Compose([transform_aug,transform_main])\ntrain_transform","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:00.097090Z","iopub.execute_input":"2024-07-24T13:31:00.097460Z","iopub.status.idle":"2024-07-24T13:31:00.104007Z","shell.execute_reply.started":"2024-07-24T13:31:00.097434Z","shell.execute_reply":"2024-07-24T13:31:00.103130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ham(Dataset):\n    def __init__(self,csv_dir,transform = None):\n        self.csv_dir = csv_dir\n        self.datas = pd.read_csv(self.csv_dir)\n        self.transform = transform\n        \n    def __getitem__(self,x):\n        \n        path = self.datas.path[x]\n        img = Image.open(path)\n        label = self.datas.label[x]\n        label = torch.tensor(label, dtype = torch.float32)\n        if self.transform:\n            img = self.transform(img)\n            \n        return img, label\n    \n    def __len__(self):\n        return len(self.datas)\n    \ntrain_dataset = ham(\"/kaggle/input/model-data/balenced_train.csv\",train_transform)\ntest_dataset = ham(\"/kaggle/input/model-data/balenced_test.csv\",transform_main)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:00.113971Z","iopub.execute_input":"2024-07-24T13:31:00.114631Z","iopub.status.idle":"2024-07-24T13:31:00.183217Z","shell.execute_reply.started":"2024-07-24T13:31:00.114605Z","shell.execute_reply":"2024-07-24T13:31:00.182386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# img,label =train_dataset[150]\n# print(label)\n# print(len(train_dataset))\n# plt.imshow(np.array(img))","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:01.510501Z","iopub.execute_input":"2024-07-24T13:31:01.510858Z","iopub.status.idle":"2024-07-24T13:31:01.514864Z","shell.execute_reply.started":"2024-07-24T13:31:01.510830Z","shell.execute_reply":"2024-07-24T13:31:01.513916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img,label =train_dataset[100]\nlabel","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:02.188719Z","iopub.execute_input":"2024-07-24T13:31:02.189413Z","iopub.status.idle":"2024-07-24T13:31:02.305979Z","shell.execute_reply.started":"2024-07-24T13:31:02.189376Z","shell.execute_reply":"2024-07-24T13:31:02.304950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataloader = DataLoader(dataset= train_dataset,\n                              batch_size= 64,\n                              shuffle= True\n                              )\ntest_dataloader = DataLoader(dataset= test_dataset,\n                              batch_size= 64,\n                              shuffle= False\n                              )","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:03.940489Z","iopub.execute_input":"2024-07-24T13:31:03.941404Z","iopub.status.idle":"2024-07-24T13:31:03.946731Z","shell.execute_reply.started":"2024-07-24T13:31:03.941373Z","shell.execute_reply":"2024-07-24T13:31:03.945634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"# import requests\n# request = requests.get(\"https://raw.githubusercontent.com/Woodman718/FixCaps/main/Module/HAM10000/model.py\")\n# with open(\"model.py\",\"wb\") as f:\n#     f.write(request.content)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:12.297537Z","iopub.execute_input":"2024-07-24T13:31:12.297903Z","iopub.status.idle":"2024-07-24T13:31:12.302219Z","shell.execute_reply.started":"2024-07-24T13:31:12.297874Z","shell.execute_reply":"2024-07-24T13:31:12.301247Z"},"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":"2024-07-24T13:31:16.412845Z","iopub.execute_input":"2024-07-24T13:31:16.413522Z","iopub.status.idle":"2024-07-24T13:31:16.444049Z","shell.execute_reply.started":"2024-07-24T13:31:16.413490Z","shell.execute_reply":"2024-07-24T13:31:16.442847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchvision.models import efficientnet_b0, EfficientNet_B0_Weights\n\n# Load the pretrained EfficientNetB0 model\nweights = EfficientNet_B0_Weights.DEFAULT\nmodel = efficientnet_b0(weights=weights).to(Device)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:18.466028Z","iopub.execute_input":"2024-07-24T13:31:18.466646Z","iopub.status.idle":"2024-07-24T13:31:19.384840Z","shell.execute_reply.started":"2024-07-24T13:31:18.466613Z","shell.execute_reply":"2024-07-24T13:31:19.383860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchinfo import summary\nsummary(model=model,\n        input_size=(1, 3, 224, 224), # make sure this is \"input_size\", not \"input_shape\"\n        # col_names=[\"input_size\"], # uncomment for smaller output\n        col_names=[\"input_size\", \"output_size\", \"num_params\", \"trainable\"],\n        col_width=20,\n        row_settings=[\"var_names\"])","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:21.770450Z","iopub.execute_input":"2024-07-24T13:31:21.770890Z","iopub.status.idle":"2024-07-24T13:31:22.521647Z","shell.execute_reply.started":"2024-07-24T13:31:21.770861Z","shell.execute_reply":"2024-07-24T13:31:22.520787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for param in model.parameters():\n    param.requires_grad = False\nnum_ftrs = model.classifier[1].in_features\nmodel.classifier[1] = nn.Linear(num_ftrs, 1)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:26.999047Z","iopub.execute_input":"2024-07-24T13:31:26.999893Z","iopub.status.idle":"2024-07-24T13:31:27.006316Z","shell.execute_reply.started":"2024-07-24T13:31:26.999860Z","shell.execute_reply":"2024-07-24T13:31:27.005430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# a =torch.rand(1,3,224,224).to(Device)\n# a","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:50.353476Z","iopub.execute_input":"2024-07-24T10:48:50.354170Z","iopub.status.idle":"2024-07-24T10:48:50.357827Z","shell.execute_reply.started":"2024-07-24T10:48:50.354141Z","shell.execute_reply":"2024-07-24T10:48:50.356914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# result = model(a)\n# print(result)\n# pred =torch.sigmoid(result)\n# pred.squeeze(dim =0)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:48:51.365070Z","iopub.execute_input":"2024-07-24T10:48:51.365675Z","iopub.status.idle":"2024-07-24T10:48:51.369775Z","shell.execute_reply.started":"2024-07-24T10:48:51.365644Z","shell.execute_reply":"2024-07-24T10:48:51.368761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Lets train the model","metadata":{}},{"cell_type":"code","source":"from tqdm.auto import tqdm, trange","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:31.409428Z","iopub.execute_input":"2024-07-24T13:31:31.409789Z","iopub.status.idle":"2024-07-24T13:31:31.414400Z","shell.execute_reply.started":"2024-07-24T13:31:31.409761Z","shell.execute_reply":"2024-07-24T13:31:31.413343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchmetrics.classification import BinaryPrecision\nfrom torchmetrics.classification import BinaryRecall\nfrom torchmetrics.classification import BinaryAccuracy\n","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:31.809277Z","iopub.execute_input":"2024-07-24T13:31:31.809641Z","iopub.status.idle":"2024-07-24T13:31:33.996749Z","shell.execute_reply.started":"2024-07-24T13:31:31.809613Z","shell.execute_reply":"2024-07-24T13:31:33.995951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n = torch.tensor([])\nd = torch.tensor([1,2,3,4])","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:33.998137Z","iopub.execute_input":"2024-07-24T13:31:33.998437Z","iopub.status.idle":"2024-07-24T13:31:34.002876Z","shell.execute_reply.started":"2024-07-24T13:31:33.998412Z","shell.execute_reply":"2024-07-24T13:31:34.002050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.cat((n,d))","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:34.544487Z","iopub.execute_input":"2024-07-24T13:31:34.544847Z","iopub.status.idle":"2024-07-24T13:31:34.553450Z","shell.execute_reply.started":"2024-07-24T13:31:34.544818Z","shell.execute_reply":"2024-07-24T13:31:34.552393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(model, device, train_loader, validation_loader, epochs, lr ,name):\n    \n#     percision = BinaryPrecision().to(device)\n#     recall =BinaryRecall().to(device)\n#     accuracy =BinaryAccuracy().to(device)\n    \n    model.to(device)\n    loss_fn =  nn.BCEWithLogitsLoss().to(device)\n    optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n    train_loss, validation_loss = [], []\n    train_acc, validation_acc = [], []\n    \n    with tqdm(range(epochs), unit='epoch') as tepochs:\n        \n        tepochs.set_description('Training')\n        \n        for epoch in tepochs:\n            model.train()\n            # Keeps track of the running loss\n            running_loss = 0.\n            correct, total = 0, 0\n#             pred_list_train = torch.tensor([]).to(device)\n#             target_list_train = torch.tensor([]).to(device)\n            \n            for data, target in train_loader:\n                \n                data, target = data.to(device), target.to(device)\n\n                output = model(data).squeeze(dim =1)\n\n                pred = torch.sigmoid(output)\n                \n#                 print(pre)\n                \n                pred = (pred > 0.5).float()\n                \n                optimizer.zero_grad()\n\n                loss = loss_fn(output, target)\n\n                loss.backward()\n\n                optimizer.step()\n\n                tepochs.set_postfix(loss=loss.item())\n                running_loss += loss.item()  \n\n#                 pred_list_train = torch.cat((pred_list_train,pred),dim=0)\n#                 target_list_train = torch.cat((target_list_train,target),dim=0)\n                # Get accuracy\n#                 print(pred)\n#                 print(target)\n#                 print(pred_list_train)\n#                 print(target_list_train)\n                total += target.size(0)\n                correct += (pred == target).sum().item()\n            \n            train_loss.append(running_loss / len(train_loader))  # Append the loss for this epoch (running loss divided by the number of batches e.g. len(train_loader))\n            train_acc.append(correct / total)\n#             train_percision = percision(pred_list_train,target_list_train)\n#             train_recall = recall(pred_list_train,target_list_train)\n#             train_accuracy = accuracy(pred_list_train,target_list_train)\n        # Evaluate on validation data\n            model.eval()\n            running_loss = 0.\n            correct, total = 0, 0\n            \n#             pred_list_valid = torch.tensor([]).to(device)\n#             target_list_valid = torch.tensor([]).to(device)\n            \n            for data, target in validation_loader:\n                \n                data, target = data.to(device), target.to(device)\n                \n                optimizer.zero_grad()\n                \n                output = model(data).squeeze(dim =1)\n                \n                pred = torch.sigmoid(output)\n                \n                pred = (pred > 0.5).float()\n                \n                loss = loss_fn(output, target)\n                \n                tepochs.set_postfix(loss=loss.item())\n                \n                running_loss += loss.item()\n                \n#                 pred_list_valid = torch.cat((pred_list_valid,pred),dim=0)\n#                 target_list_valid = torch.cat((target_list_valid,target),dim=0)\n                # Get accuracy\n                total += target.size(0)\n                correct += (pred == target).sum().item()\n\n            validation_loss.append(running_loss / len(validation_loader))\n            validation_acc.append(correct / total)\n#             valid_percision = percision(pred_list_valid,target_list_valid)\n#             valid_recall = recall(pred_list_valid,target_list_valid)\n#             valid_accuracy = accuracy(pred_list_valid,target_list_valid)\n            print(f\"Epoches: {epoch}\")\n            print(f\"\\nTrain loss: {train_loss[-1]:.5f} | Train acc: {train_acc[-1]:.5f} \\n validation_loss: {validation_loss[-1]:.5f} | Test acc: {validation_acc[-1]:.5f}\\n\")\n            if epoch % 5 == 0:\n                torch.save({\n                'epoch': epoch,\n                'model_state_dict': model.state_dict(),\n                'optimizer_state_dict': optimizer.state_dict()\n                }, f\"./model_resnet50_{name}_e{epoch}.pth\")\n        \n        return train_loss, train_acc , validation_loss, validation_acc\n","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:36.627561Z","iopub.execute_input":"2024-07-24T13:31:36.628375Z","iopub.status.idle":"2024-07-24T13:31:36.644386Z","shell.execute_reply.started":"2024-07-24T13:31:36.628340Z","shell.execute_reply":"2024-07-24T13:31:36.643524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loss1, train_acc1, validation_loss1, validation_acc1= train(model,Device,train_dataloader,test_dataloader,41, 0.0001, \"freeze\")","metadata":{"execution":{"iopub.status.busy":"2024-07-24T13:31:39.863758Z","iopub.execute_input":"2024-07-24T13:31:39.864371Z","iopub.status.idle":"2024-07-24T13:37:48.622222Z","shell.execute_reply.started":"2024-07-24T13:31:39.864337Z","shell.execute_reply":"2024-07-24T13:37:48.620900Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for param in model.parameters():\n    param.requires_grad = True\n    \ntrain_loss2, train_acc2, validation_loss2, validation_acc2= train(model,Device,train_dataloader,test_dataloader,11, 0.000001, \"finetune\")","metadata":{"execution":{"iopub.status.busy":"2024-07-24T10:49:07.230061Z","iopub.status.idle":"2024-07-24T10:49:07.230528Z","shell.execute_reply.started":"2024-07-24T10:49:07.230265Z","shell.execute_reply":"2024-07-24T10:49:07.230282Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loss = train_loss1.append(train_loss2)\ntrain_acc = train_acc1.append(train_acc2)\nvalidation_loss = validation_loss1.append(validation_loss2)\nvalidation_acc = validation_acc1.append(validation_acc2)","metadata":{"execution":{"iopub.status.busy":"2024-07-23T20:25:05.559990Z","iopub.execute_input":"2024-07-23T20:25:05.560376Z","iopub.status.idle":"2024-07-23T20:25:05.599079Z","shell.execute_reply.started":"2024-07-23T20:25:05.560346Z","shell.execute_reply":"2024-07-23T20:25:05.597758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_loss_accuracy(train_loss, train_acc,\n                       validation_loss, validation_acc):\n\n    epochs = len(train_loss)\n    fig, (ax1, ax2) = plt.subplots(1, 2)\n    ax1.plot(list(range(epochs)), train_loss, label='Training Loss')\n    ax1.plot(list(range(epochs)), validation_loss, label='Validation Loss')\n    ax1.set_xlabel('Epochs')\n    ax1.set_ylabel('Loss')\n    ax1.set_title('Epoch vs Loss')\n    ax1.legend()\n\n    ax2.plot(list(range(epochs)), train_acc, label='Training Accuracy')\n    ax2.plot(list(range(epochs)), validation_acc, label='Validation Accuracy')\n    ax2.set_xlabel('Epochs')\n    ax2.set_ylabel('Accuracy')\n    ax2.set_title('Epoch vs Accuracy')\n    ax2.legend()\n    fig.set_size_inches(15.5, 5.5)\n\nplot_loss_accuracy(train_loss, train_acc, validation_loss, validation_acc)","metadata":{"execution":{"iopub.status.busy":"2024-07-23T20:24:32.458051Z","iopub.execute_input":"2024-07-23T20:24:32.459044Z","iopub.status.idle":"2024-07-23T20:24:32.503121Z","shell.execute_reply.started":"2024-07-23T20:24:32.458999Z","shell.execute_reply":"2024-07-23T20:24:32.501765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install grad-cam","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from pytorch_grad_cam import GradCAM, HiResCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM, FullGrad\n# from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget\n# from pytorch_grad_cam.utils.image import show_cam_on_image","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Device","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# img , label = next(iter(train_dataloader2))\n# img = img.to(Device)\n# label = label.to(Device)\n# label","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# viz_transform = v2.Compose([  \n#     v2.Resize(232,interpolation= v2.InterpolationMode.BILINEAR),\n#     v2.CenterCrop(224),\n#     v2.Compose([v2.ToImage(), v2.ToDtype(torch.float32, scale=True)])])\n# Norm = v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n# test_viz = ham(\"/kaggle/working/test.csv\",viz_transform )\n# test_viz[1][0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_dataloader2 = DataLoader(dataset= train_dataset,\n#                               batch_size= 1,\n#                               shuffle= True\n#                               )\n# img , label = next(iter(train_dataloader2))\n# img = img.to(Device)\n# label = label.to(Device)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import random\n# train_samples = []\n# train_samples2 = []\n# train_labels = []\n# random_list = []\n# train_pred=[]\n# grayscale_cam =[]\n# for i in range(0, 9):\n#     random_list.append(random.randint(0, len(test_viz)))\n#     sample, target = test_viz[random_list[-1]]\n#     train_samples.append(sample)\n#     model.eval()    \n#     s= train_transform(sample).unsqueeze(dim=0).to(Device)\n#     with torch.inference_mode():\n#             y = model(s).round().int().item()\n#     grayscale_cam.append(cam(input_tensor=s))\n#     train_pred.append(y)\n#     train_labels.append(target.int().item())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.eval()\n# target_layers = [model.layer4[-1]]\n# cam = ScoreCAM(model=model, target_layers=target_layers)\n# grayscale_cam = cam(input_tensor=img)\n# # \n# # In this example grayscale_cam has only one image in the batch:\n# # grayscale_cam = grayscale_cam[0, :]\n# # visualization = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# img[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.imshow(img[1].permute(1,2,0).cpu().numpy())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.imshow(grayscale_cam[1])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.imshow(img[1].permute(1,2,0).cpu().numpy())\n# plt.contour(grayscale_cam[1])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# img[1].cpu().numpy()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.countour(grayscale_cam[1])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# show_cam_on_image(img[1].cpu().numpy(), grayscale_cam[1])","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}