{"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":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"!pwd","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-03-21T10:00:46.235898Z","iopub.execute_input":"2022-03-21T10:00:46.236332Z","iopub.status.idle":"2022-03-21T10:00:46.928663Z","shell.execute_reply.started":"2022-03-21T10:00:46.236248Z","shell.execute_reply":"2022-03-21T10:00:46.927778Z"},"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-21T10:00:53.87001Z","iopub.execute_input":"2022-03-21T10:00:53.870646Z","iopub.status.idle":"2022-03-21T10:00:53.875934Z","shell.execute_reply.started":"2022-03-21T10:00:53.870612Z","shell.execute_reply":"2022-03-21T10:00:53.874125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exploratory Data Analysis EDA","metadata":{}},{"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-21T10:00:56.717351Z","iopub.execute_input":"2022-03-21T10:00:56.717608Z","iopub.status.idle":"2022-03-21T10:00:56.811256Z","shell.execute_reply.started":"2022-03-21T10:00:56.717579Z","shell.execute_reply":"2022-03-21T10:00:56.810557Z"},"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-21T10:00:57.938233Z","iopub.execute_input":"2022-03-21T10:00:57.938705Z","iopub.status.idle":"2022-03-21T10:01:02.463998Z","shell.execute_reply.started":"2022-03-21T10:00:57.938663Z","shell.execute_reply":"2022-03-21T10:01:02.46315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.value_counts(['target'])","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:03.596112Z","iopub.execute_input":"2022-03-21T10:01:03.596928Z","iopub.status.idle":"2022-03-21T10:01:03.61339Z","shell.execute_reply.started":"2022-03-21T10:01:03.596874Z","shell.execute_reply":"2022-03-21T10:01:03.612784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We will try to minimize the data by deleting patients with a target picture of 0 but at some point they had the disease before and they hava a picture with label 1 -even if it's an old picture- .","metadata":{}},{"cell_type":"code","source":"pos_pat_id=df[df.target==1].patient_id.unique()\npos_pat_id.size","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:06.043934Z","iopub.execute_input":"2022-03-21T10:01:06.044488Z","iopub.status.idle":"2022-03-21T10:01:06.05279Z","shell.execute_reply.started":"2022-03-21T10:01:06.044452Z","shell.execute_reply":"2022-03-21T10:01:06.052092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['ever_pos']=df['patient_id'].apply(lambda x:1 if x in pos_pat_id else 0)\ndf.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:07.309792Z","iopub.execute_input":"2022-03-21T10:01:07.31026Z","iopub.status.idle":"2022-03-21T10:01:08.128344Z","shell.execute_reply.started":"2022-03-21T10:01:07.310222Z","shell.execute_reply":"2022-03-21T10:01:08.127635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[df.ever_pos==0].patient_id.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:10.442538Z","iopub.execute_input":"2022-03-21T10:01:10.442819Z","iopub.status.idle":"2022-03-21T10:01:10.460395Z","shell.execute_reply.started":"2022-03-21T10:01:10.442783Z","shell.execute_reply":"2022-03-21T10:01:10.459658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_processed=pd.concat([df[df.target==1],df[df.ever_pos==0]]).sort_index()\ndf_processed","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:11.613703Z","iopub.execute_input":"2022-03-21T10:01:11.614286Z","iopub.status.idle":"2022-03-21T10:01:11.645312Z","shell.execute_reply.started":"2022-03-21T10:01:11.614249Z","shell.execute_reply":"2022-03-21T10:01:11.644653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_processed.value_counts(['target'])","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:12.752786Z","iopub.execute_input":"2022-03-21T10:01:12.753483Z","iopub.status.idle":"2022-03-21T10:01:12.76397Z","shell.execute_reply.started":"2022-03-21T10:01:12.753446Z","shell.execute_reply":"2022-03-21T10:01:12.762919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## they were 32120 picture with label 0 , now they are only 25813.","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:15.393559Z","iopub.execute_input":"2022-03-21T10:01:15.393845Z","iopub.status.idle":"2022-03-21T10:01:15.397495Z","shell.execute_reply.started":"2022-03-21T10:01:15.393811Z","shell.execute_reply":"2022-03-21T10:01:15.396842Z"},"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-21T10:01:16.330639Z","iopub.execute_input":"2022-03-21T10:01:16.331333Z","iopub.status.idle":"2022-03-21T10:01:16.338995Z","shell.execute_reply.started":"2022-03-21T10:01:16.331295Z","shell.execute_reply":"2022-03-21T10:01:16.336277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## I can change the train_size in compared to valid size if i am going to use validation\nsplitting=split(df_processed,train_size=0.99,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-21T10:01:18.262468Z","iopub.execute_input":"2022-03-21T10:01:18.262716Z","iopub.status.idle":"2022-03-21T10:01:19.168186Z","shell.execute_reply.started":"2022-03-21T10:01:18.262685Z","shell.execute_reply":"2022-03-21T10:01:19.167443Z"},"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-21T10:01:20.366439Z","iopub.execute_input":"2022-03-21T10:01:20.366882Z","iopub.status.idle":"2022-03-21T10:01:20.371004Z","shell.execute_reply.started":"2022-03-21T10:01:20.366843Z","shell.execute_reply":"2022-03-21T10:01:20.370018Z"},"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-21T10:01:21.83451Z","iopub.execute_input":"2022-03-21T10:01:21.834755Z","iopub.status.idle":"2022-03-21T10:01:21.840019Z","shell.execute_reply.started":"2022-03-21T10:01:21.834725Z","shell.execute_reply":"2022-03-21T10:01:21.839199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prepare_dirs(model_path,df_processed,'target')","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:35.31118Z","iopub.execute_input":"2022-03-21T10:01:35.311445Z","iopub.status.idle":"2022-03-21T10:01:35.316344Z","shell.execute_reply.started":"2022-03-21T10:01:35.311414Z","shell.execute_reply":"2022-03-21T10:01:35.315418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_processed.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:01:42.15843Z","iopub.execute_input":"2022-03-21T10:01:42.15898Z","iopub.status.idle":"2022-03-21T10:01:42.173821Z","shell.execute_reply.started":"2022-03-21T10:01:42.158937Z","shell.execute_reply":"2022-03-21T10:01:42.173132Z"},"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-21T10:01:43.071621Z","iopub.execute_input":"2022-03-21T10:01:43.072156Z","iopub.status.idle":"2022-03-21T10:02:07.594645Z","shell.execute_reply.started":"2022-03-21T10:01:43.072119Z","shell.execute_reply":"2022-03-21T10:02:07.593892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#### Test CSV File\ndata_dir ='../input/siim-isic-melanoma-classification'\ndf_test = pd.read_csv(os.path.join(data_dir, 'test.csv'))\ndf_test.head(1)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:02:42.524644Z","iopub.execute_input":"2022-03-21T10:02:42.524916Z","iopub.status.idle":"2022-03-21T10:02:42.559207Z","shell.execute_reply.started":"2022-03-21T10:02:42.524884Z","shell.execute_reply":"2022-03-21T10:02:42.55855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test['filepath'] = df_test['image_name'].apply(lambda x: os.path.join(data_dir, 'test', f'{x}.jpg'))\ndf_test.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:02:43.934961Z","iopub.execute_input":"2022-03-21T10:02:43.935648Z","iopub.status.idle":"2022-03-21T10:02:43.978327Z","shell.execute_reply.started":"2022-03-21T10:02:43.935612Z","shell.execute_reply":"2022-03-21T10:02:43.977662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## sample sumption\ndf_subm = pd.read_csv(os.path.join(data_dir, 'sample_submission.csv'))\ndf_subm.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:02:44.962761Z","iopub.execute_input":"2022-03-21T10:02:44.963359Z","iopub.status.idle":"2022-03-21T10:02:44.986184Z","shell.execute_reply.started":"2022-03-21T10:02:44.963318Z","shell.execute_reply":"2022-03-21T10:02:44.985449Z"},"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-21T10:02:46.316549Z","iopub.execute_input":"2022-03-21T10:02:46.316966Z","iopub.status.idle":"2022-03-21T10:02:47.957796Z","shell.execute_reply.started":"2022-03-21T10:02:46.316929Z","shell.execute_reply":"2022-03-21T10:02:47.957023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nrandom.seed(42)\nimport numpy as np\nnp.random.seed(42)\nimport torch\ntorch.manual_seed(42)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:02:47.95926Z","iopub.execute_input":"2022-03-21T10:02:47.959504Z","iopub.status.idle":"2022-03-21T10:02:47.968505Z","shell.execute_reply.started":"2022-03-21T10:02:47.959468Z","shell.execute_reply":"2022-03-21T10:02:47.967664Z"},"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(224),             # resize shortest side to 300 pixels\n        transforms.CenterCrop(224),         # 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(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":"2022-03-21T10:02:49.302688Z","iopub.execute_input":"2022-03-21T10:02:49.303257Z","iopub.status.idle":"2022-03-21T10:02:49.30968Z","shell.execute_reply.started":"2022-03-21T10:02:49.303215Z","shell.execute_reply":"2022-03-21T10:02:49.308832Z"},"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 , pin_memory=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-21T10:02:52.173364Z","iopub.execute_input":"2022-03-21T10:02:52.174278Z","iopub.status.idle":"2022-03-21T10:02:52.201519Z","shell.execute_reply.started":"2022-03-21T10:02:52.174232Z","shell.execute_reply":"2022-03-21T10:02:52.19984Z"},"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-21T10:02:55.02783Z","iopub.execute_input":"2022-03-21T10:02:55.028102Z","iopub.status.idle":"2022-03-21T10:03:14.618707Z","shell.execute_reply.started":"2022-03-21T10:02:55.028063Z","shell.execute_reply":"2022-03-21T10:03:14.617939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In training we will use a new technique called MIXED-PRECISION which will make a very large speed up in performance. It requires Tensor Cores, will work and make the training process faster if it's available.","metadata":{}},{"cell_type":"code","source":"####Training Function#######\n\nfrom tqdm.notebook import tqdm,trange\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 trange(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()\n\n            optimizer.zero_grad()\n            with torch.cuda.amp.autocast():\n                out = model(data)\n                loss = criterion(out, target.unsqueeze(1).float())\n            train_loss += loss.item()\n            \n            \n            scaler.scale(loss).backward()\n            scaler.step(optimizer)\n            scaler.update()\n            \n            \n        train_loss /= len(train_loader)\n        print(f'Epoch: {epoch+1} \\tTraining Loss: {train_loss:.6f} \\t',end='')\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()\n                \n                with torch.cuda.amp.autocast():\n                    val_out = model(data)\n                    loss = criterion(val_out, target.unsqueeze(1).float())\n                valid_loss += loss.item()\n\n        valid_loss /= len(val_loader)\n        losses[epoch]=(train_loss,valid_loss)\n\n        # print training/validation statistics\n        print(f'Validation 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-21T10:04:03.214863Z","iopub.execute_input":"2022-03-21T10:04:03.215173Z","iopub.status.idle":"2022-03-21T10:04:03.228479Z","shell.execute_reply.started":"2022-03-21T10:04:03.215139Z","shell.execute_reply":"2022-03-21T10:04:03.227672Z"},"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-21T10:04:04.775234Z","iopub.execute_input":"2022-03-21T10:04:04.776953Z","iopub.status.idle":"2022-03-21T10:04:04.782925Z","shell.execute_reply.started":"2022-03-21T10:04:04.7769Z","shell.execute_reply":"2022-03-21T10:04:04.782278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Modify the classifier\nmodel = models.googlenet(pretrained=True)\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                                 )","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:04:05.92452Z","iopub.execute_input":"2022-03-21T10:04:05.92477Z","iopub.status.idle":"2022-03-21T10:04:08.456086Z","shell.execute_reply.started":"2022-03-21T10:04:05.92474Z","shell.execute_reply":"2022-03-21T10:04:08.455295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.BCEWithLogitsLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\nscaler=torch.cuda.amp.GradScaler()","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:04:09.988155Z","iopub.execute_input":"2022-03-21T10:04:09.988416Z","iopub.status.idle":"2022-03-21T10:04:09.994541Z","shell.execute_reply.started":"2022-03-21T10:04:09.988387Z","shell.execute_reply":"2022-03-21T10:04:09.993626Z"},"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, 'model_melanoma.pt')\nmodel.load_state_dict(torch.load('model_melanoma.pt'))\n\nprint(f'\\nDuration: {time.time() - start_time:.0f} seconds') # print the time elapsed","metadata":{"execution":{"iopub.status.busy":"2022-03-20T11:48:56.825173Z","iopub.execute_input":"2022-03-20T11:48:56.825421Z","iopub.status.idle":"2022-03-20T11:48:56.834403Z","shell.execute_reply.started":"2022-03-20T11:48:56.825394Z","shell.execute_reply":"2022-03-20T11:48:56.83367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"### Train function without Validation\n\n####Training Function#######\n\nfrom tqdm.notebook import tqdm,trange\ndef train2(n_epochs, train_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,1))\n\n    for epoch in trange(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()\n\n            optimizer.zero_grad()\n            with torch.cuda.amp.autocast():\n                out = model(data)\n                loss = criterion(out, target.unsqueeze(1).float())\n            train_loss += loss.item()\n            \n            \n            scaler.scale(loss).backward()\n            scaler.step(optimizer)\n            scaler.update()\n            \n            \n        train_loss /= len(train_loader)\n        print(f'Epoch: {epoch+1} \\tTraining Loss: {train_loss:.6f} \\t',end='')\n\n        losses[epoch]=(train_loss)\n\n        torch.save(model.state_dict(), save_path)\n\n    return model, losses","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:04:17.730606Z","iopub.execute_input":"2022-03-21T10:04:17.731153Z","iopub.status.idle":"2022-03-21T10:04:17.740023Z","shell.execute_reply.started":"2022-03-21T10:04:17.731111Z","shell.execute_reply":"2022-03-21T10:04:17.739114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#### TRAINING WITHOUT VALIDATION ####\nimport time\nstart_time = time.time()\nif use_cuda:\n    model = model.cuda()\n\nepochs = 30\nmodel, losses = train2(epochs,train_loader, model, optimizer, criterion , use_cuda, 'model_melanoma1.pt')\nmodel.load_state_dict(torch.load('model_melanoma1.pt'))\n\nprint(f'\\nDuration: {time.time() - start_time:.0f} seconds') # print the time elapsed","metadata":{"execution":{"iopub.status.busy":"2022-03-21T10:05:10.347307Z","iopub.execute_input":"2022-03-21T10:05:10.347568Z","iopub.status.idle":"2022-03-21T12:48:21.803537Z","shell.execute_reply.started":"2022-03-21T10:05:10.347538Z","shell.execute_reply":"2022-03-21T12:48:21.802801Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\n\nmodel.load_state_dict(torch.load('./model_melanoma1.pt'))\nmodel.eval()\n\ndef predict(image_name):\n    path= f'../input/siim-isic-melanoma-classification/jpeg/test/{image_name}.jpg'\n    with torch.no_grad():\n        img=test_transform(Image.open(path)).unsqueeze(0).cuda()\n        return model.forward(img).sigmoid().item()\n    \npredict('ISIC_0073313')","metadata":{"execution":{"iopub.status.busy":"2022-03-21T12:58:42.115729Z","iopub.execute_input":"2022-03-21T12:58:42.116352Z","iopub.status.idle":"2022-03-21T12:58:42.610386Z","shell.execute_reply.started":"2022-03-21T12:58:42.116309Z","shell.execute_reply":"2022-03-21T12:58:42.609621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#load the model\n#model.load_state_dict(torch.load('./model_melanoma1.pt'))\n\n#predict and add it to the dataframe to subbmit\nimport time\ndf_test['target'] = df_test['image_name'].apply(predict)\n\nprint(f'\\nDuration: {time.time() - start_time:.0f} seconds') # print the time elapsed","metadata":{"execution":{"iopub.status.busy":"2022-03-21T12:58:48.17186Z","iopub.execute_input":"2022-03-21T12:58:48.17228Z","iopub.status.idle":"2022-03-21T13:39:10.096004Z","shell.execute_reply.started":"2022-03-21T12:58:48.172242Z","shell.execute_reply":"2022-03-21T13:39:10.095202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-21T13:40:07.795126Z","iopub.execute_input":"2022-03-21T13:40:07.795601Z","iopub.status.idle":"2022-03-21T13:40:07.808242Z","shell.execute_reply.started":"2022-03-21T13:40:07.795563Z","shell.execute_reply":"2022-03-21T13:40:07.807573Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# take just the 2 columns i need from the test ( Result)\nsubm =pd.DataFrame(df_test,columns=['image_name', 'target'])\nsubm.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T14:31:27.075218Z","iopub.execute_input":"2022-03-21T14:31:27.075567Z","iopub.status.idle":"2022-03-21T14:31:27.089163Z","shell.execute_reply.started":"2022-03-21T14:31:27.07553Z","shell.execute_reply":"2022-03-21T14:31:27.088413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# save the o/p dataframe to csv file so i could download it to my computer or use it to submit\nsubm.to_csv('./sub.csv' , index = False)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T14:33:11.503672Z","iopub.execute_input":"2022-03-21T14:33:11.504538Z","iopub.status.idle":"2022-03-21T14:33:11.547028Z","shell.execute_reply.started":"2022-03-21T14:33:11.504493Z","shell.execute_reply":"2022-03-21T14:33:11.546251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# When testing on test data and submitt the result to kaggle i got a private accuracy score of ( 0.8370 )","metadata":{"execution":{"iopub.status.busy":"2022-03-21T14:41:52.139584Z","iopub.execute_input":"2022-03-21T14:41:52.139859Z","iopub.status.idle":"2022-03-21T14:41:52.143105Z","shell.execute_reply.started":"2022-03-21T14:41:52.139827Z","shell.execute_reply":"2022-03-21T14:41:52.142193Z"},"trusted":true},"execution_count":null,"outputs":[]}]}