{"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"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport torch\nfrom torch import nn\nfrom torch.utils.data import Dataset, DataLoader, random_split\nfrom PIL import Image\nfrom torch.nn import functional as F\nimport torchvision\nfrom torchvision import datasets, transforms\nimport pandas as pd\nfrom torch.optim.lr_scheduler import StepLR\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm  # Import tqdm for progress bar\n!pip install py7zr # you need this\nimport py7zr\nfrom io import BytesIO ## this too\nimport os\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define device (GPU/CPU)\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = nn.Sequential(\n    # Conv2d( in_channels, out_channels, kernel_size) B,3,32,32\n    nn.Conv2d(3, 64, 3, stride= 1, padding=1),  nn.BatchNorm2d(64), nn.LeakyReLU(0.1) , nn.MaxPool2d(2, 2), # B,32,16,16\n    nn.Conv2d(64, 128, 3, stride= 1, padding=1), nn.BatchNorm2d(128), nn.LeakyReLU(0.1), nn.MaxPool2d(2, 2), # B,32,8,8\n    nn.Conv2d(128, 256, 3, stride= 1, padding=1), nn.BatchNorm2d(256), nn.LeakyReLU(0.1), nn.MaxPool2d(2, 2), # B,32,4,4\n    nn.Conv2d(256, 512, 3, stride= 1, padding=1 ), nn.BatchNorm2d(512), nn.LeakyReLU(0.1),\n    nn.AdaptiveAvgPool2d(1), ##like in ResNET\n    nn.Flatten(),\n    nn.Linear(512, 512), nn.BatchNorm1d(512), nn.LeakyReLU(0.1),\n    nn.Linear(512, 10)\n)\n\noptim = torch.optim.Adam(model.parameters(), lr=0.0003, weight_decay=0.0005)\nscheduler = StepLR(optim, step_size=10, gamma=0.5)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define transformations\ntransform_train = transforms.Compose([\n    transforms.RandomHorizontalFlip(0.5),\n    transforms.RandomRotation(15),\n    transforms.ColorJitter(0.1, 0.1, 0.1),\n    transforms.RandomCrop(32, padding=4),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616)),\n    transforms.RandomErasing(p=0.5,scale=(0.02, 0.1),value=1.0, inplace=False),\n])\n\ntransform_test = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616))\n])\n\nbatch_size=64","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Train with the good old torchvision set\n\ncifar10 = torchvision.datasets.CIFAR10(root='./data', download=True, train=True, transform=transform_train)\ncifar10_test = torchvision.datasets.CIFAR10(root='./data', download=True, train=False, transform=transform_test)\n\nbatch_size = 64 ## increase\nn = batch_size\ndataloader = DataLoader(cifar10, batch_size=batch_size, shuffle=True, num_workers=2)\ndataloader_test = DataLoader(cifar10_test, batch_size=batch_size, shuffle=False, num_workers=2) ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## xavier init\ndef init_weights_xavier(m):\n    if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear):\n        nn.init.xavier_normal_(m.weight)  # Apply Xavier normal initialization\n        if m.bias is not None:\n            nn.init.constant_(m.bias, 0)\n    elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d):\n        nn.init.constant_(m.weight, 1)\n        nn.init.constant_(m.bias, 0)\n\nmodel.apply(init_weights_xavier)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nlosses = []\nsteps = []\nlosses_t = []","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for epoch in range(32):\n    for batch in dataloader:\n        i +=1\n        x = batch[0].to('cuda')\n        y = batch[1].to('cuda')\n        model = model.to('cuda')\n\n        logits = model(x)\n        loss = F.cross_entropy(logits,y)\n        optim.zero_grad()\n\n        loss.backward()\n        optim.step()\n\n        losses.append(loss.item())\n        losses_t.append(loss.detach())\n        steps.append(i)\n\n        if i % 1000 == 0:\n            print(loss)\n    scheduler.step()\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(steps, losses)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_correct = 0\ntotal_predictions = 0\n\n# Loop over training dataset\nfor x_batch, y_batch in dataloader:\n    logits = model(x_batch.to(\"cuda\")) # Forward pass on the mini-batch\n    loss = F.cross_entropy(logits.cpu(), y_batch) # Compute loss\n\n    # Calculate predictions for the batch\n    pred_labels = torch.max(logits, dim=1).indices\n\n    # Update total correct predictions and total predictions\n    total_correct += (y_batch == pred_labels.cpu()).sum().item()\n    total_predictions += y_batch.size(0)\n\n# Calculate overall accuracy\noverall_accuracy = total_correct / total_predictions\nprint(f\"Training Accuracy: {overall_accuracy}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_correct = 0\ntotal_predictions = 0\n\n# Loop over testing dataset\nfor x_batch, y_batch in dataloader_test:\n    logits = model(x_batch.to(\"cuda\")) # Forward pass on the mini-batch\n    loss = F.cross_entropy(logits.cpu(), y_batch) # Compute loss\n\n    # Calculate predictions for the batch\n    pred_labels = torch.max(logits, dim=1).indices\n\n    # Update total correct predictions and total predictions\n    total_correct += (y_batch == pred_labels.cpu()).sum().item()\n    total_predictions += y_batch.size(0)\n\n# Calculate overall accuracy and print it out.\noverall_accuracy = total_correct / total_predictions\n#DON'T FORGET TO PRINT OUT YOUR TESTING ACCURACY\nprint(f\"Testing Accuracy: {overall_accuracy}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create submission file with predictions for test images from .7z archive\ntest_filenames = []\ntest_images = []\n\nwith py7zr.SevenZipFile('/kaggle/input/cifar-10/test.7z', mode='r') as z:\n    for name, file in z.readall().items():\n        if name.endswith('.png'):\n            img = Image.open(BytesIO(file.read()))\n            test_images.append(transform_test(img))\n            test_filenames.append(name)\n\ntest_images = torch.stack(test_images)\ntest_loader = DataLoader(test_images, batch_size=batch_size, shuffle=False)\n\n# Prediction and CSV creation\nclasses = ('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\n\nresult = []\nwith torch.no_grad():\n    model.eval()\n    for inputs in tqdm(test_loader):\n        inputs = inputs.to(device)\n        outputs = model(inputs)\n        _, predicted = outputs.max(1)\n        result.extend(predicted.cpu().numpy())\n\n# Create submission DataFrame\nsubmission_df = pd.DataFrame({\n    'id': [os.path.basename(f).replace('.png', '') for f in test_filenames],  # Remove .png from filenames\n    'label': [classes[label] for label in result]\n})\n\n# Save submission file\nsubmission_df.to_csv('/kaggle/working/submission.csv', index=False)\n\nprint(\"Submission file created successfully!\")","metadata":{},"execution_count":null,"outputs":[]}]}