{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-24T03:14:10.036617Z","iopub.execute_input":"2024-03-24T03:14:10.037090Z","iopub.status.idle":"2024-03-24T03:14:10.045313Z","shell.execute_reply.started":"2024-03-24T03:14:10.037059Z","shell.execute_reply":"2024-03-24T03:14:10.044314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Source\n   - https://github.com/tensorflow/tfjs-models/tree/master/mobilenet\n   - https://github.com/tensorflow/tfjs-models/tree/master\n   - https://github.com/Lornatang/MobileNetV1-PyTorch\n   - https://pytorch.org/hub/pytorch_vision_mobilenet_v2/\n   - https://github.com/jmjeon94/MobileNet-Pytorch\n   - https://github.com/tonylins/pytorch-mobilenet-v2","metadata":{}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.optim import lr_scheduler\nfrom torch.utils.data import DataLoader\nfrom torchvision import models, transforms, datasets\nimport zipfile\nfrom PIL import Image\nimport os\nimport random\nimport shutil\nimport zipfile\nfrom shutil import copyfile\n\n\n# with zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as zip_ref:\n#     file_list = zip_ref.namelist()\n#     random.shuffle(file_list)\n#     subset_files = file_list[:1000]  \n#     zip_ref.extractall('train_subset', subset_files)\n\n# with zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as zip_ref:\n#     file_list = zip_ref.namelist()\n#     random.shuffle(file_list)\n#     subset_files = file_list[:100]  \n#     zip_ref.extractall('test1_subset', subset_files)\n\n\n# subset of images from train.zip\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as zip_ref:\n    file_list = zip_ref.namelist()\n    random.shuffle(file_list)\n    subset_files = file_list[:1000]  # number of images as needed\n    for file in subset_files:\n        if 'dog' in file:\n            os.makedirs('train_subset/train/dog', exist_ok=True)\n            zip_ref.extract(file, 'train_subset/train/dog')\n        elif 'cat' in file:\n            os.makedirs('train_subset/train/cat', exist_ok=True)\n            zip_ref.extract(file, 'train_subset/train/cat')\n\n# subset of images from test1.zip\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as zip_ref:\n    file_list = zip_ref.namelist()\n    random.shuffle(file_list)\n    subset_files = file_list[:100]  # number of images\n    zip_ref.extractall('test1_subset', subset_files)\n    \n\n# transform for data augmentation and normalization\ndata_transforms = {\n    'train': transforms.Compose([\n        transforms.RandomResizedCrop(224),\n        transforms.RandomHorizontalFlip(),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n    ]),\n    'test': transforms.Compose([\n        transforms.Resize(256),\n        transforms.CenterCrop(224),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n    ]),\n}\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:14:10.046832Z","iopub.execute_input":"2024-03-24T03:14:10.047131Z","iopub.status.idle":"2024-03-24T03:14:25.124339Z","shell.execute_reply.started":"2024-03-24T03:14:10.047104Z","shell.execute_reply":"2024-03-24T03:14:25.123100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir = 'train_subset'  # subset directory\nimage_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x])\n                  for x in ['train']}\ndataloaders = {x: DataLoader(image_datasets[x], batch_size=4, shuffle=True, num_workers=4)\n               for x in ['train']}\ndataset_sizes = {x: len(image_datasets[x]) for x in ['train']}\nclass_names = image_datasets['train'].classes","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:14:25.126075Z","iopub.execute_input":"2024-03-24T03:14:25.126539Z","iopub.status.idle":"2024-03-24T03:14:25.142339Z","shell.execute_reply.started":"2024-03-24T03:14:25.126509Z","shell.execute_reply":"2024-03-24T03:14:25.141268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pre-trained ResNet model\nmodel_ft = models.resnet18(pretrained=True)\nnum_ftrs = model_ft.fc.in_features\n\n# We can replace this layer with different one\nmodel_ft.fc = nn.Linear(num_ftrs, 2)\n\n# Loss function and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:14:25.143464Z","iopub.execute_input":"2024-03-24T03:14:25.143718Z","iopub.status.idle":"2024-03-24T03:14:25.912335Z","shell.execute_reply.started":"2024-03-24T03:14:25.143694Z","shell.execute_reply":"2024-03-24T03:14:25.911295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train\ndef train_model(model, criterion, optimizer, num_epochs=25):\n    for epoch in range(num_epochs):\n        print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n        print('-' * 10)\n\n        model.train()\n\n        running_loss = 0.0\n        running_corrects = 0\n\n    \n        for inputs, labels in dataloaders['train']:\n            inputs = inputs.to(device)\n            labels = labels.to(device)\n\n            optimizer.zero_grad()\n\n            outputs = model(inputs)\n            _, preds = torch.max(outputs, 1)\n            loss = criterion(outputs, labels)\n\n            loss.backward()\n            optimizer.step()\n\n            running_loss += loss.item() * inputs.size(0)\n            running_corrects += torch.sum(preds == labels.data)\n\n        epoch_loss = running_loss / dataset_sizes['train']\n        epoch_acc = running_corrects.double() / dataset_sizes['train']\n\n        print('Loss: {:.4f} Acc: {:.4f}'.format(epoch_loss, epoch_acc))\n\n    return model\n\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel_ft = model_ft.to(device)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:14:25.914299Z","iopub.execute_input":"2024-03-24T03:14:25.914620Z","iopub.status.idle":"2024-03-24T03:14:26.162299Z","shell.execute_reply.started":"2024-03-24T03:14:25.914592Z","shell.execute_reply":"2024-03-24T03:14:26.161283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_ft = train_model(model_ft, criterion, optimizer_ft, num_epochs=10)\n\n# Prediction labels for test1.zip\ntest_dir = '/kaggle/working/test1_subset'\ntest_dataset = datasets.ImageFolder(test_dir, data_transforms['test'])\ntest_loader = DataLoader(test_dataset, batch_size=4, shuffle=False, num_workers=4)\n\nmodel_ft.eval()\npredictions = []\n\nwith torch.no_grad():\n    for inputs, _ in test_loader:\n        inputs = inputs.to(device)\n        outputs = model_ft(inputs)\n        _, preds = torch.max(outputs, 1)\n        predictions.extend(preds.cpu().numpy())\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:16:13.617248Z","iopub.execute_input":"2024-03-24T03:16:13.618189Z","iopub.status.idle":"2024-03-24T03:17:06.434921Z","shell.execute_reply.started":"2024-03-24T03:16:13.618138Z","shell.execute_reply":"2024-03-24T03:17:06.433865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for pred in predictions:\n    print(pred.item())","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:17:10.862382Z","iopub.execute_input":"2024-03-24T03:17:10.862957Z","iopub.status.idle":"2024-03-24T03:17:10.870528Z","shell.execute_reply.started":"2024-03-24T03:17:10.862918Z","shell.execute_reply":"2024-03-24T03:17:10.869322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import csv\n\ntest_dir = 'test1_subset'  # subset directory\ntest_dataset = datasets.ImageFolder(test_dir, data_transforms['test'])\ntest_loader = DataLoader(test_dataset, batch_size=1, shuffle=False, num_workers=1)\n\nmodel_ft.eval()\npredictions = []\n\nwith torch.no_grad():\n    for inputs, _ in test_loader:\n        inputs = inputs.to(device)\n        outputs = model_ft(inputs)\n        _, preds = torch.max(outputs, 1)\n        predictions.extend(preds.cpu().numpy())\n\nsubmission_file = 'submission.csv'\nwith open(submission_file, mode='w', newline='') as file:\n    writer = csv.writer(file)\n    writer.writerow(['id', 'label'])\n    for i, filename in enumerate(test_dataset.samples):\n        image_id = os.path.basename(filename[0]).split('.')[0]\n        writer.writerow([str(image_id), predictions[i]])\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T03:23:45.837323Z","iopub.execute_input":"2024-03-24T03:23:45.837707Z","iopub.status.idle":"2024-03-24T03:23:46.531583Z","shell.execute_reply.started":"2024-03-24T03:23:45.837678Z","shell.execute_reply":"2024-03-24T03:23:46.530500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader\nfrom torchvision import models, transforms, datasets\nimport zipfile\nimport os\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as zip_ref:\n    zip_ref.extractall('train')\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as zip_ref:\n    zip_ref.extractall('test1')\n\n# data transformations\ndata_transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\ntrain_dataset = datasets.ImageFolder('train', transform=data_transform)\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n\n# CNN model\nclass SimpleCNN(nn.Module):\n    def __init__(self):\n        super(SimpleCNN, self).__init__()\n        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=2, padding=1)\n        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1)\n        self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1)\n        self.fc1 = nn.Linear(64*28*28, 512)\n        self.fc2 = nn.Linear(512, 2)\n\n    def forward(self, x):\n        x = nn.functional.relu(self.conv1(x))\n        x = nn.functional.relu(self.conv2(x))\n        x = nn.functional.relu(self.conv3(x))\n        x = x.view(-1, 64*28*28)\n        x = nn.functional.relu(self.fc1(x))\n        x = self.fc2(x)\n        return x\n\n# Initialization - model, loss function, and optimizer\nmodel = SimpleCNN().to(device)\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n\n# Training\nnum_epochs = 10\nfor epoch in range(num_epochs):\n    running_loss = 0.0\n    for i, data in enumerate(train_loader, 0):\n        inputs, labels = data[0].to(device), data[1].to(device)\n\n        optimizer.zero_grad()\n\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n        if i % 100 == 99:\n            print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 100}')\n            running_loss = 0.0\n\nprint('Finished Training')\n\n\n# Prediction of labels for test1_subset\ntest_dir = 'test1_subset'  \ntest_dataset = datasets.ImageFolder(test_dir, data_transforms['test'])\ntest_loader = DataLoader(test_dataset, batch_size=1, shuffle=False, num_workers=1)\n\nmodel_ft.eval()\npredictions = []\n\nwith torch.no_grad():\n    for inputs, _ in test_loader:\n        inputs = inputs.to(device)\n        outputs = model_ft(inputs)\n        _, preds = torch.max(outputs, 1)\n        predictions.extend(preds.cpu().numpy())\n\nsubmission_file = 'submission.csv'\nwith open(submission_file, mode='w', newline='') as f:\n    f.write('id,label\\n')\n    for i, (image, _) in enumerate(test_dataset.samples):\n        image_id = os.path.splitext(os.path.basename(str(image)))[0]\n        f.write(f'{image_id},{predictions[i]}\\n')\n\nprint('Predictions saved to predictions.csv')\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T04:04:48.710924Z","iopub.execute_input":"2024-03-24T04:04:48.711300Z","iopub.status.idle":"2024-03-24T04:22:35.984851Z","shell.execute_reply.started":"2024-03-24T04:04:48.711268Z","shell.execute_reply":"2024-03-24T04:22:35.983716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models, transforms, datasets\nimport zipfile\nimport os\nimport random\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as zip_ref:\n    file_list = zip_ref.namelist()\n    random.shuffle(file_list)\n    subset_files = file_list[:1000]  \n    for file in subset_files:\n        if 'dog' in file:\n            os.makedirs('train_subset/train/dog', exist_ok=True)\n            zip_ref.extract(file, 'train_subset/train/dog')\n        elif 'cat' in file:\n            os.makedirs('train_subset/train/cat', exist_ok=True)\n            zip_ref.extract(file, 'train_subset/train/cat')\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as zip_ref:\n    file_list = zip_ref.namelist()\n    random.shuffle(file_list)\n    subset_files = file_list[:100]  \n    zip_ref.extractall('test1_subset', subset_files)\n\ndata_transforms = transforms.Compose([\n    transforms.Resize(256),\n    transforms.CenterCrop(224),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\ndata_dir = 'train_subset'\nimage_dataset = datasets.ImageFolder(data_dir, transform=data_transforms)\n\ndata_loader = torch.utils.data.DataLoader(image_dataset, batch_size=4, shuffle=True)\n\n# MobileNet model\nmodel = models.mobilenet_v2(pretrained=True)\n\n# Freezed model parameters\nfor param in model.parameters():\n    param.requires_grad = False\n\n# We can modify this last fully connected layer for binary classification\nnum_features = model.classifier[1].in_features\nmodel.classifier[1] = nn.Linear(num_features, 2)  # 2 output classes: dog and cat\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n\nmodel.train()\n\nfor epoch in range(5):  \n    running_loss = 0.0\n    for inputs, labels in data_loader:\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item() * inputs.size(0)\n    epoch_loss = running_loss / len(image_dataset)\n    print(f\"Epoch {epoch+1}/{5}, Loss: {epoch_loss:.4f}\")\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T04:44:24.997224Z","iopub.execute_input":"2024-03-24T04:44:24.997618Z","iopub.status.idle":"2024-03-24T04:50:51.512223Z","shell.execute_reply.started":"2024-03-24T04:44:24.997588Z","shell.execute_reply":"2024-03-24T04:50:51.510205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(model.state_dict(), 'mobilenet_model.pth')","metadata":{"execution":{"iopub.status.busy":"2024-03-24T04:56:52.577973Z","iopub.execute_input":"2024-03-24T04:56:52.578745Z","iopub.status.idle":"2024-03-24T04:56:52.616508Z","shell.execute_reply.started":"2024-03-24T04:56:52.578709Z","shell.execute_reply":"2024-03-24T04:56:52.615578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# inference on test dataset\n\nimport torch\nimport torchvision.transforms as transforms\nfrom torchvision import models, datasets\nimport csv\nimport os\n\nmodel = models.mobilenet_v2(pretrained=False)\nnum_features = model.classifier[1].in_features\nmodel.classifier[1] = torch.nn.Linear(num_features, 2)  # 2 output classes: dog and cat\nmodel.load_state_dict(torch.load('mobilenet_model.pth'))  # Loading trained model state dict\nmodel.eval()  # Set the model to evaluation mode\n\ndata_transforms = transforms.Compose([\n    transforms.Resize(256),\n    transforms.CenterCrop(224),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\ntest_dataset = datasets.ImageFolder('test1', transform=data_transforms)\n\ntest_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False)\n\n# inference on the test dataset\nsubmission_file = 'submission2.csv'\nwith open(submission_file, mode='w', newline='') as f:\n    writer = csv.writer(f)\n    writer.writerow(['id', 'label'])\n    with torch.no_grad():\n        for inputs, _ in test_loader:\n            outputs = model(inputs)\n            _, predicted = torch.max(outputs, 1)\n            image_id = os.path.basename(test_loader.dataset.samples[test_loader.batch_sampler.batch_size][0]).split('.')[0]\n            writer.writerow([image_id, predicted.item()])\n\nprint('Submission file created successfully.')\n","metadata":{"execution":{"iopub.status.busy":"2024-03-24T05:00:35.253285Z","iopub.execute_input":"2024-03-24T05:00:35.254009Z","iopub.status.idle":"2024-03-24T05:06:57.587617Z","shell.execute_reply.started":"2024-03-24T05:00:35.253973Z","shell.execute_reply":"2024-03-24T05:06:57.585993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}