{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport torch\nimport pandas as pd\nimport numpy as np\nfrom torch.utils.data import Dataset, random_split, DataLoader\nfrom PIL import Image\nimport torchvision.models as models\nimport matplotlib.pyplot as plt\nimport torchvision.transforms as transforms\nfrom sklearn.metrics import f1_score\nimport torch.nn.functional as F\nimport torch.nn as nn\nfrom tqdm.notebook import tqdm\nfrom torchvision.utils import make_grid\n%matplotlib inline\n\nprint(\"Imported libraries...\")\nclass dr(Dataset):\n    def __init__(self,csv_file,root_dir,transform=None,test_set=False):\n        self.df = pd.read_csv(csv_file)\n        self.transform = transform\n        self.root_dir = root_dir\n        self.test_set = test_set\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self,idx):\n#         print(\"Came here\",idx,type(idx))\n        row = self.df.loc[int(idx)]\n        if self.test_set == True:\n                img_id, img_label = row['id_code'], 0\n        else:\n            img_id, img_label = row['id_code'], row['diagnosis']\n        img_fname = self.root_dir + \"/\" + str(img_id) + \".png\"\n        img = Image.open(img_fname)\n        if self.transform:\n            img = self.transform(img)\n        return img,img_label\n    \nclass DRNet(nn.Module):\n    def __init__(self,input_size,hidden_size,output_size):\n        super(DRNet,self).__init__()\n        self.layer1 = nn.Linear(input_size,hidden_size)\n        self.layer2 = nn.Linear(hidden_size,hidden_size)\n        self.layer3 = nn.Linear(hidden_size,output_size)\n        \n    def init_weights(self):\n        nn.init.kaiming_normal_(self.layer1.weights)\n        nn.init.kaiming_normal_(self.layer2.weights)\n        \n    def forward(self,x):\n        out = self.layer1(x)\n        out = F.relu(out)\n        out = self.layer2(out)\n        out = F.relu(out)\n        out = self.layer3(out)\n        return out\n        \ndef single_image(image):\n    showImage = image\n    if CUDA:\n        image =image.cuda()\n    image = image.view(-1,input_size)\n    output = net(image)\n    print(output)\n    _,predicted = torch.max(output.data,1)\n    print(\"Prediction = {}\".format(predicted[0]))\n    return int(predicted[0])\n#     show_sample(showImage,predicted,invert=False)\n            \n\n# Initialising data paths\nprint(\"Initialising paths...\")\nDATA_DIR = '../input/aptos2019-blindness-detection'\n\nTRAIN_DIR = '../input/aptos2019-blindness-detection/train_images'\nTEST_DIR = '../input/aptos2019-blindness-detection/test_images'\n\nTRAIN_CSV = '../input/aptos2019-blindness-detection/train.csv'\nTEST_CSV = '../input/aptos2019-blindness-detection/test.csv'\n\n# labels\nlabels = {\n    0: 'No DR',\n    1: 'Mild',\n    2: 'Moderate',\n    3: 'Severe',\n    4: 'Proliferative DR'\n}\n\nprint(\"Transforming and spliting the dataset...\")\ntransform = transforms.Compose([transforms.Resize((32,32)),transforms.ToTensor()])\ndataset = dr(TRAIN_CSV,TRAIN_DIR,transform=transform)\ntest_dataset = dr(TEST_CSV,TEST_DIR,transform=transform,test_set=True)\n\ntorch.manual_seed(10)\n\nval_percentage = 0.1\nval_size = int(val_percentage * len(dataset))\ntrain_size = len(dataset) - val_size\n\nprint(\"Validation set size = {0} , Training set size = {1}\".format(val_size,train_size))\n\ntrain_ds, val_ds = random_split(dataset, [train_size, val_size])\n\nprint(\"Size of training dataset = {0} and Validation dataset = {1} after spliting\".format(len(train_ds),len(val_ds)))\n\nbatch_size = 64\n\ntrain_dl = DataLoader(train_ds,batch_size,shuffle=True,num_workers=2,pin_memory=True)\nval_dl = DataLoader(val_ds,batch_size*2 , num_workers = 4,pin_memory=True)\n\ninput_size = 3*32*32\noutput_size = 5\nhidden_size = 1500\n\nprint(\"Creating object for the network\")\n# Create an object that represents your network\nnet = DRNet(input_size,hidden_size,output_size)\nCUDA = torch.cuda.is_available()\nif CUDA:\n    net = net.cuda()\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n\nprint(\"Training network...\")\n\nepochs = 10\n\nfor epoch in range(epochs):\n    correct_train = 0\n    running_loss = 0\n    for i,(images,labels) in tqdm(enumerate(train_dl)):\n        images = images.view(-1,input_size)\n        if CUDA:\n            images = images.cuda()\n            labels = labels.cuda()\n        \n        outputs = net(images)\n#         print(outputs.data)\n        _,predicted = torch.max(outputs.data,1)\n#         print(predicted)\n#         print(labels)\n        correct_train += (predicted==labels).sum()\n        loss = criterion(outputs,labels)\n        running_loss += loss.item()\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n    print('Epoch [{}/{}], Training Loss: {:.3f}, Training Accuracy: {:.3f}%'.format\n          (epoch+1, epochs, running_loss/len(train_dl), (100*correct_train.double()/len(train_ds))))\nprint(\"Training Done Successfully\")\n    \nprint(\"Validation network...\")\nwith torch.no_grad():\n    correct = 0\n    for images,labels in val_dl:\n        if CUDA:\n            images = images.cuda()\n            labels = labels.cuda()\n        images = images.view(-1,input_size)\n        outputs = net(images)\n        _,predicted = torch.max(outputs.data,1)\n        correct += (predicted == labels).sum().item()\n    print('Accuracy of the network on the {0} validation images: {1} %'.format(len(val_ds),100 * correct / len(val_ds)))\n    \nprint(\"Testing dataset...\")\nmypreds = []\nfor i in range(len(test_dataset)):\n    img, target = test_dataset[i]\n    pred = single_image(img)\n    print(pred)\n    mypreds.append(pred)\n    \nsubmission_df = pd.read_csv(TEST_CSV)\nsubmission_df['diagnosis'] = mypreds\nsub_file = 'submission.csv'\nsubmission_df.to_csv(sub_file,index=False)\n\n\n\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}