{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install torch===1.5.0 torchvision===0.6.0 -f https://download.pytorch.org/whl/torch_stable.html","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"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#!conda install pytorch torchvision -c pytorch\nimport 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\nimport torch\nimport PIL\nimport cv2\nfrom torch.optim import lr_scheduler\nfrom torch.utils.data import Dataset,random_split\nfrom tqdm import tqdm\nfrom torchvision import models,transforms\nimport torch.optim as optim\nimport torch.nn as nn\nfrom sklearn import model_selection\nimport torch.nn.functional as F\nimport time\nfrom sklearn.model_selection import StratifiedKFold\nimport copy\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\nimport pydicom\nplt.ion()\n# You can write up to 5GB 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\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntrain_csv=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ntest_csv=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')\n\nsample=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_path='/kaggle/input/siim-isic-melanoma-classification/jpeg/train/'\ntest_path='/kaggle/input/siim-isic-melanoma-classification/jpeg/test/'\n#path='/kaggle/input/siim-isic-melanoma-classification/jpeg/'\nbs=20\nnum_classes=2\nimg_size=224\nlr=1e-4\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class MyDataset(Dataset):\n    \n    def __init__(self, dataframe, transform=None, test=False):\n        self.df = dataframe\n        self.transform = transform\n        self.test = test\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        \n        label = self.df.target.values[idx]\n        p = self.df.image_name.values[idx]\n        \n        if self.test == False:\n            p_path = train_path + p + '.jpg'\n        else:\n            p_path = test_path + p + '.jpg'\n            \n        image = cv2.imread(p_path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        image = transforms.ToPILImage()(image)\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return image, label","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomVerticalFlip(),\n    transforms.Resize((100,100)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"testset      = MyDataset(sample, transform=transform, test=True)\ntest_loader  = torch.utils.data.DataLoader(testset, batch_size=bs, shuffle=False, num_workers=4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plotplease(dataset):\n    fig=plt.figure(figsize=(20,20))\n    img,lab=next(iter(dataset))\n    for i in range(1,31):\n        inp=img[i].numpy().transpose(1,2,0)\n        mean = np.array([0.485, 0.456, 0.406])\n        std = np.array([0.229, 0.224, 0.225])\n        inp = std * inp + mean\n        inp = np.clip(inp, 0, 1)\n        fig.add_subplot(6,5,i)\n        plt.imshow(inp)\n        plt.title(\"benign\" if lab[i].item() is 0 else \"malignant\")\n        fig.add_subplot\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#just to plot examples\n\ntraindataset=MyDataset(train_csv,transform=transform)\ntrain,val=random_split(traindataset,[int(0.8*len(traindataset)),(len(traindataset)-int(0.8*len(traindataset)))])\ntrain=torch.utils.data.DataLoader(train,batch_size=32,shuffle=True)\nval=torch.utils.data.DataLoader(val,batch_size=32,shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plotplease(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plotplease(val)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train_model(model, epoch):\n    \n    model.train() \n    \n    losses = []\n    avg_loss = 0.\n\n    optimizer.zero_grad()\n    \n    tk = tqdm(train_loader, total=len(train_loader), position=0, leave=True)\n    for idx, (imgs, labels) in enumerate(tk):\n        imgs, labels = imgs.cuda(), labels.cuda().long()\n        output_train = model(imgs)\n\n        loss = criterion(output_train, labels)\n        loss.backward()\n\n        optimizer.step() \n        optimizer.zero_grad() \n        \n        avg_loss += loss.item() / len(train_loader)\n        \n        losses.append(avg_loss)\n\n        \n        \n    return avg_loss\n\n\ndef test_model(model):    \n    model.eval()\n    \n    losses = []\n    avg_val_loss = 0.\n    \n    valid_preds, valid_targets = [], []\n    \n    with torch.no_grad():\n        tk = tqdm(val_loader, total=len(val_loader), position=0, leave=True)\n        for idx, (imgs, labels) in enumerate(tk):\n            imgs, labels = imgs.cuda(), labels.cuda().long()\n            output_valid = model(imgs)\n            \n            loss = criterion(output_valid, labels)\n            \n            avg_val_loss += loss.item() / len(val_loader)\n\n            losses.append(avg_val_loss)\n            \n            #tk.set_postfix(loss=losses.avg)\n            \n            valid_preds.append(torch.softmax(output_valid,1)[:,1].detach().cpu().numpy())\n            valid_targets.append(labels.detach().cpu().numpy())\n            \n        valid_preds = np.concatenate(valid_preds)\n        valid_targets = np.concatenate(valid_targets)\n        auc =  roc_auc_score(valid_targets, valid_preds) \n            \n    return avg_val_loss, auc","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model=models.alexnet(pretrained=True)\nfor p in model.parameters():\n    p.requires_grad=False\nmodel.classifier[6]=nn.Sequential(nn.Linear(4096,2))\nmodel=model.cuda()\nmodel\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"kf = model_selection.StratifiedKFold(3, shuffle=True, random_state=0)\n\ncv = []\nfold = 0\n\nfor trn_ind, val_ind in kf.split(train_csv.image_name, train_csv.target):\n    fold += 1\n    print('fold:', fold)\n\n    train_df = train_csv.loc[trn_ind]\n    val_df = train_csv.loc[val_ind]\n    train_df.reset_index(drop=True, inplace=True)\n    val_df.reset_index(drop=True, inplace=True)\n\n    trainset = MyDataset(train_df, transform=transform)\n    train_loader = torch.utils.data.DataLoader(trainset, batch_size=bs, shuffle=True, num_workers=4)\n   \n    valset = MyDataset(val_df, transform=transform)\n    val_loader = torch.utils.data.DataLoader(valset, batch_size=bs, shuffle=False, num_workers=4)\n    \n    \n\n    optimizer = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=0.001)\n    criterion = nn.CrossEntropyLoss()\n    scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.3)\n\n    best_auc = 0\n    n_epochs = 8\n    es = 0\n\n    for epoch in range(n_epochs):\n        avg_loss = train_model(model, epoch)\n        avg_val_loss, auc = test_model(model)\n\n        if auc > best_auc:\n            best_auc = auc\n            torch.save(model.state_dict(), \"/kaggle/working/\"+str(fold) + 'weight.pt')\n        else:\n            es += 1\n            if es > 1:\n                break\n        print('current_val_auc:', auc, 'best_val_auc:', best_auc)\n        \n        scheduler.step()\n\n    cv.append(best_auc)\n","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}