{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30673,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Import libraries","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\nimport cv2\nimport numpy as np\nimport pandas as pd\nimport random\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom PIL import Image\nplt.style.use(\"ggplot\")\nimport time\n\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import DataLoader\nfrom torchvision import datasets, transforms\nimport torch.nn.functional as F\n\nfrom tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:15:36.140653Z","iopub.execute_input":"2024-03-23T12:15:36.141285Z","iopub.status.idle":"2024-03-23T12:15:46.977545Z","shell.execute_reply.started":"2024-03-23T12:15:36.141236Z","shell.execute_reply":"2024-03-23T12:15:46.976230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Read the data","metadata":{}},{"cell_type":"code","source":"unzip_data = f\"/kaggle/input/dogs-vs-cats\"","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:06.186555Z","iopub.execute_input":"2024-03-23T12:16:06.189118Z","iopub.status.idle":"2024-03-23T12:16:06.195012Z","shell.execute_reply.started":"2024-03-23T12:16:06.189071Z","shell.execute_reply":"2024-03-23T12:16:06.193493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /kaggle/input/dogs-vs-cats/train.zip","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:07.138265Z","iopub.execute_input":"2024-03-23T12:16:07.138688Z","iopub.status.idle":"2024-03-23T12:16:20.880811Z","shell.execute_reply.started":"2024-03-23T12:16:07.138656Z","shell.execute_reply":"2024-03-23T12:16:20.879214Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /kaggle/input/dogs-vs-cats/test1.zip","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:20.883772Z","iopub.execute_input":"2024-03-23T12:16:20.884280Z","iopub.status.idle":"2024-03-23T12:16:28.208176Z","shell.execute_reply.started":"2024-03-23T12:16:20.884212Z","shell.execute_reply":"2024-03-23T12:16:28.206634Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# read the unzipped data\npath, dirs, files = next(os.walk('/kaggle/working/train'))\n\nfile_counts = len(files)\nprint(f\"Files count: {file_counts}\")","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:35.861125Z","iopub.execute_input":"2024-03-23T12:16:35.861546Z","iopub.status.idle":"2024-03-23T12:16:35.905436Z","shell.execute_reply.started":"2024-03-23T12:16:35.861512Z","shell.execute_reply":"2024-03-23T12:16:35.904276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# set the base dir\nbase_dir = f\"/kaggle/working/dogs_vs_cats_dataset\"\nos.mkdir(base_dir)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:37.210860Z","iopub.execute_input":"2024-03-23T12:16:37.211379Z","iopub.status.idle":"2024-03-23T12:16:37.218823Z","shell.execute_reply.started":"2024-03-23T12:16:37.211341Z","shell.execute_reply":"2024-03-23T12:16:37.217113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# make an train dir\ntrain_dir = os.path.join(base_dir, 'train')\ntest_dir = os.path.join(base_dir, 'test')\nvalidate_dir = os.path.join(base_dir, 'val')\n\n# create the directory\nos.mkdir(train_dir)\nos.mkdir(test_dir)\nos.mkdir(validate_dir)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:40.040781Z","iopub.execute_input":"2024-03-23T12:16:40.041381Z","iopub.status.idle":"2024-03-23T12:16:40.051852Z","shell.execute_reply.started":"2024-03-23T12:16:40.041329Z","shell.execute_reply":"2024-03-23T12:16:40.050325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create an training folders\ntrain_dog_dir = os.path.join(train_dir, 'dogs')\ntrain_cat_dir = os.path.join(train_dir, 'cats')\n\n# create an testing folders\ntest_dog_dir = os.path.join(test_dir, \"dogs\")\ntest_cat_dir = os.path.join(test_dir, \"cats\")\n\n# create an validation folders\nval_dog_dir = os.path.join(validate_dir, \"dogs\")\nval_cat_dir = os.path.join(validate_dir, \"cats\")\n\n# make training folders\nos.mkdir(train_dog_dir)\nos.mkdir(train_cat_dir)\n\nos.mkdir(test_dog_dir)\nos.mkdir(test_cat_dir)\n\nos.mkdir(val_dog_dir)\nos.mkdir(val_cat_dir)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:40.509069Z","iopub.execute_input":"2024-03-23T12:16:40.509524Z","iopub.status.idle":"2024-03-23T12:16:40.519173Z","shell.execute_reply.started":"2024-03-23T12:16:40.509491Z","shell.execute_reply":"2024-03-23T12:16:40.517925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# get the training data\ndir_path = '/kaggle/working/train'\n\ncat_count = 0\ndog_count = 0\n\nfor i in os.listdir(dir_path):\n    if i.startswith('cat.'):\n        cat_count += 1\n    elif i.startswith('dog.'):\n        dog_count += 1\n        \n        \nprint(f\"Number of dog images: {dog_count}\")\nprint(f\"Number of cat images: {cat_count}\")","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:41.458647Z","iopub.execute_input":"2024-03-23T12:16:41.459055Z","iopub.status.idle":"2024-03-23T12:16:41.673720Z","shell.execute_reply.started":"2024-03-23T12:16:41.459024Z","shell.execute_reply":"2024-03-23T12:16:41.672565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"original_dataset = '/kaggle/working/train'\n\nfnames = [f'cat.{i}.jpg' for i in range(10001)]\n\nfor fname in fnames:\n    src = os.path.join(original_dataset, fname)\n    dst = os.path.join(train_cat_dir, fname)\n    shutil.copyfile(src, dst)\n    \nfnames_cat_val = [f'cat.{i}.jpg' for i in range(10001, 11251)]\n\nfor fname in fnames_cat_val:\n    src = os.path.join(original_dataset, fname)\n    dst = os.path.join(val_cat_dir, fname)\n    shutil.copyfile(src, dst)\n    \nfnames_cat_test = [f'cat.{i}.jpg' for i in range(11251, 12500)]\n\nfor fname in fnames_cat_test:\n    src = os.path.join(original_dataset, fname)\n    dst = os.path.join(test_cat_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:42.252163Z","iopub.execute_input":"2024-03-23T12:16:42.252799Z","iopub.status.idle":"2024-03-23T12:16:44.028429Z","shell.execute_reply.started":"2024-03-23T12:16:42.252766Z","shell.execute_reply":"2024-03-23T12:16:44.027049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames_dog_train = [f'dog.{i}.jpg' for i in range(10001)]\n\nfor fname in fnames_dog_train:\n    src = os.path.join(original_dataset, fname)\n    dst = os.path.join(train_dog_dir, fname)\n    shutil.copyfile(src, dst)\n    \nfnames_dog_val = [f'dog.{i}.jpg' for i in range(10001, 11251)]\n\nfor fname in fnames_dog_val:\n    src = os.path.join(original_dataset, fname)\n    dst = os.path.join(val_dog_dir, fname)\n    shutil.copyfile(src, dst)\n    \nfnames_dog_test = [f'dog.{i}.jpg' for i in range(11251, 12500)]\n\nfor fname in fnames_dog_test:\n    src = os.path.join(original_dataset, fname)\n    dst = os.path.join(test_dog_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:46.041897Z","iopub.execute_input":"2024-03-23T12:16:46.042779Z","iopub.status.idle":"2024-03-23T12:16:47.937866Z","shell.execute_reply.started":"2024-03-23T12:16:46.042735Z","shell.execute_reply":"2024-03-23T12:16:47.936690Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f'Total training cat images {len(os.listdir(train_cat_dir))}')\nprint(f'Total validation cat images {len(os.listdir(val_cat_dir))}')\nprint(f'Total test cat images {len(os.listdir(test_cat_dir))}')\nprint('\\n')\nprint(f'Total training dog images {len(os.listdir(train_dog_dir))}')\nprint(f'Total validation cat images {len(os.listdir(val_dog_dir))}')\nprint(f'Total test cat images {len(os.listdir(test_dog_dir))}')","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:47.939986Z","iopub.execute_input":"2024-03-23T12:16:47.941084Z","iopub.status.idle":"2024-03-23T12:16:47.969076Z","shell.execute_reply.started":"2024-03-23T12:16:47.941036Z","shell.execute_reply":"2024-03-23T12:16:47.967682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# simply reading the random image\n# set the random seed\nrandom.seed(42)\n\n# get the all image paths\nimage_path = f\"/kaggle/working/dogs_vs_cats_dataset/test/dogs/dog.11523.jpg\"\n\nimg = Image.open(image_path)\n\nimg","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:49.355426Z","iopub.execute_input":"2024-03-23T12:16:49.355904Z","iopub.status.idle":"2024-03-23T12:16:49.574800Z","shell.execute_reply.started":"2024-03-23T12:16:49.355871Z","shell.execute_reply":"2024-03-23T12:16:49.573483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# some basic information\nprint(f\"Shape of the image: {img.size}\")","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:51.769453Z","iopub.execute_input":"2024-03-23T12:16:51.769886Z","iopub.status.idle":"2024-03-23T12:16:51.776234Z","shell.execute_reply.started":"2024-03-23T12:16:51.769851Z","shell.execute_reply":"2024-03-23T12:16:51.775184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# transforms for the image\ndata_transform = transforms.Compose([\n    # resize the image into 256x256\n    transforms.Resize(size=(224, 224)),\n    # flip the images randomly on horizontal\n    transforms.RandomHorizontalFlip(p=0.5),\n    # turn the image into a torch tensor\n    transforms.ToTensor()\n])","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:52.855670Z","iopub.execute_input":"2024-03-23T12:16:52.858362Z","iopub.status.idle":"2024-03-23T12:16:52.864836Z","shell.execute_reply.started":"2024-03-23T12:16:52.858319Z","shell.execute_reply":"2024-03-23T12:16:52.863868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = datasets.ImageFolder(\n    root=train_dir,\n    transform=data_transform,\n    target_transform=None\n)\n\ntest_data = datasets.ImageFolder(\n    root=test_dir,\n    transform=data_transform,\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:53.805373Z","iopub.execute_input":"2024-03-23T12:16:53.806483Z","iopub.status.idle":"2024-03-23T12:16:53.942901Z","shell.execute_reply.started":"2024-03-23T12:16:53.806435Z","shell.execute_reply":"2024-03-23T12:16:53.941632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataloader = DataLoader(\n    dataset=train_data,\n    batch_size=100,\n    shuffle=True\n)\n\ntest_dataloader = DataLoader(\n    dataset=test_data,\n    batch_size=100,\n    shuffle=False\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:55.070042Z","iopub.execute_input":"2024-03-23T12:16:55.070455Z","iopub.status.idle":"2024-03-23T12:16:55.076854Z","shell.execute_reply.started":"2024-03-23T12:16:55.070424Z","shell.execute_reply":"2024-03-23T12:16:55.075600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_dataloader)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:56.100372Z","iopub.execute_input":"2024-03-23T12:16:56.100761Z","iopub.status.idle":"2024-03-23T12:16:56.108082Z","shell.execute_reply.started":"2024-03-23T12:16:56.100732Z","shell.execute_reply":"2024-03-23T12:16:56.106855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Pytorch Convolutional Neural Network Model Architecture\nclass CatAndDogConvNet(nn.Module):\n\n    def __init__(self):\n        super().__init__()\n\n        # onvolutional layers (3,16,32)\n        self.conv1 = nn.Conv2d(in_channels = 3, out_channels = 16, kernel_size=(5, 5), stride=2, padding=1)\n        self.conv2 = nn.Conv2d(in_channels = 16, out_channels = 32, kernel_size=(5, 5), stride=2, padding=1)\n        self.conv3 = nn.Conv2d(in_channels = 32, out_channels = 64, kernel_size=(3, 3), padding=1)\n\n        # conected layers\n        self.fc1 = nn.Linear(in_features= 64 * 6 * 6, out_features=500)\n        self.fc2 = nn.Linear(in_features=500, out_features=50)\n        self.fc3 = nn.Linear(in_features=50, out_features=2)\n\n\n    def forward(self, X):\n\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 = F.relu(self.fc2(X))\n        X = self.fc3(X)\n\n        return X\n","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:56.947803Z","iopub.execute_input":"2024-03-23T12:16:56.948202Z","iopub.status.idle":"2024-03-23T12:16:56.960642Z","shell.execute_reply.started":"2024-03-23T12:16:56.948173Z","shell.execute_reply":"2024-03-23T12:16:56.959371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create instance of the model\nmodel = CatAndDogConvNet()\n\nlosses = []\naccuracies = []\nepoches = 8\nstart = time.time()\nloss_fn = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr = 0.001)\n\n# Model Training...\nfor epoch in range(epoches):\n\n    epoch_loss = 0\n    epoch_accuracy = 0\n\n    for X, y in tqdm(train_dataloader):\n\n        preds = model(X)\n        loss = loss_fn(preds, y)\n\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        accuracy = ((preds.argmax(dim=1) == y).float().mean())\n        epoch_accuracy += accuracy\n        epoch_loss += loss\n\n    epoch_accuracy = epoch_accuracy/len(train_dataloader)\n    accuracies.append(epoch_accuracy)\n    epoch_loss = epoch_loss / len(train_dataloader)\n    losses.append(epoch_loss)\n\n    print(\"\\nEpoch: {}, train loss: {:.4f}, train acc: {:.4f}\".format(epoch, epoch_loss, epoch_accuracy))\n\n    # test set accuracy\n    with torch.no_grad():\n\n        test_epoch_loss = 0\n        test_epoch_accuracy = 0\n\n        for test_X, test_y in test_dataloader:\n\n            test_preds = model(test_X)\n            test_loss = loss_fn(test_preds, test_y)\n\n            test_epoch_loss += test_loss            \n            test_accuracy = ((test_preds.argmax(dim=1) == test_y).float().mean())\n            test_epoch_accuracy += test_accuracy\n\n        test_epoch_accuracy = test_epoch_accuracy/len(test_dataloader)\n        test_epoch_loss = test_epoch_loss / len(test_dataloader)\n\n        print(\"Epoch: {}, test loss: {:.4f}, test acc: {:.4f}\".format(epoch, test_epoch_loss, test_epoch_accuracy))\n","metadata":{"execution":{"iopub.status.busy":"2024-03-23T12:16:58.255319Z","iopub.execute_input":"2024-03-23T12:16:58.255747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}