{"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":"import pandas as pd\nimport numpy as np\nimport cv2 as cv\nimport os\n\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nfrom torch import optim\nimport torchvision\nfrom torchvision import transforms\nfrom torch.utils.data import TensorDataset, DataLoader, Dataset, random_split\nfrom torch.utils.data.sampler import SubsetRandomSampler\n\nfrom matplotlib import pyplot as plt\nfrom matplotlib import patches\nplt.style.use(\"ggplot\")\nimport seaborn as sns\n\nimport sklearn\nfrom sklearn.utils import shuffle\nfrom sklearn.metrics import roc_auc_score, accuracy_score\n\nfrom PIL import Image\n\nfrom tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:12:03.624759Z","iopub.execute_input":"2022-01-14T11:12:03.625781Z","iopub.status.idle":"2022-01-14T11:12:07.151887Z","shell.execute_reply.started":"2022-01-14T11:12:03.625668Z","shell.execute_reply":"2022-01-14T11:12:07.150923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"oznake = pd.read_csv(\"../input/histopathologic-cancer-detection/train_labels.csv\")\noznake.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:12:07.154050Z","iopub.execute_input":"2022-01-14T11:12:07.154355Z","iopub.status.idle":"2022-01-14T11:12:07.771167Z","shell.execute_reply.started":"2022-01-14T11:12:07.154312Z","shell.execute_reply":"2022-01-14T11:12:07.770322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.countplot(x=\"label\", data=oznake)\nlabelsCount = oznake[\"label\"].value_counts()\nplt.xticks([0,1], [\"Negativni ({})\".format((oznake.label==0).sum()), \"Pozitivni ({})\".format((oznake.label==1).sum())])\nplt.ylabel(\"Broj primjera\");","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:12:07.773726Z","iopub.execute_input":"2022-01-14T11:12:07.774358Z","iopub.status.idle":"2022-01-14T11:12:08.045095Z","shell.execute_reply.started":"2022-01-14T11:12:07.774314Z","shell.execute_reply":"2022-01-14T11:12:08.040649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Prikaza odnosa pozitivnih i negativnih primjera iz train seta. Gore je prikaz countplotom, a dolje piechartom.","metadata":{}},{"cell_type":"code","source":"plt.pie(labelsCount, labels=['Negativno', 'Pozitivno'], startangle=180, \n        autopct='%1.1f', colors=['#FF96A7', '#00ff99'], shadow=True);","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:12:08.053571Z","iopub.execute_input":"2022-01-14T11:12:08.056308Z","iopub.status.idle":"2022-01-14T11:12:08.278661Z","shell.execute_reply.started":"2022-01-14T11:12:08.056246Z","shell.execute_reply":"2022-01-14T11:12:08.277688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainPath = \"/kaggle/input/histopathologic-cancer-detection/train/\"\ntestPath = \"/kaggle/input/histopathologic-cancer-detection/test/\"\n\npozitivniUzorci = oznake.loc[oznake[\"label\"] == 1].sample(20)\nnegativniUzorci = oznake.loc[oznake[\"label\"] == 0].sample(20)\n\nslikePozitivnih = []\nslikeNegativnih = []\n\nfor i in pozitivniUzorci[\"id\"]:\n    path = os.path.join(trainPath, i+\".tif\")\n    slika = cv.imread(path)\n    slikePozitivnih.append(slika)\nfor i in negativniUzorci[\"id\"]:\n    path = os.path.join(trainPath, i+\".tif\")\n    slika = cv.imread(path)\n    slikeNegativnih.append(slika)\n    \nfig,axis = plt.subplots(4,10,figsize=(20,10), dpi=150)\nfig.suptitle(\"Primjeri slika iz dataseta\",fontsize=20)\n\nfor i,elem in enumerate(slikePozitivnih):\n    if i<10:\n        k=0\n    else:\n        k=1\n    axis[k,i%10].imshow(elem)\n    rect = patches.Rectangle((32,32),32,32,linewidth=3,edgecolor=\"lime\",facecolor=\"none\", linestyle=\":\", capstyle=\"round\")\n    axis[k,i%10].add_patch(rect)\n    axis[k,i%10].set_title(\"Pozitivno\")\n    axis[k,i%10].axis(\"off\")\n\nfor i,elem in enumerate(slikeNegativnih):\n    if i<10:\n        k=2\n    else:\n        k=3\n    axis[k,i%10].imshow(elem)\n    rect = patches.Rectangle((32,32),32,32,linewidth=3,edgecolor=\"r\",facecolor=\"none\", linestyle=\":\", capstyle=\"round\")\n    axis[k,i%10].add_patch(rect)\n    axis[k,i%10].set_title(\"Negativno\")\n    axis[k,i%10].axis(\"off\")\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:12:08.283432Z","iopub.execute_input":"2022-01-14T11:12:08.285849Z","iopub.status.idle":"2022-01-14T11:12:11.371666Z","shell.execute_reply.started":"2022-01-14T11:12:08.285809Z","shell.execute_reply":"2022-01-14T11:12:11.370604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Prikazano je po 20 primjera za pozitivno i negativno označene primjere iz train seta. Pozitivan primjer je onaj koji ima bar jedan pixel tkiva tumora u centralnom 32x32 prostoru (posebno označen).","metadata":{}},{"cell_type":"code","source":"negativni = oznake.loc[oznake[\"label\"] == 0].sample(50000)\npozitivni = oznake.loc[oznake[\"label\"] == 1].sample(50000)\n\nslikeP = []\nslikeN = []\n\nfor i in tqdm(pozitivni[\"id\"], desc=\"Pozitivni\"):\n    path = os.path.join(trainPath, i+\".tif\")\n    slika = cv.imread(path)\n    slikeP.append(slika)\nfor i in tqdm(negativni[\"id\"], desc=\"Negativni\"):\n    path = os.path.join(trainPath, i+\".tif\")\n    slika = cv.imread(path)\n    slikeN.append(slika)\n    \nslikeP = np.array(slikeP)\nslikeN = np.array(slikeN)\n\nbins = 256\n\nfig, axis = plt.subplots(4,2, sharey=True, figsize=(8,8), dpi=150);\n\n#RGB\naxis[0,0].hist(slikeN[:,:,:,0].flatten(), bins=bins, density=True);\naxis[0,1].hist(slikeP[:,:,:,0].flatten(), bins=bins, density=True);\naxis[1,0].hist(slikeN[:,:,:,1].flatten(), bins=bins, density=True);\naxis[1,1].hist(slikeP[:,:,:,1].flatten(), bins=bins, density=True);\naxis[2,0].hist(slikeN[:,:,:,2].flatten(), bins=bins, density=True);\naxis[2,1].hist(slikeP[:,:,:,2].flatten(), bins=bins, density=True);\n\n#sve zajedno\naxis[3,0].hist(slikeN.flatten(), bins=bins, density=True);\naxis[3,1].hist(slikeP.flatten(), bins=bins, density=True);\n\n#opisi\naxis[0,0].set_title(\"Negativni\")\naxis[0,1].set_title(\"Pozitvni\")\naxis[0,1].set_ylabel(\"Red\", rotation=\"horizontal\", labelpad=23, fontsize=12)\naxis[1,1].set_ylabel(\"Green\", rotation=\"horizontal\", labelpad=23, fontsize=12)\naxis[2,1].set_ylabel(\"Blue\", rotation=\"horizontal\", labelpad=23, fontsize=12)\naxis[3,1].set_ylabel(\"Svi\", rotation=\"horizontal\", labelpad=23, fontsize=12)\n\nfor i in range(4):\n    axis[i,0].set_ylabel(\"Relativna frekvencija\", fontsize=8)\naxis[3,0].set_xlabel(\"Pixel\");\naxis[3,1].set_xlabel(\"Pixel\");","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:12:11.372962Z","iopub.execute_input":"2022-01-14T11:12:11.373268Z","iopub.status.idle":"2022-01-14T11:28:21.409480Z","shell.execute_reply.started":"2022-01-14T11:12:11.373229Z","shell.execute_reply":"2022-01-14T11:28:21.408550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Raspodjela pixela za svaki kanal zasebno (R, G, B) i zajednički prikaz. Za zeleni kanal i pozitivni i negativni imaju tamne pixele, dok za crveni i plavi kanal nemaju. Negativni primjeri, općenito imaju više svjetlijih pixela od pozitivnih. Jako velika frekvencija pojavljivanja pixela 255 što znači da je velik udio bijele boje na slikama.","metadata":{}},{"cell_type":"code","source":"bins = 256 #we use a bit fewer bins to get a smoother image\nfig,axis = plt.subplots(1,2,sharey=True, sharex = True, figsize=(8,2),dpi=150)\naxis[0].hist(np.mean(slikeN,axis=(1,2,3)),bins=bins,density=True);\naxis[1].hist(np.mean(slikeP,axis=(1,2,3)),bins=bins,density=True);\naxis[0].set_title(\"Negativni\");\naxis[1].set_title(\"Pozitivni\");\naxis[0].set_xlabel(\"Svjetlina slike\")\naxis[1].set_xlabel(\"Svjetlina slike\")\naxis[0].set_ylabel(\"Relativna frekvencija\")\naxis[1].set_ylabel(\"Relativna frekvencija\");","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:21.411165Z","iopub.execute_input":"2022-01-14T11:28:21.411444Z","iopub.status.idle":"2022-01-14T11:28:25.716045Z","shell.execute_reply.started":"2022-01-14T11:28:21.411412Z","shell.execute_reply":"2022-01-14T11:28:25.715082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Velika razlika u distribuciji za pozitivne i negativne primjere. Pozitivni poprimaju oblik normalne distribucije oko vrijednosti 150, a negativni prate oblik bimodalne distribucije s vršnim vrijednostima oko 140 i 220.","metadata":{}},{"cell_type":"code","source":"train = shuffle(oznake)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:25.717656Z","iopub.execute_input":"2022-01-14T11:28:25.718199Z","iopub.status.idle":"2022-01-14T11:28:25.750127Z","shell.execute_reply.started":"2022-01-14T11:28:25.718153Z","shell.execute_reply":"2022-01-14T11:28:25.749163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Kreiraj(Dataset):\n    def __init__ (self, data, dataPath=\"./\", transform=None):\n        super().__init__()\n        self.df = data\n        self.dataPath = dataPath\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, index):\n        slikaIme, oznaka = self.df.iloc[index]\n        slikaPath = os.path.join(self.dataPath, slikaIme + \".tif\")\n        slika = cv.imread(slikaPath)\n        if self.transform is not None:\n            slika = self.transform(slika)\n        return slika, oznaka","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:25.751845Z","iopub.execute_input":"2022-01-14T11:28:25.752528Z","iopub.status.idle":"2022-01-14T11:28:25.761640Z","shell.execute_reply.started":"2022-01-14T11:28:25.752483Z","shell.execute_reply":"2022-01-14T11:28:25.760633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Na dijelu slika koje se koriste za treniranje modela (ne i validacija) provode se transformacije slike kako bi se izmjenila slika i smanjila prenaučenost.","metadata":{}},{"cell_type":"code","source":"transformTrain = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.RandomHorizontalFlip(p=0.7),\n    transforms.RandomVerticalFlip(p=0.7),\n    transforms.RandomRotation(45),\n    transforms.ToTensor()\n])\n\ntransformStart = transformTest = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.ToTensor(),\n])\n\npocetniData = Kreiraj(data = train, dataPath = trainPath, transform = transformStart)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:25.765528Z","iopub.execute_input":"2022-01-14T11:28:25.766245Z","iopub.status.idle":"2022-01-14T11:28:25.774963Z","shell.execute_reply.started":"2022-01-14T11:28:25.766196Z","shell.execute_reply":"2022-01-14T11:28:25.774030Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img,label = pocetniData[10]\nprint(img.shape, torch.min(img), torch.max(img))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:25.776725Z","iopub.execute_input":"2022-01-14T11:28:25.777375Z","iopub.status.idle":"2022-01-14T11:28:25.872336Z","shell.execute_reply.started":"2022-01-14T11:28:25.777330Z","shell.execute_reply":"2022-01-14T11:28:25.871299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch = 64\n\nvalSize = 0.2\ntestSize = 0.1\n\nfullLen = len(pocetniData)\nvalLen = int(valSize * fullLen)\nhelpLen = fullLen - valLen\n\ntestLen = int(testSize*helpLen)\ntrainLen = helpLen-testLen\n\n\nhelpSet, valSet = random_split(pocetniData, [helpLen, valLen])\ntrainSet, testSet = random_split(helpSet, [trainLen, testLen])\n\ntrainSet.transform = transformTrain\nvalSet.transform = transformStart\ntestSet.transform = transformStart\n\ntrainLoad = DataLoader(trainSet, batch_size=batch, shuffle=True)\nvalLoad = DataLoader(valSet, batch_size=batch, shuffle=False)\ntestLoadF = DataLoader(testSet, batch_size=batch, shuffle=False)\n\n\nprint(\"Velicina training seta je {}.\".format(trainLen))\nprint(\"Velicina validation seta je {}.\".format(valLen))\nprint(\"Velicina test seta je {}.\".format(testLen))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:25.874087Z","iopub.execute_input":"2022-01-14T11:28:25.874473Z","iopub.status.idle":"2022-01-14T11:28:25.924305Z","shell.execute_reply.started":"2022-01-14T11:28:25.874363Z","shell.execute_reply":"2022-01-14T11:28:25.923273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample = pd.read_csv(\"/kaggle/input/histopathologic-cancer-detection/sample_submission.csv\")\ntestData = Kreiraj(data = sample, dataPath = testPath, transform = transformTest)\n\ntestLoad = DataLoader(testData, batch_size=batch, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:25.926580Z","iopub.execute_input":"2022-01-14T11:28:25.927232Z","iopub.status.idle":"2022-01-14T11:28:26.071420Z","shell.execute_reply.started":"2022-01-14T11:28:25.927182Z","shell.execute_reply":"2022-01-14T11:28:26.070303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Model(nn.Module):\n    \n    def __init__(self):\n        super(Model, self).__init__()\n        self.conv1 = nn.Sequential(\n                nn.Conv2d(in_channels=3,out_channels=32,kernel_size=3,stride=1,padding=0),\n                nn.BatchNorm2d(32),\n                nn.ReLU(inplace=True),\n                nn.MaxPool2d(2,2))\n        self.conv2 = nn.Sequential(\n                nn.Conv2d(in_channels=32,out_channels=64,kernel_size=2,stride=1,padding=1),\n                nn.BatchNorm2d(64),\n                nn.ReLU(inplace=True),\n                nn.MaxPool2d(2,2))\n        self.conv3 = nn.Sequential(\n                nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=1),\n                nn.BatchNorm2d(128),\n                nn.ReLU(inplace=True),\n                nn.MaxPool2d(2,2))\n        self.conv4 = nn.Sequential(\n                nn.Conv2d(in_channels=128,out_channels=256,kernel_size=3,stride=1,padding=1),\n                nn.BatchNorm2d(256),\n                nn.ReLU(inplace=True),\n                nn.MaxPool2d(2,2))\n        self.conv5 = nn.Sequential(\n                nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),\n                nn.BatchNorm2d(512),\n                nn.ReLU(inplace=True),\n                nn.MaxPool2d(2,2))\n        \n        self.dropout2d = nn.Dropout2d()\n        \n        self.fc=nn.Sequential(\n                nn.Linear(512*3*3,1024),\n                nn.ReLU(inplace=True),\n                nn.Dropout(0.3),\n                nn.Linear(1024,512),\n                nn.Dropout(0.3),\n                nn.Linear(512, 1),\n                nn.Sigmoid())\n        \n    def forward(self,x):\n        x=self.conv1(x)\n        x=self.conv2(x)\n        x=self.conv3(x)\n        x=self.conv4(x)\n        x=self.conv5(x)\n        x=x.view(x.shape[0],-1)\n        x=self.fc(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:26.073409Z","iopub.execute_input":"2022-01-14T11:28:26.073739Z","iopub.status.idle":"2022-01-14T11:28:26.099122Z","shell.execute_reply.started":"2022-01-14T11:28:26.073694Z","shell.execute_reply":"2022-01-14T11:28:26.097647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_on_gpu = torch.cuda.is_available()\n\nif not train_on_gpu:\n    print('CUDA nedostupan -> CPU')\nelse:\n    print('CUDA dostupan -> GPU')","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:26.102196Z","iopub.execute_input":"2022-01-14T11:28:26.102999Z","iopub.status.idle":"2022-01-14T11:28:26.160487Z","shell.execute_reply.started":"2022-01-14T11:28:26.102951Z","shell.execute_reply":"2022-01-14T11:28:26.159310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Model()\nprint(model)\n\nif train_on_gpu: model.cuda()","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:26.162387Z","iopub.execute_input":"2022-01-14T11:28:26.162884Z","iopub.status.idle":"2022-01-14T11:28:29.566796Z","shell.execute_reply.started":"2022-01-14T11:28:26.162839Z","shell.execute_reply":"2022-01-14T11:28:29.565828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ukupnoParametara = sum(elem.numel() for elem in model.parameters() if elem.requires_grad)\nprint(\"Parametri za treniranje: {}\".format(ukupnoParametara))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:29.568392Z","iopub.execute_input":"2022-01-14T11:28:29.569158Z","iopub.status.idle":"2022-01-14T11:28:29.577159Z","shell.execute_reply.started":"2022-01-14T11:28:29.569109Z","shell.execute_reply":"2022-01-14T11:28:29.576063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lossFunc = nn.BCELoss()\nopt = optim.Adam(model.parameters(), lr=1.5e-4)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:29.578597Z","iopub.execute_input":"2022-01-14T11:28:29.579289Z","iopub.status.idle":"2022-01-14T11:28:29.590060Z","shell.execute_reply.started":"2022-01-14T11:28:29.579240Z","shell.execute_reply":"2022-01-14T11:28:29.588913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epohe = 20\nminLossVal = np.inf\ntrainLos, valLos, aucEp, valAuc = [],[],[],[]\n\nfor i in range(epohe):\n    trainL = 0\n    valL = 0\n    \n    model.train()\n    for data, oznaka in tqdm(trainLoad, desc=\"Training {}\".format(i+1)):\n        if train_on_gpu:\n            data, oznaka = data.cuda(), oznaka.cuda().float()\n        oznaka = oznaka.view(-1,1)\n        opt.zero_grad()\n        izlaz = model(data)\n        loss = lossFunc(izlaz, oznaka)\n        loss.backward()\n        opt.step()\n        trainL += loss.item()*data.size(0)\n        yTocan = oznaka.data.cpu().numpy()\n        yDobiven = izlaz[:,-1].detach().cpu().numpy()\n        \n    \n    model.eval()\n    with torch.no_grad(): \n        for data, oznaka in tqdm(valLoad, desc=\"Validation {}\".format(i+1)):\n            if train_on_gpu:\n                data, oznaka = data.cuda(), oznaka.cuda().float()\n            oznaka = oznaka.view(-1,1)\n            izlaz = model(data)\n            loss = lossFunc(izlaz, oznaka)\n            valL += loss.item()*data.size(0)\n            yTocan = oznaka.data.cpu().numpy()\n            yDobiven = izlaz[:,-1].detach().cpu().numpy()\n            valAuc.append(roc_auc_score(yTocan, yDobiven))\n    \n    trainL /= len(trainLoad.sampler)\n    valL /= len(valLoad.sampler)\n    valAucElem = np.mean(valAuc)\n    aucEp.append(valAucElem)\n    \n    trainLos.append(trainL)\n    valLos.append(valL)\n    \n\n    print(\"Epoha: {}, Training Loss: {}, Validation Loss: {}, Validation AUC: {}\".format(i+1, trainL, valL, valAucElem))\n    \n    if valL <= minLossVal:\n        print(\"Smanjen validation loss: {} -> {}.\".format(minLossVal, valL))\n        torch.save(model.state_dict(), \"best_model.pt\")\n        minLossVal = valL","metadata":{"execution":{"iopub.status.busy":"2022-01-14T11:28:29.592059Z","iopub.execute_input":"2022-01-14T11:28:29.592473Z","iopub.status.idle":"2022-01-14T14:25:53.006373Z","shell.execute_reply.started":"2022-01-14T11:28:29.592341Z","shell.execute_reply":"2022-01-14T14:25:53.004142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%matplotlib inline\n%config InlineBackend.figure_format = 'retina'\n\nplt.plot(np.arange(1,epohe+1),trainLos, label='Training loss')\nplt.plot(np.arange(1,epohe+1),valLos, label='Validation loss')\nplt.xticks(np.arange(1,epohe+1, 1.0))\nplt.xlabel(\"Epoha\")\nplt.ylabel(\"Loss\")\nplt.legend(frameon=False);","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:25:53.007709Z","iopub.execute_input":"2022-01-14T14:25:53.009920Z","iopub.status.idle":"2022-01-14T14:25:53.503416Z","shell.execute_reply.started":"2022-01-14T14:25:53.009871Z","shell.execute_reply":"2022-01-14T14:25:53.502492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%matplotlib inline\n%config InlineBackend.figure_format = 'retina'\n\nplt.plot(np.arange(1,epohe+1),aucEp)\nplt.xticks(np.arange(1,epohe+1, 1.0))\nplt.legend(\"\")\nplt.xlabel(\"Epoha\")\nplt.ylabel(\"AUC\")\nplt.legend(frameon=False);","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:25:53.504949Z","iopub.execute_input":"2022-01-14T14:25:53.505740Z","iopub.status.idle":"2022-01-14T14:25:53.917042Z","shell.execute_reply.started":"2022-01-14T14:25:53.505696Z","shell.execute_reply":"2022-01-14T14:25:53.916046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Test","metadata":{}},{"cell_type":"code","source":"model.load_state_dict(torch.load('best_model.pt'))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:25:53.918721Z","iopub.execute_input":"2022-01-14T14:25:53.919218Z","iopub.status.idle":"2022-01-14T14:25:53.961259Z","shell.execute_reply.started":"2022-01-14T14:25:53.919176Z","shell.execute_reply":"2022-01-14T14:25:53.960292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\n\npredikcijaT = []\nfor i, (data,oznaka) in tqdm(enumerate(testLoad)):\n    data, oznaka = data.cuda(), oznaka.cuda()\n    izlaz = model(data)\n    \n    pr = izlaz.detach().cpu().numpy()\n    for i in pr:\n        predikcijaT.append(int(i))\n    \nsample[\"label\"] = predikcijaT","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:25:53.962729Z","iopub.execute_input":"2022-01-14T14:25:53.963052Z","iopub.status.idle":"2022-01-14T14:34:49.742969Z","shell.execute_reply.started":"2022-01-14T14:25:53.963001Z","shell.execute_reply":"2022-01-14T14:34:49.741903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample.to_csv(\"./submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:34:49.744445Z","iopub.execute_input":"2022-01-14T14:34:49.745725Z","iopub.status.idle":"2022-01-14T14:34:49.925545Z","shell.execute_reply.started":"2022-01-14T14:34:49.745681Z","shell.execute_reply":"2022-01-14T14:34:49.924603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Procjena za naš \"test set\":","metadata":{}},{"cell_type":"code","source":"model.load_state_dict(torch.load('best_model.pt'))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:34:49.927007Z","iopub.execute_input":"2022-01-14T14:34:49.927280Z","iopub.status.idle":"2022-01-14T14:34:49.972897Z","shell.execute_reply.started":"2022-01-14T14:34:49.927227Z","shell.execute_reply":"2022-01-14T14:34:49.971628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\n\npredikcija = []\ntocno = []\nfor i, (data,oznaka) in tqdm(enumerate(testLoadF)):\n    t = oznaka.detach().cpu().numpy()\n    data, oznaka = data.cuda(), oznaka.cuda()\n    izlaz = model(data)\n    \n    pr = izlaz.detach().cpu().numpy()\n    for i,j in zip(pr,t):\n        predikcija.append(i>=0.5)\n        tocno.append(j)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:34:49.974360Z","iopub.execute_input":"2022-01-14T14:34:49.974856Z","iopub.status.idle":"2022-01-14T14:37:44.550525Z","shell.execute_reply.started":"2022-01-14T14:34:49.974801Z","shell.execute_reply":"2022-01-14T14:37:44.549516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Preciznost: {:.2f}%\".format(accuracy_score(tocno, predikcija)*100))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T14:40:50.971398Z","iopub.execute_input":"2022-01-14T14:40:50.972391Z","iopub.status.idle":"2022-01-14T14:40:51.018224Z","shell.execute_reply.started":"2022-01-14T14:40:50.972351Z","shell.execute_reply":"2022-01-14T14:40:51.017044Z"},"trusted":true},"execution_count":null,"outputs":[]}]}