{"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":"!pwd","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":false,"execution":{"iopub.status.busy":"2022-03-11T15:20:40.636949Z","iopub.execute_input":"2022-03-11T15:20:40.637247Z","iopub.status.idle":"2022-03-11T15:20:41.297915Z","shell.execute_reply.started":"2022-03-11T15:20:40.637214Z","shell.execute_reply":"2022-03-11T15:20:41.297094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\ntrain_path = '../input/siim-isic-melanoma-classification/jpeg/train'","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:43.377068Z","iopub.execute_input":"2022-03-11T15:20:43.377552Z","iopub.status.idle":"2022-03-11T15:20:43.381605Z","shell.execute_reply.started":"2022-03-11T15:20:43.377512Z","shell.execute_reply":"2022-03-11T15:20:43.380876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##Exploratory Data Analysis EDA","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:44.304706Z","iopub.execute_input":"2022-03-11T15:20:44.305408Z","iopub.status.idle":"2022-03-11T15:20:44.309447Z","shell.execute_reply.started":"2022-03-11T15:20:44.305346Z","shell.execute_reply":"2022-03-11T15:20:44.308735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df= pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')\ndf.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:45.102821Z","iopub.execute_input":"2022-03-11T15:20:45.103070Z","iopub.status.idle":"2022-03-11T15:20:45.191877Z","shell.execute_reply.started":"2022-03-11T15:20:45.103040Z","shell.execute_reply":"2022-03-11T15:20:45.191183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Edit the image name\n#df['jpg']='.jpg'\n#df['image_name']= df['image_name']+df['jpg']\n#df.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:45.951667Z","iopub.execute_input":"2022-03-11T15:20:45.951919Z","iopub.status.idle":"2022-03-11T15:20:45.955353Z","shell.execute_reply.started":"2022-03-11T15:20:45.951892Z","shell.execute_reply":"2022-03-11T15:20:45.954400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Drop Duplicates\n\ndup = pd.read_csv(\"../input/melanoma-duplicate/2020_Challenge_duplicates.csv\")\n\ndrop_idx_list = []\nfor dup_image in dup.ISIC_id_paired:\n    for idx,image in enumerate(df.image_name):\n        if image == dup_image:\n            drop_idx_list.append(idx)\n\nprint(\"no. of duplicates in training dataset:\",len(drop_idx_list))\n\ndf.drop(drop_idx_list,inplace=True)\n\nprint(\"updated dimensions of the training dataset:\",df.shape)","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:46.969172Z","iopub.execute_input":"2022-03-11T15:20:46.969739Z","iopub.status.idle":"2022-03-11T15:20:51.702334Z","shell.execute_reply.started":"2022-03-11T15:20:46.969695Z","shell.execute_reply":"2022-03-11T15:20:51.701485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.value_counts(['target'])","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:57.266382Z","iopub.execute_input":"2022-03-11T15:20:57.267054Z","iopub.status.idle":"2022-03-11T15:20:57.285028Z","shell.execute_reply.started":"2022-03-11T15:20:57.267018Z","shell.execute_reply":"2022-03-11T15:20:57.284395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def split(df,train_size,stratify_label,randomstate=42):\n    \n    from sklearn.model_selection import train_test_split\n    \n    train,valid=train_test_split(df,train_size=train_size,stratify=df[stratify_label],random_state=randomstate)\n    \n    positive_index=train[train[stratify_label]==1].index.tolist()\n    random_negative_index=train[train[stratify_label]==0].sample(len(positive_index),random_state=randomstate).index.tolist()\n    \n    balanced_train=train.loc[positive_index+random_negative_index]\n    \n    return balanced_train,valid","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:20:58.809678Z","iopub.execute_input":"2022-03-11T15:20:58.810233Z","iopub.status.idle":"2022-03-11T15:20:58.816791Z","shell.execute_reply.started":"2022-03-11T15:20:58.810196Z","shell.execute_reply":"2022-03-11T15:20:58.815688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"splitting=split(df,train_size=0.8,stratify_label='target')\ntrain,valid=splitting\nfor dataframe in splitting:\n    print(dataframe['target'].value_counts(),end='\\n\\n')","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:21:02.528192Z","iopub.execute_input":"2022-03-11T15:21:02.528745Z","iopub.status.idle":"2022-03-11T15:21:03.408183Z","shell.execute_reply.started":"2022-03-11T15:21:02.528706Z","shell.execute_reply":"2022-03-11T15:21:03.407479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nimport os\ntrain_path = '../input/siim-isic-melanoma-classification/jpeg/train'\nmodel_path = 'model_images'","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:21:04.904329Z","iopub.execute_input":"2022-03-11T15:21:04.904845Z","iopub.status.idle":"2022-03-11T15:21:04.910875Z","shell.execute_reply.started":"2022-03-11T15:21:04.904805Z","shell.execute_reply":"2022-03-11T15:21:04.910046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_dirs(directory,dataframe,target_column):\n    target_classes=dataframe[target_column].unique().tolist()\n    if directory in os.listdir():\n        shutil.rmtree(directory)\n    os.mkdir(directory)\n    for use in 'train','valid':\n        os.mkdir(f'{directory}/{use}')\n        for x in target_classes:\n            os.mkdir(f'{directory}/{use}/{x}')","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:21:06.680673Z","iopub.execute_input":"2022-03-11T15:21:06.680975Z","iopub.status.idle":"2022-03-11T15:21:06.692227Z","shell.execute_reply.started":"2022-03-11T15:21:06.680942Z","shell.execute_reply":"2022-03-11T15:21:06.691411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prepare_dirs(model_path,df,'target')","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:21:07.920093Z","iopub.execute_input":"2022-03-11T15:21:07.920842Z","iopub.status.idle":"2022-03-11T15:21:07.926927Z","shell.execute_reply.started":"2022-03-11T15:21:07.920804Z","shell.execute_reply":"2022-03-11T15:21:07.926196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i,ddf in enumerate(splitting):\n    phase={0:'train',1:'valid'}\n    phase=phase[i]\n    ddf.apply(lambda x: shutil.copy2(f'{train_path}/{x[0]}.jpg',f'{model_path}/{phase}/{x[-1]}'),axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:21:09.058934Z","iopub.execute_input":"2022-03-11T15:21:09.059187Z","iopub.status.idle":"2022-03-11T15:23:52.633522Z","shell.execute_reply.started":"2022-03-11T15:21:09.059150Z","shell.execute_reply":"2022-03-11T15:23:52.632778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#IMPORT LIBRARIES\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader\nfrom torchvision import datasets, transforms, models # add models to the list\nfrom torchvision.utils import make_grid\nimport os\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# ignore harmless warnings\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:26:06.730603Z","iopub.execute_input":"2022-03-11T15:26:06.731133Z","iopub.status.idle":"2022-03-11T15:26:08.370256Z","shell.execute_reply.started":"2022-03-11T15:26:06.731094Z","shell.execute_reply":"2022-03-11T15:26:08.369548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define Transformers\ntrain_transform = transforms.Compose([\n        transforms.RandomRotation(10),      # rotate +/- 10 degrees\n        transforms.RandomHorizontalFlip(),  # reverse 50% of images\n        transforms.Resize(300),             # resize shortest side to 300 pixels\n        transforms.CenterCrop(300),         # crop longest side to 300 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(300),\n        transforms.CenterCrop(300),\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":"2022-03-11T15:26:08.372027Z","iopub.execute_input":"2022-03-11T15:26:08.372291Z","iopub.status.idle":"2022-03-11T15:26:08.379701Z","shell.execute_reply.started":"2022-03-11T15:26:08.372256Z","shell.execute_reply":"2022-03-11T15:26:08.379002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = datasets.ImageFolder('./model_images/train', transform=train_transform)\nval_data = datasets.ImageFolder('./model_images/valid', transform=test_transform)\n#test_data = datasets.ImageFolder('../input/siim-isic-melanoma-classification/jpeg/test', transform=test_transform)\n\ntorch.manual_seed(42)\ntrain_loader = DataLoader(train_data, batch_size=64, shuffle=True)\nval_loader = DataLoader(val_data, batch_size=64, shuffle=True)\n#test_loader = DataLoader(test_data, batch_size=10, shuffle=True)\n\nclass_names = train_data.classes\n\nprint(class_names)\nprint(f'Training images available: {len(train_data)}')\nprint(f'Validation images available: {len(val_data)}')\n#print(f'Testing images available:  {len(test_data)}')","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:26:09.045077Z","iopub.execute_input":"2022-03-11T15:26:09.045690Z","iopub.status.idle":"2022-03-11T15:26:09.097670Z","shell.execute_reply.started":"2022-03-11T15:26:09.045654Z","shell.execute_reply":"2022-03-11T15:26:09.096973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Grab the first batch of 64 images\nfor images,labels in train_loader: \n    break\n\n\nim = make_grid(images[:15], nrow=5)  # the default nrow is 8\n\n# Inverse normalize the images\ninv_normalize = transforms.Normalize(\n    mean=[-0.485/0.229, -0.456/0.224, -0.406/0.225],\n    std=[1/0.229, 1/0.224, 1/0.225]\n)\nim_inv = inv_normalize(im)\n\n# Print the images\nplt.figure(figsize=(20,10))\nplt.imshow(np.transpose(im_inv.numpy(), (1, 2, 0)));\n#plt.imshow(im.permute(1,2,0))","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:26:10.319366Z","iopub.execute_input":"2022-03-11T15:26:10.319911Z","iopub.status.idle":"2022-03-11T15:26:33.357704Z","shell.execute_reply.started":"2022-03-11T15:26:10.319874Z","shell.execute_reply":"2022-03-11T15:26:33.357015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"####Training Function#######\n\ndef train(n_epochs, train_loader, val_loader, model, optimizer, criterion, use_cuda, save_path):\n    \"\"\"returns trained model\"\"\"\n    # initialize tracker for minimum validation loss\n    valid_loss_min = np.Inf\n    losses=np.zeros((n_epochs,2))\n\n    for epoch in range(n_epochs):\n        # initialize variables to monitor training and validation loss\n        train_loss = 0.0\n        valid_loss = 0.0\n\n        ###################\n        # train the model #\n        ###################\n        # set the module to training mode\n        model.train()\n        for data, target in train_loader:\n            # move to GPU\n            if use_cuda:\n                data, target = data.cuda(), target.cuda().unsqueeze(1).float()\n\n            optimizer.zero_grad()\n            out = model(data)\n            loss = criterion(out, target)\n            train_loss += loss.item()\n            loss.backward()\n            optimizer.step()\n\n        ######################\n        # validate the model #\n        ######################\n        # set the model to evaluation mode\n        model.eval()\n        for data, target in val_loader:\n            with torch.no_grad():\n                # move to GPU\n                if use_cuda:\n                    data, target = data.cuda(), target.cuda().unsqueeze(1).float()\n\n                val_out = model(data)\n                loss = criterion(val_out, target)\n                valid_loss += loss.item()\n\n        train_loss /= len(train_loader)\n        valid_loss /= len(val_loader)\n        losses[epoch]=(train_loss,valid_loss)\n\n        # print training/validation statistics\n        print(\n            f'Epoch: {epoch+1} \\tTraining Loss: {train_loss:.6f} \\tValidation Loss: {valid_loss:.6f}')\n\n        if valid_loss <= valid_loss_min:\n            print('Validation loss decreased ... Model saved ...')\n            valid_loss_min = valid_loss\n            torch.save(model.state_dict(), save_path)\n\n    return model, losses","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:26:33.359316Z","iopub.execute_input":"2022-03-11T15:26:33.359781Z","iopub.status.idle":"2022-03-11T15:26:33.388107Z","shell.execute_reply.started":"2022-03-11T15:26:33.359743Z","shell.execute_reply":"2022-03-11T15:26:33.387415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"use_cuda = torch.cuda.is_available()\nuse_cuda","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:26:33.389282Z","iopub.execute_input":"2022-03-11T15:26:33.390939Z","iopub.status.idle":"2022-03-11T15:26:33.453177Z","shell.execute_reply.started":"2022-03-11T15:26:33.390901Z","shell.execute_reply":"2022-03-11T15:26:33.452448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"###Dounload Pre-trained Model\n\nmodel = models.googlenet(pretrained=True)\nmodel","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:27:32.477081Z","iopub.execute_input":"2022-03-11T15:27:32.477357Z","iopub.status.idle":"2022-03-11T15:27:32.668999Z","shell.execute_reply.started":"2022-03-11T15:27:32.477312Z","shell.execute_reply":"2022-03-11T15:27:32.668355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Modify the classifier\ntorch.manual_seed(42)\nmodel.fc = nn.Sequential(nn.Linear(1024, 128 , bias= False),\n                                 nn.BatchNorm1d(128),\n                                 nn.ReLU(),\n                                 nn.Dropout(0.25),\n                                 nn.Linear(128, 1),\n                                 )\nmodel","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:27:33.943622Z","iopub.execute_input":"2022-03-11T15:27:33.944326Z","iopub.status.idle":"2022-03-11T15:27:33.959463Z","shell.execute_reply.started":"2022-03-11T15:27:33.944285Z","shell.execute_reply":"2022-03-11T15:27:33.958646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.BCEWithLogitsLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:27:35.238996Z","iopub.execute_input":"2022-03-11T15:27:35.239673Z","iopub.status.idle":"2022-03-11T15:27:35.245673Z","shell.execute_reply.started":"2022-03-11T15:27:35.239629Z","shell.execute_reply":"2022-03-11T15:27:35.244903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"####TRAINING####\nimport time\nstart_time = time.time()\nif use_cuda:\n    model = model.cuda()\n\nepochs = 1\nmodel, losses = train(epochs,train_loader, val_loader, model, optimizer, criterion , use_cuda, 'model3.pt')\nmodel.load_state_dict(torch.load('model3.pt'))\n\nprint(f'\\nDuration: {time.time() - start_time:.0f} seconds') # print the time elapsed","metadata":{"execution":{"iopub.status.busy":"2022-03-11T15:28:43.541298Z","iopub.execute_input":"2022-03-11T15:28:43.542010Z","iopub.status.idle":"2022-03-11T15:28:43.552266Z","shell.execute_reply.started":"2022-03-11T15:28:43.541972Z","shell.execute_reply":"2022-03-11T15:28:43.551364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.cuda.get_device_name(0)","metadata":{"execution":{"iopub.status.busy":"2022-03-10T18:02:27.908525Z","iopub.execute_input":"2022-03-10T18:02:27.908777Z","iopub.status.idle":"2022-03-10T18:02:27.914568Z","shell.execute_reply.started":"2022-03-10T18:02:27.908748Z","shell.execute_reply":"2022-03-10T18:02:27.913263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}