{"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 zipfile\n\nwith zipfile.ZipFile(\"../input/dogs-vs-cats/train.zip\",\"r\") as z:\n    z.extractall(\".\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-26T06:18:52.763615Z","iopub.execute_input":"2022-07-26T06:18:52.764419Z","iopub.status.idle":"2022-07-26T06:19:05.947791Z","shell.execute_reply.started":"2022-07-26T06:18:52.763935Z","shell.execute_reply":"2022-07-26T06:19:05.946803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport matplotlib.pyplot as plt\nimport torch\nimport torchvision\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader, Dataset\nimport numpy as np\nfrom torch import nn, optim\nfrom PIL import Image\nfile_dir  = \"/kaggle/working/train/\"\nfile_name = os.listdir(file_dir)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T11:43:31.280527Z","iopub.execute_input":"2022-07-26T11:43:31.280876Z","iopub.status.idle":"2022-07-26T11:43:31.301473Z","shell.execute_reply.started":"2022-07-26T11:43:31.280847Z","shell.execute_reply":"2022-07-26T11:43:31.300558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\ntrain, test = train_test_split(file_name, test_size=0.2)\ntrain, val = train_test_split(train, test_size=0.25)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:07.495702Z","iopub.execute_input":"2022-07-26T06:19:07.496264Z","iopub.status.idle":"2022-07-26T06:19:08.008714Z","shell.execute_reply.started":"2022-07-26T06:19:07.496234Z","shell.execute_reply":"2022-07-26T06:19:08.007558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CatDogDataset(Dataset):\n    def __init__(self,file_list,file_dir,transform = None):\n        self.file_list = file_list\n        self.file_dir = file_dir\n        self.transform = transform    \n        \n    def __getitem__(self, index):\n        image_name = self.file_list[index]\n        image = Image.open(os.path.join(self.file_dir,image_name))\n        image = image.resize((224,224))\n        if self.transform != None:\n            image = self.transform(image)\n\n        if 'cat' in image_name:\n            label = 0\n        else:\n            label = 1\n        return image, label\n\n\n    \n    def __len__(self):\n        return len(self.file_list)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:08.011083Z","iopub.execute_input":"2022-07-26T06:19:08.011398Z","iopub.status.idle":"2022-07-26T06:19:08.023975Z","shell.execute_reply.started":"2022-07-26T06:19:08.011365Z","shell.execute_reply":"2022-07-26T06:19:08.022997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([transforms.RandomHorizontalFlip(p=0.5), \n                               transforms.RandomRotation(15),\n                               transforms.ToTensor(),\n                               transforms.Normalize([0.485, 0.456, 0.406],\n                                                           [0.229, 0.224, 0.225])])","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:08.025162Z","iopub.execute_input":"2022-07-26T06:19:08.025480Z","iopub.status.idle":"2022-07-26T06:19:08.033429Z","shell.execute_reply.started":"2022-07-26T06:19:08.025442Z","shell.execute_reply":"2022-07-26T06:19:08.032406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = CatDogDataset(train, file_dir, transform =transform)\nval_data = CatDogDataset(val, file_dir, transform =transform)\ntest_data = CatDogDataset(test, file_dir, transform =transform)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:08.036454Z","iopub.execute_input":"2022-07-26T06:19:08.036855Z","iopub.status.idle":"2022-07-26T06:19:08.044437Z","shell.execute_reply.started":"2022-07-26T06:19:08.036818Z","shell.execute_reply":"2022-07-26T06:19:08.043528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = DataLoader(train_data, batch_size = 32, shuffle=True)\nval_loader = DataLoader(val_data, batch_size = 32, shuffle=True)\ntest_loader = DataLoader(test_data, batch_size = 32, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:08.045834Z","iopub.execute_input":"2022-07-26T06:19:08.046989Z","iopub.status.idle":"2022-07-26T06:19:08.052768Z","shell.execute_reply.started":"2022-07-26T06:19:08.046949Z","shell.execute_reply":"2022-07-26T06:19:08.051673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for images, labels in train_loader:\n    \n    fig, ax = plt.subplots(figsize = (20, 20))\n    ax.set_xticks([])\n    ax.set_yticks([])\n    ax.imshow(torchvision.utils.make_grid(images, nrow=4).permute(1,2,0))\n    break","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:08.055192Z","iopub.execute_input":"2022-07-26T06:19:08.056156Z","iopub.status.idle":"2022-07-26T06:19:09.013111Z","shell.execute_reply.started":"2022-07-26T06:19:08.056117Z","shell.execute_reply":"2022-07-26T06:19:09.011938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:09.014301Z","iopub.execute_input":"2022-07-26T06:19:09.014653Z","iopub.status.idle":"2022-07-26T06:19:09.104093Z","shell.execute_reply.started":"2022-07-26T06:19:09.014620Z","shell.execute_reply":"2022-07-26T06:19:09.103037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class VGG16(nn.Module):\n    def __init__(self):\n        super().__init__()\n        \n        self.vgg16_conv_layers = nn.Sequential(\n            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False),\n            \n            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False),\n            \n            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False),\n            \n            nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False),\n            \n            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1, stride=1),\n            nn.BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True),\n            nn.ReLU(),\n            nn.MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n        )\n        \n        self.vgg16_fc_layers = nn.Sequential(\n            nn.Linear(in_features=7 * 7 * 512, out_features=4096),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(in_features=4096, out_features=4096),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(in_features=4096, out_features=1000),\n            nn.ReLU(),\n            nn.LogSoftmax(dim = 1)\n        )\n        \n    def forward(self,x):\n        out = self.vgg16_conv_layers(x)\n        out = out.view(-1,7 * 7 * 512)\n        out = self.vgg16_fc_layers(out)\n        return out","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:09.107935Z","iopub.execute_input":"2022-07-26T06:19:09.108873Z","iopub.status.idle":"2022-07-26T06:19:09.178688Z","shell.execute_reply.started":"2022-07-26T06:19:09.108830Z","shell.execute_reply":"2022-07-26T06:19:09.168110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = VGG16()\nmodel = model.to(device)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:09.181101Z","iopub.execute_input":"2022-07-26T06:19:09.181931Z","iopub.status.idle":"2022-07-26T06:19:13.888006Z","shell.execute_reply.started":"2022-07-26T06:19:09.181886Z","shell.execute_reply":"2022-07-26T06:19:13.887004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-3)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:13.889519Z","iopub.execute_input":"2022-07-26T06:19:13.889861Z","iopub.status.idle":"2022-07-26T06:19:13.896227Z","shell.execute_reply.started":"2022-07-26T06:19:13.889829Z","shell.execute_reply":"2022-07-26T06:19:13.894899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 10\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [trian loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T06:19:13.897780Z","iopub.execute_input":"2022-07-26T06:19:13.898137Z","iopub.status.idle":"2022-07-26T07:03:07.716523Z","shell.execute_reply.started":"2022-07-26T06:19:13.898103Z","shell.execute_reply":"2022-07-26T07:03:07.715544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 10\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T07:03:07.718051Z","iopub.execute_input":"2022-07-26T07:03:07.719072Z","iopub.status.idle":"2022-07-26T07:46:57.521091Z","shell.execute_reply.started":"2022-07-26T07:03:07.719031Z","shell.execute_reply":"2022-07-26T07:46:57.520113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 10\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T07:46:57.522681Z","iopub.execute_input":"2022-07-26T07:46:57.523033Z","iopub.status.idle":"2022-07-26T08:30:27.577631Z","shell.execute_reply.started":"2022-07-26T07:46:57.522986Z","shell.execute_reply":"2022-07-26T08:30:27.576666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 10\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T08:30:27.579487Z","iopub.execute_input":"2022-07-26T08:30:27.580186Z","iopub.status.idle":"2022-07-26T09:13:53.360307Z","shell.execute_reply.started":"2022-07-26T08:30:27.580148Z","shell.execute_reply":"2022-07-26T09:13:53.359267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 10\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T09:13:53.361846Z","iopub.execute_input":"2022-07-26T09:13:53.362291Z","iopub.status.idle":"2022-07-26T09:57:14.735163Z","shell.execute_reply.started":"2022-07-26T09:13:53.362252Z","shell.execute_reply":"2022-07-26T09:57:14.734188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)","metadata":{"execution":{"iopub.status.busy":"2022-07-26T09:57:50.340415Z","iopub.execute_input":"2022-07-26T09:57:50.340764Z","iopub.status.idle":"2022-07-26T09:57:50.346174Z","shell.execute_reply.started":"2022-07-26T09:57:50.340732Z","shell.execute_reply":"2022-07-26T09:57:50.345036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 5\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T09:57:53.334029Z","iopub.execute_input":"2022-07-26T09:57:53.334385Z","iopub.status.idle":"2022-07-26T10:19:36.559198Z","shell.execute_reply.started":"2022-07-26T09:57:53.334334Z","shell.execute_reply":"2022-07-26T10:19:36.558151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 5\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T10:21:29.020317Z","iopub.execute_input":"2022-07-26T10:21:29.021458Z","iopub.status.idle":"2022-07-26T10:43:15.284179Z","shell.execute_reply.started":"2022-07-26T10:21:29.021412Z","shell.execute_reply":"2022-07-26T10:43:15.283153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 5\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T10:43:26.122092Z","iopub.execute_input":"2022-07-26T10:43:26.122468Z","iopub.status.idle":"2022-07-26T11:05:08.591026Z","shell.execute_reply.started":"2022-07-26T10:43:26.122431Z","shell.execute_reply":"2022-07-26T11:05:08.590000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\ntrain_losses = []\nval_losses = []\naccuracy_list = []\nnum_epochs = 5\nfor epoch in range(num_epochs):\n\n    model.train()\n    running_loss = 0\n    \n    for images, labels in tqdm(train_loader):\n        \n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    train_losses.append(running_loss / len(train_loader))\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(val_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    val_losses.append(running_loss / len(val_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    accuracy_list.append(accuracy)\n    \n    print(\"[Epoch: %d / %d],  [train loss: %.4f],  [Val loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, train_losses[-1], val_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T11:12:17.469269Z","iopub.execute_input":"2022-07-26T11:12:17.469633Z","iopub.status.idle":"2022-07-26T11:34:02.162928Z","shell.execute_reply.started":"2022-07-26T11:12:17.469603Z","shell.execute_reply":"2022-07-26T11:34:02.162004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_losses = []\nnum_epochs = 1\nfor epoch in range(num_epochs):\n    \n    model.eval()    \n    running_loss = 0\n    num_correct = 0\n    num_predictions = 0\n    with torch.no_grad():  \n        for images, labels in tqdm(test_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            running_loss += loss.item()\n            \n            _, predicted = torch.max(outputs.data, 1)\n            num_correct += (predicted == labels).sum().item()\n            num_predictions += labels.size(0)\n        \n    test_losses.append(running_loss / len(test_loader))\n    \n    accuracy = num_correct / num_predictions * 100\n    \n    print(\"[Epoch: %d / %d],  [Test loss: %.4f],  [Acc: %.2f]\" \\\n          %(epoch+1, num_epochs, test_losses[-1], accuracy))","metadata":{"execution":{"iopub.status.busy":"2022-07-26T11:34:11.337610Z","iopub.execute_input":"2022-07-26T11:34:11.338249Z","iopub.status.idle":"2022-07-26T11:34:54.448505Z","shell.execute_reply.started":"2022-07-26T11:34:11.338206Z","shell.execute_reply":"2022-07-26T11:34:54.447517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import zipfile\n\nwith zipfile.ZipFile(\"../input/dogs-vs-cats/test1.zip\",\"r\") as z:\n    z.extractall(\".\")","metadata":{"execution":{"iopub.status.busy":"2022-07-26T11:36:49.405511Z","iopub.execute_input":"2022-07-26T11:36:49.406248Z","iopub.status.idle":"2022-07-26T11:36:56.350296Z","shell.execute_reply.started":"2022-07-26T11:36:49.406198Z","shell.execute_reply":"2022-07-26T11:36:56.349381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def CatDogPredict(model, image):\n    model = model\n    image = image.resize((224,224))\n    image = test_data.transform(image)\n    image = image.to(device)\n    output = model(image.unsqueeze(0))\n    _, predicted = torch.max(output.data, 1)\n    if predicted == 0:\n        return \"cat\"\n    else:\n        return \"dog\"","metadata":{"execution":{"iopub.status.busy":"2022-07-26T12:00:34.932652Z","iopub.execute_input":"2022-07-26T12:00:34.932991Z","iopub.status.idle":"2022-07-26T12:00:34.939532Z","shell.execute_reply.started":"2022-07-26T12:00:34.932962Z","shell.execute_reply":"2022-07-26T12:00:34.937986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testfile_dir = \"/kaggle/working/test1/\"\nfor i in range(1,21):\n    filename = str(i) + \".jpg\"\n    image = Image.open(os.path.join(testfile_dir,filename))\n    fig, ax = plt.subplots(figsize = (10, 10))\n    ax.set_xticks([])\n    ax.set_yticks([])\n    plt.imshow(image)\n    plt.show()\n    result = CatDogPredict(model, image)\n    print(f\"Classifier Result: {result}\")","metadata":{"execution":{"iopub.status.busy":"2022-07-26T12:05:04.832114Z","iopub.execute_input":"2022-07-26T12:05:04.833326Z","iopub.status.idle":"2022-07-26T12:05:10.296388Z","shell.execute_reply.started":"2022-07-26T12:05:04.833277Z","shell.execute_reply":"2022-07-26T12:05:10.295402Z"},"trusted":true},"execution_count":null,"outputs":[]}]}