{"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":"# **PIPELINE**\n\n1. Import the necessary libraries.\n2. Import the dataset\n3. Create the Dataset class from the torch.utils.data Dataset.\n4. use random_split to split the dataset to validation set\n5. Then make the Dataloader for both.\n6. Create the model of the problem using nn.Module or anything \n","metadata":{}},{"cell_type":"code","source":"# importing basic modules\nimport numpy as np\nimport pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# importing for playing with images\nimport PIL\nfrom PIL import Image\nimport cv2\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# importing moldules for cnn\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import DataLoader,Dataset, random_split\nfrom torchvision import transforms \n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# LETS ACCESS THE GPU\ndevice=torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nprint (device)   #go to settings and select accelerator t0 GPU P100 if CPU is displayed!","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Looking at the metadata\nmeta_data= pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m=meta_data.shape[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data['cancer'].hist()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Data imbalance is seen clearly from the above histogram.","metadata":{}},{"cell_type":"code","source":"# MAKING THE DATASET CLASS\nclass RSNA(Dataset):\n    \n    def __init__(self,meta,imgdir,trans=None):\n        \n        self.meta= pd.read_csv(meta)\n        self.imgdir= imgdir\n        self.trans=trans\n        \n    def __len__(self):\n        return len(self.meta)\n    \n    def __getitem__(self,index):\n        imgpath= f\"{self.imgdir}/{self.meta['patient_id'].iloc[index]}_{self.meta['image_id'].iloc[index]}.png\"\n        img= Image.open(imgpath).convert('RGB')\n        \n        label=(self.meta['cancer'].iloc[index])\n        \n        if self.trans:\n            img =self.trans(img).to(torch.float32)\n            \n        else:\n            default_trans= transforms.Compose([transforms.ToTensor()])\n            img =default_trans(img).to(torch.float32)\n        \n        \n        return img, torch.tensor(label,dtype=torch.float32)\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# LETS CREATE THE AUGMENTATOR\n\naugmentator= transforms.Compose([transforms.RandomHorizontalFlip(0.5),\n                                transforms.RandomVerticalFlip(0.5),\n                                transforms.RandomRotation(5),\n                                transforms.ToTensor()])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadir='/kaggle/input/rsna-breast-cancer-detection/train.csv'\nimgdir=\"/kaggle/input/rsnamamorgaphybreastcancerrecognition512x512\"\n\ndataset= RSNA(metadir,imgdir,augmentator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"next(iter(dataset))[0].size()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# LETS SPLIT THE DATASET\n\ntrain_dataset,test_dataset= random_split(dataset,[int(0.9*m),(m-int(0.9*m))])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# len(train_dataset)+len(test_dataset)==len(dataset)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size=32","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader= DataLoader(train_dataset,shuffle=True,batch_size=batch_size)\ntest_loader= DataLoader(test_dataset,shuffle=False,batch_size=batch_size)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# LETS IMPORT THE MODELS MODULE FROM TORCHVISION\nfrom torchvision import models","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# NOW THE TIME TO CREATE THE MODEL CLASS\n\n\nclass RSNA_Model(nn.Module):\n    \n    def __init__(self):\n        super(RSNA_Model,self).__init__()\n        \n        \n        self.network= models.resnet18(pretrained=True)  #using the pretrained model of resnet 18\n        self.out= self.network.fc.out_features   #finding the output nodes of the last layer of the resnet18\n        \n        self.further= nn.Sequential(nn.Linear(self.out,128),\n                                   nn.Dropout(0.3),\n                                   nn.Linear(128,1))\n        \n        \n        \n    def forward(self,X):\n            \n            X= self.network(X)\n            X= self.further(X)\n            return torch.sigmoid(X).to(torch.float32)\n        \n        \n        \n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# set the hyperparameters\nno_epochs=1\nlr= 0.001","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Lets create the model object\n\nmodel= RSNA_Model()\nmodel.to(device)\noptimizer= torch.optim.Adam(model.parameters(),lr=lr)\ncriterion= nn.MSELoss()\ncheckpoint = {'model': RSNA_Model(),\n          'state_dict': model.state_dict(),\n          'optimizer' : optimizer.state_dict(),\n             'threshold' : 0.5}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# TRAINING LOOP","metadata":{}},{"cell_type":"code","source":"for i in (range((no_epochs))):\n    \n    \n    for j,(X,y) in enumerate(train_loader):\n        \n              \n#       training loop\n              \n#       puting into the gpu\n        X=X.to(device)\n        y=y.to(device)\n        y=y.view(-1,1)\n        \n              \n#       lets propagate forward\n        y_hat=model(X)\n        loss=criterion(y_hat,y)\n              \n#               backproppp\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n              \n        if(j%50==0):\n            print(loss)\n            checkpoint = {'model': RSNA_Model(),\n                                 'state_dict': model.state_dict(),\n                                 'optimizer' : optimizer.state_dict(),\n                                 'threshold' : 0.5}\n#         torch.cuda.empty_cache()\n                \n              \n              \n              \n              \n              \n              \n              \n              \n              ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}