{"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 numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport torch\nimport cv2\nfrom matplotlib import pyplot as plt \nimport matplotlib.image as mpimg\n\nimport glob\nimport random\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-08T10:09:55.018987Z","iopub.execute_input":"2023-10-08T10:09:55.019221Z","iopub.status.idle":"2023-10-08T10:09:58.247832Z","shell.execute_reply.started":"2023-10-08T10:09:55.019200Z","shell.execute_reply":"2023-10-08T10:09:58.246925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_dir = '/kaggle/input/dog-breed-identification/train'\nlabels_dir = '/kaggle/input/dog-breed-identification/labels.csv'\n\nclasses =  pd.read_csv(labels_dir)['breed'].unique()\nclass_to_idx = {class_name: idx for idx, class_name in enumerate(classes)}\n#","metadata":{"execution":{"iopub.status.busy":"2023-10-08T10:09:58.249441Z","iopub.execute_input":"2023-10-08T10:09:58.250117Z","iopub.status.idle":"2023-10-08T10:09:58.303489Z","shell.execute_reply.started":"2023-10-08T10:09:58.250086Z","shell.execute_reply":"2023-10-08T10:09:58.302661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom torchvision.io import read_image\nfrom torch.utils.data import Dataset\nimport torchvision.transforms as T\nimport torchvision.transforms as transforms\n\n\nclass CustomImageDataset(Dataset):\n    def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):\n        self.img_labels = pd.read_csv(annotations_file)\n        self.img_dir = img_dir\n        self.transform = transform\n        self.target_transform = target_transform\n\n    def __len__(self):\n        return len(self.img_labels)\n\n    def __getitem__(self, idx):\n        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0]) +'.jpg'\n        image = read_image(img_path)\n        label = self.img_labels.iloc[idx, 1]\n        if self.transform:\n            image = self.transform(image)\n        if self.target_transform:\n            label = self.target_transform(label)\n        return image.to(torch.float32), class_to_idx[label]\n    \n    \ntrain_transform = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomVerticalFlip(),\n    transforms.RandomRotation(30),\n    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),\n    transforms.Resize((224, 224)),\n    transforms.GaussianBlur(kernel_size=5),  # Apply Gaussian blur\n    transforms.Lambda(lambda x: x.float()),  # Convert to FloatTensor\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n\n])\n\nval_transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.Lambda(lambda x: x.float()),  # Convert to FloatTensor\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n\n\ntraining_data = CustomImageDataset(labels_dir,image_dir, train_transform)\nfrom torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(training_data, batch_size=16, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T10:09:58.304669Z","iopub.execute_input":"2023-10-08T10:09:58.305193Z","iopub.status.idle":"2023-10-08T10:09:58.579410Z","shell.execute_reply.started":"2023-10-08T10:09:58.305163Z","shell.execute_reply":"2023-10-08T10:09:58.578541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nfrom torchvision.models import efficientnet_b0\n\n# Load the EfficientNet-B0 model\nmodel = efficientnet_b0(pretrained=True)\n\n# Freeze all parameters in the pre-trained layers\nfor param in model.parameters():\n    param.requires_grad = False\n\n# Modify the output layer for your specific problem\nmodel.classifier[1] = torch.nn.Linear(in_features=model.classifier[1].in_features, out_features=120)\n\n# Set the requires_grad flag to True for the modified output layer\nmodel.classifier[1].requires_grad = True\n\n# Move the model to the GPU if available\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel.to(device)\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T10:09:58.581473Z","iopub.execute_input":"2023-10-08T10:09:58.581773Z","iopub.status.idle":"2023-10-08T10:09:58.898774Z","shell.execute_reply.started":"2023-10-08T10:09:58.581745Z","shell.execute_reply":"2023-10-08T10:09:58.897887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torchvision.models as models\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader\nimport time\n\n\n\ncriterion = nn.CrossEntropyLoss()  \n# Define hyperparameters\nlearning_rate = 0.001\nweight_decay = 1e-4\nbetas = (0.9, 0.999)\nepsilon = 1e-8\n\noptimizer = torch.optim.AdamW(\n    model.parameters(),\n    lr=learning_rate,\n    betas=betas,\n    weight_decay=weight_decay\n)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel.to(device)\n\n# Training loop\nnum_epochs = 5\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n    before = time.time()\n    for inputs, labels in train_loader:\n        inputs, labels = inputs.to(device), labels.to(device)\n\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        running_loss += loss.item()\n        loss.backward()\n        optimizer.step()\n\n\n    after = time.time()\n    print(f\"Epoch {epoch+1}/{num_epochs} . Time elapsed = {after-before:.1f} seconds Running Loss: {running_loss/len(train_loader):.4f}\")\n\n    \nsave_path = '/kaggle/working/mobilenet.pth'  # Use /kaggle/working/ to save in the Kaggle working directory\ntorch.save(model.state_dict(), save_path)","metadata":{"execution":{"iopub.status.busy":"2023-10-08T10:09:58.927933Z","iopub.execute_input":"2023-10-08T10:09:58.928439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}