{"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":"# Importing Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\n\nimport zipfile\nimport os\nimport shutil\n\nimport random\n\n\nimport torch\nfrom torchvision import datasets, transforms\nfrom torchvision.datasets import ImageFolder\nimport torchvision.transforms as T\nfrom torchvision.models import resnet18 ,ResNet18_Weights\nfrom torch import nn \nfrom torch.optim import SGD ,lr_scheduler\nimport torch.cuda\n\nimport time\nfrom torch.autograd import Variable","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:26.882267Z","iopub.execute_input":"2023-06-12T13:43:26.883222Z","iopub.status.idle":"2023-06-12T13:43:31.154308Z","shell.execute_reply.started":"2023-06-12T13:43:26.883092Z","shell.execute_reply":"2023-06-12T13:43:31.153309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\ntorch.device(device)","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:31.157076Z","iopub.execute_input":"2023-06-12T13:43:31.157655Z","iopub.status.idle":"2023-06-12T13:43:31.191906Z","shell.execute_reply.started":"2023-06-12T13:43:31.157621Z","shell.execute_reply":"2023-06-12T13:43:31.190908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preparation ","metadata":{}},{"cell_type":"code","source":"# setting file paths\ntrain_zip_path = \"/kaggle/input/dogs-vs-cats/train.zip\"\ntrain_images_path = \"/kaggle/working/training/\"\n\n# creating training directory\nos.makedirs(train_images_path, exist_ok=True)\n\n# unzipping files to train folder\n\nwith zipfile.ZipFile(train_zip_path) as zip_f:\n    zip_f.extractall(train_images_path)\n    \n#creating folder for Training \nos.makedirs(\"/kaggle/working/training/Train/\", exist_ok=True)\n#creating folder for Validation \nos.makedirs(\"/kaggle/working/training/Valid/\", exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:31.196013Z","iopub.execute_input":"2023-06-12T13:43:31.196407Z","iopub.status.idle":"2023-06-12T13:43:43.183388Z","shell.execute_reply.started":"2023-06-12T13:43:31.196375Z","shell.execute_reply":"2023-06-12T13:43:43.182455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = os.listdir(\"training/train\")\nL = len(images)\n# creating directories for each class\nos.makedirs(\"training/Train/cat\", exist_ok=True)\nos.makedirs(\"training/Train/dog\", exist_ok=True)\n\n\n\nfor i, file in enumerate(images):\n    # getting category\n    dir_name = file.split(\".\")[0].lower()\n    \n    # copying to correct folder\n    os.rename(f\"/kaggle/working/training/train/{file}\",\n              f\"/kaggle/working/training/Train/{dir_name}/{file}\")","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:43.185912Z","iopub.execute_input":"2023-06-12T13:43:43.186367Z","iopub.status.idle":"2023-06-12T13:43:43.786914Z","shell.execute_reply.started":"2023-06-12T13:43:43.186334Z","shell.execute_reply":"2023-06-12T13:43:43.785967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#deleting the old train folder\nshutil.rmtree(\"/kaggle/working/training/train\")","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:43.788307Z","iopub.execute_input":"2023-06-12T13:43:43.788650Z","iopub.status.idle":"2023-06-12T13:43:43.796509Z","shell.execute_reply.started":"2023-06-12T13:43:43.788617Z","shell.execute_reply":"2023-06-12T13:43:43.792931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#creating dog & cat folders in Valid folder\nos.makedirs(\"training/Valid/cat\", exist_ok=True)\nos.makedirs(\"training/Valid/dog\", exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:43.797789Z","iopub.execute_input":"2023-06-12T13:43:43.798334Z","iopub.status.idle":"2023-06-12T13:43:43.804906Z","shell.execute_reply.started":"2023-06-12T13:43:43.798298Z","shell.execute_reply":"2023-06-12T13:43:43.804016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"source_dog = 'training/Train/dog'\nsource_cat = 'training/Train/cat'\ndest_dog = 'training/Valid/dog'\ndest_cat = 'training/Valid/cat'\nfiles_dog = os.listdir(source_dog)\nfiles_cat = os.listdir(source_cat)\nno_of_files_dog = int(len(files_dog) // 5)\nno_of_files_cat = int(len(files_dog) // 5)\n\nfor file_name in random.sample(files_dog, no_of_files_dog):\n    shutil.move(os.path.join(source_dog, file_name), dest_dog)\n    \nfor file_name in random.sample(files_cat, no_of_files_cat):\n    shutil.move(os.path.join(source_cat, file_name), dest_cat)","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:43.806280Z","iopub.execute_input":"2023-06-12T13:43:43.806880Z","iopub.status.idle":"2023-06-12T13:43:44.063543Z","shell.execute_reply.started":"2023-06-12T13:43:43.806850Z","shell.execute_reply":"2023-06-12T13:43:44.062663Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"simple_transform = T.Compose([T.Resize((224,224)) , T.ToTensor(), \n                              T.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:44.064725Z","iopub.execute_input":"2023-06-12T13:43:44.065512Z","iopub.status.idle":"2023-06-12T13:43:44.070871Z","shell.execute_reply.started":"2023-06-12T13:43:44.065476Z","shell.execute_reply":"2023-06-12T13:43:44.069992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_image = ImageFolder(\"/kaggle/working/training/Train/\",simple_transform)\nvalid_image = ImageFolder(\"/kaggle/working/training/Valid/\",simple_transform)\n\ntrain_image.class_to_idx","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:44.072121Z","iopub.execute_input":"2023-06-12T13:43:44.072837Z","iopub.status.idle":"2023-06-12T13:43:44.213257Z","shell.execute_reply.started":"2023-06-12T13:43:44.072806Z","shell.execute_reply":"2023-06-12T13:43:44.212205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_image","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:44.221279Z","iopub.execute_input":"2023-06-12T13:43:44.224095Z","iopub.status.idle":"2023-06-12T13:43:44.233482Z","shell.execute_reply.started":"2023-06-12T13:43:44.224056Z","shell.execute_reply":"2023-06-12T13:43:44.232513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataloader = torch.utils.data.DataLoader(\n    train_image,batch_size = 32 ,num_workers = 2, shuffle = True)\n\nvalid_dataloader = torch.utils.data.DataLoader(\n    valid_image,batch_size = 32 ,num_workers = 2, shuffle = False)\n\ndataloaders = {'training':train_dataloader,'validation':valid_dataloader}\ndataset_sizes = {'training':len(train_dataloader.dataset),'validation':len(valid_dataloader.dataset)}\nprint(dataset_sizes)","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:44.235035Z","iopub.execute_input":"2023-06-12T13:43:44.236128Z","iopub.status.idle":"2023-06-12T13:43:44.252952Z","shell.execute_reply.started":"2023-06-12T13:43:44.236092Z","shell.execute_reply":"2023-06-12T13:43:44.251856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.cuda.is_available()","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:44.254636Z","iopub.execute_input":"2023-06-12T13:43:44.255496Z","iopub.status.idle":"2023-06-12T13:43:44.268248Z","shell.execute_reply.started":"2023-06-12T13:43:44.255458Z","shell.execute_reply":"2023-06-12T13:43:44.265404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Creating","metadata":{}},{"cell_type":"code","source":"model = resnet18(ResNet18_Weights)\nnum_features = model.fc.in_features\nmodel.fc = nn.Linear(num_features,2)\n\nif device:\n    model = model.cuda()","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:44.269828Z","iopub.execute_input":"2023-06-12T13:43:44.270207Z","iopub.status.idle":"2023-06-12T13:43:47.569385Z","shell.execute_reply.started":"2023-06-12T13:43:44.270171Z","shell.execute_reply":"2023-06-12T13:43:47.568448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#loss and optimizer\nLR = 0.001\n\ncriterion = nn.CrossEntropyLoss()\n\noptimizer = SGD(model.parameters(), lr=LR, momentum=0.9)\nexp_LR_scheduler = lr_scheduler.StepLR(optimizer,step_size=7,gamma=0.1) \n#StepLR: function helps in dynamically changing the learningrate.","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:47.570782Z","iopub.execute_input":"2023-06-12T13:43:47.571130Z","iopub.status.idle":"2023-06-12T13:43:47.576888Z","shell.execute_reply.started":"2023-06-12T13:43:47.571097Z","shell.execute_reply":"2023-06-12T13:43:47.575921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training the model","metadata":{}},{"cell_type":"code","source":"def train_model(model,criterion,optimizer,scheduler,num_epochs=6):\n    since = time.time()\n    \n    best_model_weights = model.state_dict()\n    best_acc = 0.0\n    \n    for epoch in range(num_epochs):\n        print(\"epoch {}/{}\".format(epoch+1,num_epochs))\n        print(\"*\" * 10)\n        \n        #training and validation for each epoch\n        for x in ['training','validation']:\n            if x == 'training':\n                model.train()\n            else: \n                model.eval()\n            \n            running_loss = 0.0\n            running_corrects = 0\n            \n            #iterating over data\n            for data in dataloaders[x]:\n                # get the inputs\n                inputs, labels = data\n\n                # wrap them in Variable\n                if torch.cuda.is_available():\n                    inputs = Variable(inputs.cuda())\n                    labels = Variable(labels.cuda())\n                else:\n                    inputs, labels = Variable(inputs), Variable(labels)\n                    \n                # zero the parameter gradients\n                optimizer.zero_grad()\n                \n                # forward\n                outputs = model(inputs)\n\n                _, preds = torch.max(outputs.data, 1)\n                \n                loss = criterion(outputs, labels)\n\n                # backward + optimize only if in training phase\n                if x == 'training':\n                    loss.backward()\n                    optimizer.step()\n                    \n                \n                # statistics\n                running_loss += loss.data\n                running_corrects += torch.sum(preds == labels.data)\n                \n\n            epoch_loss = running_loss / dataset_sizes[x]\n            epoch_acc = running_corrects / dataset_sizes[x]\n            \n            print('{} Loss: {:.4f} Acc: {:.4f}'.format(x, epoch_loss, epoch_acc))\n\n            # deep copy the model\n            if x == 'validation' and epoch_acc > best_acc:\n                best_acc = epoch_acc\n                best_model_weights = model.state_dict()\n\n        print()\n\n    time_elapsed = time.time() - since\n    print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))\n    print('Best val Acc: {:4f}'.format(best_acc))\n\n    # load best model weights\n    model.load_state_dict(best_model_weights)\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:47.578311Z","iopub.execute_input":"2023-06-12T13:43:47.578943Z","iopub.status.idle":"2023-06-12T13:43:47.592439Z","shell.execute_reply.started":"2023-06-12T13:43:47.578909Z","shell.execute_reply":"2023-06-12T13:43:47.591641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = train_model(model, criterion, optimizer, exp_LR_scheduler, num_epochs=6)","metadata":{"execution":{"iopub.status.busy":"2023-06-12T13:43:47.593796Z","iopub.execute_input":"2023-06-12T13:43:47.594200Z","iopub.status.idle":"2023-06-12T13:52:05.464415Z","shell.execute_reply.started":"2023-06-12T13:43:47.594169Z","shell.execute_reply":"2023-06-12T13:52:05.462468Z"},"trusted":true},"execution_count":null,"outputs":[]}]}