{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision\nimport torchvision.transforms as transforms\nimport timm\n\n# إعداد الجهاز\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Device:\", device)\n\nbatch_size = 128\nnum_epochs = 200   # زيديها لـ 300 لو تبغي أعلى دقّة\nlr = 0.1","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-24T02:42:51.413475Z","iopub.execute_input":"2025-09-24T02:42:51.413652Z","iopub.status.idle":"2025-09-24T02:43:05.724037Z","shell.execute_reply.started":"2025-09-24T02:42:51.413634Z","shell.execute_reply":"2025-09-24T02:43:05.723168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform_train = transforms.Compose([\n    transforms.RandomCrop(32, padding=4),\n    transforms.RandomHorizontalFlip(),\n    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465),\n                         (0.2023, 0.1994, 0.2010)),\n])\n\ntransform_test = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465),\n                         (0.2023, 0.1994, 0.2010)),\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T02:43:05.72603Z","iopub.execute_input":"2025-09-24T02:43:05.726329Z","iopub.status.idle":"2025-09-24T02:43:05.732085Z","shell.execute_reply.started":"2025-09-24T02:43:05.726302Z","shell.execute_reply":"2025-09-24T02:43:05.731124Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainset = torchvision.datasets.CIFAR10(root=\"./data\", train=True,\n                                        download=True, transform=transform_train)\ntrainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,\n                                          shuffle=True, num_workers=2)\n\ntestset = torchvision.datasets.CIFAR10(root=\"./data\", train=False,\n                                       download=True, transform=transform_test)\ntestloader = torch.utils.data.DataLoader(testset, batch_size=100,\n                                         shuffle=False, num_workers=2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T02:43:05.733078Z","iopub.execute_input":"2025-09-24T02:43:05.733414Z","iopub.status.idle":"2025-09-24T02:43:12.154331Z","shell.execute_reply.started":"2025-09-24T02:43:05.733388Z","shell.execute_reply":"2025-09-24T02:43:12.15373Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# WideResNet-50-2\nmodel = timm.create_model(\"wide_resnet50_2\", pretrained=False, num_classes=10)\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model.parameters(), lr=lr,\n                      momentum=0.9, weight_decay=5e-4)\nscheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T02:43:12.155024Z","iopub.execute_input":"2025-09-24T02:43:12.155244Z","iopub.status.idle":"2025-09-24T02:43:13.452897Z","shell.execute_reply.started":"2025-09-24T02:43:12.155225Z","shell.execute_reply":"2025-09-24T02:43:13.452246Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_one_epoch(epoch):\n    model.train()\n    running_loss, correct, total = 0.0, 0, 0\n    for inputs, targets in trainloader:\n        inputs, targets = inputs.to(device), targets.to(device)\n\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, targets)\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n        _, predicted = outputs.max(1)\n        total += targets.size(0)\n        correct += predicted.eq(targets).sum().item()\n\n    acc = 100. * correct / total\n    print(f\"Epoch {epoch+1} Train Loss: {running_loss/len(trainloader):.3f}, Acc: {acc:.2f}%\")\n\n\ndef test():\n    model.eval()\n    correct, total = 0, 0\n    with torch.no_grad():\n        for inputs, targets in testloader:\n            inputs, targets = inputs.to(device), targets.to(device)\n            outputs = model(inputs)\n            _, predicted = outputs.max(1)\n            total += targets.size(0)\n            correct += predicted.eq(targets).sum().item()\n    acc = 100. * correct / total\n    return acc","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T02:43:13.453593Z","iopub.execute_input":"2025-09-24T02:43:13.453819Z","iopub.status.idle":"2025-09-24T02:43:13.461405Z","shell.execute_reply.started":"2025-09-24T02:43:13.4538Z","shell.execute_reply":"2025-09-24T02:43:13.460489Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"best_acc = 0\nfor epoch in range(num_epochs):\n    train_one_epoch(epoch)\n    acc = test()\n    scheduler.step()\n\n    print(f\"Epoch {epoch+1} Test Accuracy: {acc:.2f}%\")\n\n    if acc > best_acc:\n        best_acc = acc\n        torch.save(model.state_dict(), \"best_model.pth\")\n\nprint(\"Best Test Accuracy:\", best_acc)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T02:43:13.462146Z","iopub.execute_input":"2025-09-24T02:43:13.462372Z","iopub.status.idle":"2025-09-24T07:52:57.400525Z","shell.execute_reply.started":"2025-09-24T02:43:13.462356Z","shell.execute_reply":"2025-09-24T07:52:57.399596Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install py7zr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T07:54:58.724902Z","iopub.execute_input":"2025-09-24T07:54:58.725191Z","iopub.status.idle":"2025-09-24T07:55:04.524207Z","shell.execute_reply.started":"2025-09-24T07:54:58.725169Z","shell.execute_reply":"2025-09-24T07:55:04.523442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport py7zr\n\nzip_path = \"/kaggle/input/cifar-10/test.7z\"\nout_dir = \"/kaggle/working/cifar-10/test\"\n\nos.makedirs(out_dir, exist_ok=True)\n\nif not os.listdir(out_dir):  # إذا المجلد فاضي\n    with py7zr.SevenZipFile(zip_path, mode='r') as archive:\n        archive.extractall(path=out_dir)\n    print(\"تم فك الضغط!\")\nelse:\n    print(\"الملفات موجودة مسبقًا.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T07:55:07.622813Z","iopub.execute_input":"2025-09-24T07:55:07.62317Z","iopub.status.idle":"2025-09-24T07:57:10.180067Z","shell.execute_reply.started":"2025-09-24T07:55:07.623134Z","shell.execute_reply":"2025-09-24T07:57:10.179401Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nimport pandas as pd\n\n# مجلد الصور\ntest_dir = \"/kaggle/working/cifar-10/test/test\"\n\n# نفس التحويلات اللي استعملتها في التدريب\ntransform = transforms.Compose([\n    transforms.Resize((32, 32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,), (0.5,))\n])\n\n# داتا كلاس مخصص للـ test\nclass TestDataset(Dataset):\n    def __init__(self, img_dir, transform=None):\n        self.img_dir = img_dir\n        self.files = sorted(os.listdir(img_dir))\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.files)\n\n    def __getitem__(self, idx):\n        img_name = self.files[idx]\n        img_path = os.path.join(self.img_dir, img_name)\n        image = Image.open(img_path).convert(\"RGB\")\n        if self.transform:\n            image = self.transform(image)\n        return image, img_name\n\n# تحميل test dataset\ntest_dataset = TestDataset(test_dir, transform=transform)\ntest_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n\n# التوقعات\nmodel.eval()\npreds, ids = [], []\n\nwith torch.no_grad():\n    for images, names in test_loader:\n        images = images.to(device)\n        outputs = model(images)\n        _, predicted = outputs.max(1)\n\n        preds.extend(predicted.cpu().numpy())\n        ids.extend(names)\n\n# CIFAR-10 classes (حسب ترتيب التدريب)\nclasses = ['airplane','automobile','bird','cat','deer',\n           'dog','frog','horse','ship','truck']\n\nlabels = [classes[p] for p in preds]\n\n# إنشاء submission.csv\nsubmission = pd.DataFrame({\n    \"id\": ids,\n    \"label\": labels\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)\nprint(\"✅ submission.csv جاهز!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-24T08:04:14.358987Z","iopub.execute_input":"2025-09-24T08:04:14.359246Z","iopub.status.idle":"2025-09-24T08:08:04.256091Z","shell.execute_reply.started":"2025-09-24T08:04:14.359229Z","shell.execute_reply":"2025-09-24T08:08:04.255236Z"}},"outputs":[],"execution_count":null}]}