{"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 os\nimport pandas as pd\nimport numpy as np\nimport random\nimport time\nimport torch\nimport torchvision\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import Dataset,DataLoader\nimport torch.nn.functional as F\n\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-24T04:26:24.469879Z","iopub.execute_input":"2023-04-24T04:26:24.470266Z","iopub.status.idle":"2023-04-24T04:26:24.477927Z","shell.execute_reply.started":"2023-04-24T04:26:24.470232Z","shell.execute_reply":"2023-04-24T04:26:24.476588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(torch.__version__)\nprint(torchvision.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:24.480404Z","iopub.execute_input":"2023-04-24T04:26:24.481441Z","iopub.status.idle":"2023-04-24T04:26:24.491047Z","shell.execute_reply.started":"2023-04-24T04:26:24.481402Z","shell.execute_reply":"2023-04-24T04:26:24.489908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!nvidia-smi","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:24.492760Z","iopub.execute_input":"2023-04-24T04:26:24.493451Z","iopub.status.idle":"2023-04-24T04:26:25.658845Z","shell.execute_reply.started":"2023-04-24T04:26:24.493387Z","shell.execute_reply":"2023-04-24T04:26:25.657512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#checking files\nos.listdir('../input/dogs-vs-cats-redux-kernels-edition')","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:25.662198Z","iopub.execute_input":"2023-04-24T04:26:25.662668Z","iopub.status.idle":"2023-04-24T04:26:25.672244Z","shell.execute_reply.started":"2023-04-24T04:26:25.662624Z","shell.execute_reply":"2023-04-24T04:26:25.670828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#unzip files\nimport zipfile\nzip_files = ['test', 'train']\n\nfor zip_file in zip_files:\n    with zipfile.ZipFile('../input/dogs-vs-cats-redux-kernels-edition/{}.zip'.format(zip_file), \"r\") as z:\n        z.extractall(\".\")\n        print(\"{} unzipped\".format(zip_file))","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:25.674341Z","iopub.execute_input":"2023-04-24T04:26:25.675022Z","iopub.status.idle":"2023-04-24T04:26:39.486466Z","shell.execute_reply.started":"2023-04-24T04:26:25.674986Z","shell.execute_reply":"2023-04-24T04:26:39.485193Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train & test images sets \ntrain_img_files = os.listdir(\"../working/train\")\ntest_img_files = os.listdir(\"../working/test\")\n\nlen(train_img_files),len(test_img_files),","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.488955Z","iopub.execute_input":"2023-04-24T04:26:39.490098Z","iopub.status.idle":"2023-04-24T04:26:39.517645Z","shell.execute_reply.started":"2023-04-24T04:26:39.490045Z","shell.execute_reply":"2023-04-24T04:26:39.516493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_img_files = os.listdir(\"../working/train\")\ntrain_img_files = list(filter(lambda x: x!= 'train', train_img_files))\ndef train_path(p):\n    return f\"../working/train/{p}\"\ntrain_img_files = list(map(train_path, train_img_files))\n\nlen(train_img_files),train_img_files[0]\n","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.519396Z","iopub.execute_input":"2023-04-24T04:26:39.519816Z","iopub.status.idle":"2023-04-24T04:26:39.548301Z","shell.execute_reply.started":"2023-04-24T04:26:39.519777Z","shell.execute_reply":"2023-04-24T04:26:39.547235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create train_test split\nrandom.shuffle(train_img_files)\n\ntrain = train_img_files[:20000]\ntest = train_img_files[20000:]\n\nlen(train), len(test)","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.549713Z","iopub.execute_input":"2023-04-24T04:26:39.550312Z","iopub.status.idle":"2023-04-24T04:26:39.581579Z","shell.execute_reply.started":"2023-04-24T04:26:39.550272Z","shell.execute_reply":"2023-04-24T04:26:39.580509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#normalize images\ntransform = transforms.Compose([\n    transforms.Resize((224,224)),\n    transforms.RandomVerticalFlip(p = 0.5),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5),(0.5))\n])","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.583172Z","iopub.execute_input":"2023-04-24T04:26:39.583634Z","iopub.status.idle":"2023-04-24T04:26:39.589778Z","shell.execute_reply.started":"2023-04-24T04:26:39.583596Z","shell.execute_reply":"2023-04-24T04:26:39.588385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#pre processing images\nclass CatAndDogs(Dataset):\n    def __init__(self, image_paths, transform):\n        super().__init__()\n        self.paths = image_paths\n        self.len = len(self.paths)\n        self.transform = transform\n        \n    def __len__(self):\n        return self.len\n    \n    def __getitem__(self,index):\n        path = self.paths[index]\n        image = Image.open(path).convert('RGB')\n        image = self.transform(image)\n        label = 0 if 'cat' in path else 1\n        return(image, label)\n        ","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.596023Z","iopub.execute_input":"2023-04-24T04:26:39.596435Z","iopub.status.idle":"2023-04-24T04:26:39.604281Z","shell.execute_reply.started":"2023-04-24T04:26:39.596399Z","shell.execute_reply":"2023-04-24T04:26:39.602739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create train data set\ntrain_dataset = CatAndDogs(train, transform)\ntrain_dataloader = DataLoader(train_dataset, batch_size = 100)\nprint(f\"Train data set size : {len(train_dataset)} | Train data batch size : {len(train_dataloader)}\")","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.606038Z","iopub.execute_input":"2023-04-24T04:26:39.606685Z","iopub.status.idle":"2023-04-24T04:26:39.619243Z","shell.execute_reply.started":"2023-04-24T04:26:39.606585Z","shell.execute_reply":"2023-04-24T04:26:39.618055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create test data set\ntest_dataset = CatAndDogs(test, transform)\ntest_dataloader = DataLoader(test_dataset, batch_size = 100)\nprint(f\"Test data set size : {len(test_dataset)} | Test data batch size : {len(test_dataloader)}\")","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.620987Z","iopub.execute_input":"2023-04-24T04:26:39.621679Z","iopub.status.idle":"2023-04-24T04:26:39.630036Z","shell.execute_reply.started":"2023-04-24T04:26:39.621638Z","shell.execute_reply":"2023-04-24T04:26:39.628737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#CNN creation\nclass CatAndDogsCNN(nn.Module):\n    def __init__(self):\n        super().__init__()\n        \n        # convolutional layers (3,16,32)\n        self.conv1 = nn.Conv2d(in_channels = 3, out_channels = 32, kernel_size = (5,5), stride = 2, padding = 1)\n        self.conv2 = nn.Conv2d(in_channels = 32, out_channels = 64, kernel_size = (5,5), stride = 2, padding = 1)\n        self.conv3 = nn.Conv2d(in_channels = 64, out_channels = 128, kernel_size = (3,3), padding = 1)\n        \n        #connected layers\n        self.fc1 = nn.Linear(in_features = 128 *6*6, out_features = 500)\n        self.fcd1 = nn.Dropout(0.5)\n        self.fc2 = nn.Linear(in_features = 500, out_features = 50)\n        self.fc3 = nn.Linear(in_features = 50, out_features = 2)\n        \n    def forward(self, X):\n        X = F.relu(self.conv1(X))\n        X = F.max_pool2d(X,2)\n        \n        X = F.relu(self.conv2(X))\n        X = F.max_pool2d(X,2)\n        \n        X = F.relu(self.conv3(X))\n        X = F.max_pool2d(X,2)\n        \n        X = X.view(X.shape[0], -1)\n        X = F.relu(self.fc1(X))\n        X = self.fcd1(X)\n        X = F.relu(self.fc2(X))\n        X = self.fc3(X)\n        \n        return X","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:39.632630Z","iopub.execute_input":"2023-04-24T04:26:39.633579Z","iopub.status.idle":"2023-04-24T04:26:39.645472Z","shell.execute_reply.started":"2023-04-24T04:26:39.633540Z","shell.execute_reply":"2023-04-24T04:26:39.644377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create the instance of the model\nmodel_0 = CatAndDogsCNN().cuda()\n\n#train loss and train acc \n\n\nepochs = 10\n\nstart_time = time.time()\n\n#loss function\nloss_fn = nn.CrossEntropyLoss()\n\n#optimizer\noptimizer = torch.optim.Adam(model_0.parameters(), lr= 0.001)\n\n#model training\nfor epoch in tqdm(range(epochs)):\n    print(f\"epoch: {epoch}\\n-----\")\n    \n    train_loss , train_acc  = 0,0\n    \n    for X,y in train_dataloader:\n        X = X.cuda()\n        y = y.cuda()\n        \n        # forward pass\n        y_preds = model_0(X)\n        \n        #clac loss and acc\n        loss = loss_fn(y_preds, y)\n        train_loss += loss\n        train_acc +=((y_preds.argmax(dim = 1) == y).float().mean())\n        \n        #Optimizer\n        optimizer.zero_grad()\n        \n        # loss backward\n        loss.backward()\n        \n        #optimizer steps\n        optimizer.step()\n        \n    train_loss /= len(train_dataloader)\n    train_acc /= len(train_dataloader)\n    \n    with torch.no_grad():\n        test_loss, test_acc = 0,0\n        \n        for X_test, y_test in test_dataloader:\n            X_test = X_test.cuda() \n            y_test = y_test.cuda()\n            test_preds = model_0(X_test)\n            \n            test_loss += loss_fn(test_preds, y_test)\n            test_acc +=((test_preds.argmax(dim=1) == y_test).float().mean())\n            \n        test_loss /= len(test_dataloader)\n        test_acc /= len(test_dataloader)\n        \n    print(f\"\\ntrain loss: {train_loss:.4f}, train acc: {train_acc:.4f} | test loss: {test_loss:.4f}, test acc: {test_acc:.4f}\")\n        \n        \nend_time = time.time()\ntotal_time = end_time - start_time\nprint(f\"Total train time : {total_time}\")\n\n\n    ","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:27:24.571433Z","iopub.execute_input":"2023-04-24T04:27:24.572138Z","iopub.status.idle":"2023-04-24T04:49:51.987817Z","shell.execute_reply.started":"2023-04-24T04:27:24.572101Z","shell.execute_reply":"2023-04-24T04:49:51.986473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#testing and making predictions\ntest_img_files = os.listdir(\"../working/test\")\ntset_img_files = list(filter(lambda x: x!= 'test', test_img_files))\ndef train_path(p):\n    return f\"../working/test/{p}\"\ntest_img_files = list(map(train_path, test_img_files))\n\nlen(test_img_files),test_img_files[0]","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.335579Z","iopub.status.idle":"2023-04-24T04:26:58.336458Z","shell.execute_reply.started":"2023-04-24T04:26:58.336136Z","shell.execute_reply":"2023-04-24T04:26:58.336167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestCatAndDogsCNN(Dataset):\n    def __init__(self,image_path, transform):\n        super().__init__()\n        self.paths = image_path\n        self.len = len(self.paths)\n        self.transform = transform\n        \n    def __len__(self):\n        return self.len\n    \n    def __getitem__(self, index):\n        path = self.paths[index]\n        image = Image.open(path).convert('RGB')\n        image = self.transform(image)\n        fieldid = path.split('/')[-1].split('.')[0]\n        return (image, fieldid)","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.338007Z","iopub.status.idle":"2023-04-24T04:26:58.338750Z","shell.execute_reply.started":"2023-04-24T04:26:58.338494Z","shell.execute_reply":"2023-04-24T04:26:58.338519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset =  TestCatAndDogsCNN(test_img_files, transform)\ntest_dataloader = DataLoader(test_dataset , batch_size = 100)\nlen(test_dataset), len(test_dataloader)","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.340187Z","iopub.status.idle":"2023-04-24T04:26:58.340988Z","shell.execute_reply.started":"2023-04-24T04:26:58.340702Z","shell.execute_reply":"2023-04-24T04:26:58.340729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_prob = []\n\nwith torch.no_grad():\n    for X, fieldid in test_dataloader:\n        X = X.cuda()\n        preds = model_0(X)\n        pred_list = F.softmax(preds, dim = 1)[:, 1].tolist()\n        test_prob += list(zip(list(fieldid), pred_list))","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.342455Z","iopub.status.idle":"2023-04-24T04:26:58.343233Z","shell.execute_reply.started":"2023-04-24T04:26:58.342973Z","shell.execute_reply":"2023-04-24T04:26:58.343000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(test_prob)","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.344638Z","iopub.status.idle":"2023-04-24T04:26:58.345515Z","shell.execute_reply.started":"2023-04-24T04:26:58.345152Z","shell.execute_reply":"2023-04-24T04:26:58.345229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#validation\nfor img, probs in zip(test_img_files[:10], test_prob[:10]):\n   # pil_im = Image.open(img, 'r')\n    #label = \"dog\" if probs[1]> 0.5 else \"cat\"\n    #title = \"Prob of dog : \" + str(probs[1]) + \"Classified as : \" + label\n    #plt.figure()\n    #plt.imshow(pil_im)\n    #plt.suptitle(title)\n    #plt.show()\n    if probs[1] > 0.5:\n        print(f\" image : {img} is -> dog\")\n    else:\n        print(f\" image : {img} is -> cat\")","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.347163Z","iopub.status.idle":"2023-04-24T04:26:58.347953Z","shell.execute_reply.started":"2023-04-24T04:26:58.347676Z","shell.execute_reply":"2023-04-24T04:26:58.347703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#validation\nfor img, probs in zip(test_img_files[:50], test_prob[:50]):\n    pb = probs[1] * 100\n    pil_im = Image.open(img, 'r')\n    print(probs[1])\n    label = \"dog\" if probs[1]> 0.7 else \"cat\"\n    title = \"Prob of dog : \" + str(pb) + \"%  Classified as : \" + label\n    plt.figure()\n    plt.imshow(pil_im)\n    plt.suptitle(title)\n    plt.show()\n   ","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.349303Z","iopub.status.idle":"2023-04-24T04:26:58.350111Z","shell.execute_reply.started":"2023-04-24T04:26:58.349839Z","shell.execute_reply":"2023-04-24T04:26:58.349867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#validation\nfor img, probs in zip(test_img_files[:10], test_prob[:10]):\n    pb =probs[1] * 100\n    #print(f\"{probs[1] * 100:.4f} %\")\n    print(pb)","metadata":{"execution":{"iopub.status.busy":"2023-04-24T04:26:58.351498Z","iopub.status.idle":"2023-04-24T04:26:58.352236Z","shell.execute_reply.started":"2023-04-24T04:26:58.351978Z","shell.execute_reply":"2023-04-24T04:26:58.352005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}