{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"provenance":[]}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Демо-экзамен по курсу \"Прикладной анализ данных\". Вариант 3","metadata":{"id":"oRZ0_j6j15_y"}},{"cell_type":"markdown","source":"Выполнил:\n","metadata":{"id":"p68sJ64_2A4F"}},{"cell_type":"markdown","source":"Вставьте ниже скриншот с результатом вашего решения в Leaderboard на Kaggle: https://www.kaggle.com/competitions/butterflies-classification\n\n*Пример ниже:*","metadata":{"id":"gefqprYI2HP0"}},{"cell_type":"markdown","source":"![изображение.png](attachment:2e8bf2b6-25f8-4e2a-a2e8-3319820dc54e.png)","metadata":{},"attachments":{"2e8bf2b6-25f8-4e2a-a2e8-3319820dc54e.png":{"image/png":"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Ufswh4oyNmRsNzdUKF/B7wj+OdvWGtaZ6danp8+cxtAhQ5EwQQI1GY6ModmoUSO1TWDCTVknrR+bt2ihWrJ+SLgpXeSLFyuGTp081Izjo0aNQo6cOZE3Tx61Xl5ny55d7VvK169fP9Vd3D1/frXefAzpWl+3Xj3VWrJly5bYtXOnETQOHToEf/yxQk2cNGLECCRIkMBpuLlr927s37cPAzwHIHmy5Bg+YgTWb9igJgGyK7M53BR294W1nmToA1kvrVEdXT8iIiIiIiIi+vIw3LTHcPMzh5vSIm/MmDFIkSKluiCPHz3CqNGjjBnIRePGTVC3Xl0VBooD+w8Y40Oq16bgUFoDSqvABQsWGN2szZxtK2Fd4cKFjW2FOayUFoKtWrZClKhR1esLF86jRYsWRktO2beZt7e3EbRZg08Z61PGr/yQcNNaZ9IN3tzF27peZncfMWK4Uaf6GJq8f+26dcZM5OagUQLgFMmSq4mFrGWzhpvW62Tulm4tk7XM1nDTur31vrCWRbZfvHiJGlKA4SYRERERERHRfwPDTXsMN4Mp3AwKWbJkwZEjR4zX5LxOJPCLESOmv4l9goN0Qb9//54R+lo5KzMRERERERERkcZw0x7DzS8o3CQiIiIiIiIioq8Hw017DDcZbhIRERERERERkQtiuGmP4SbDTSIiIiIiIiIickEMN+0x3GS4SURERERERERELojhpj2Gmww3iYiIiIiIiIjIBTHctMdwk+EmERERERERERG5IIab9hhuMtwkIiIiIiIiIiIXxHDTHsNNhptEREREREREROSCGG7aY7jJcJOIiIiIiIiIiFwQw017DDcZbhIRERERERERkQtiuGmP4SbDTSIiIiIiIiIickEMN+0x3GS4SURERERERERELojhpj2Gmww3iYiIiIiIiIjIBTHctMdwk+EmERERERERERG5IIab9hhuMtwkIiIiIiIiIiIXxHDTHsNNhptEREREREREROSCGG7aY7jJcJOIiIiIiIiIiFwQw017DDcZbhIRERERERERkQtiuGmP4SbDTSIiIiIiIiIickEMN+0x3GS4SURERERERERELojhpj2Gmww3iYiIiIiIiIjIBTHctMdwk+EmERERERERERG5IIab9hhuuli4GTJ6WEQsEQ/hMkVDqNjhECJ8KONi/fPiDd7ceYmXRx/i2bqbePvA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tMdwk+EmERERERERERG5IIab9hhuMtwkIiIiIiIiIiIXxHDTHsNNhptEREREREREROSCGG7aY7jJcJOIiIiIiIiIiFwQw017DDcZbhIRERERERERkQtiuGmP4SbDTSIiIiIiIiIickEMN+0x3GS4SURERERERERELojhpj2Gmww3iYiIiIiIiIjIBTHctMdwk+EmERERERERERG5IIab9hhuMtwkIiIiIiIiIiIXxHDTHsNNhptEREREREREROSCGG7aY7jJcJOIiIiIiIiIiFwQw017DDcZbhIRERERERERkQtiuGmP4SbDTSIiIiIiIiIickEMN+0x3GS4SURERERERERELojhpj2Gmww3iYiIiIiIiIjIBTHctMdwk+EmERERERERERG5IIab9hhuMtwkIiIiIiIiIiIXxHDTHsNNhptEREREREREROSCGG7aY7jJcJOIiIiIiIiIiFwQw017DDcZbhIRERERERERkQtiuGmP4SbDTSIiIiIiIiIickEMN+0x3GS4SURERERERERELojhpj2Gmww3iYiIiIiIiIjIBTHctMdw08XCzfgJEiJjxoxInToNEiZKhFhusRAhQkTjghHR1+f582fwvuuNa1ev4uzZMzh27BhuXL/29VUEERERERHRV4bhpj2Gmy4SbuYvUAAFCxWGW6zYOPrXEZw5cxpXrlzG3Tt38OzZM+OCEdHXJ2LEiHCLHRuJEydBmjRpkSlzFtz1voOtWzZjx7ZtX1+FEBERERERfSUYbtpjuPmZw83vcuREpR8q4/79e/hz40YcPnTQuDhERAHJmi07vi9aFDFixMTS35fgwP59xjoiIiIiIiL6b2C4aY/h5mcMN+vWb4A0adNi0YIFDDWJ6INIyFm1enWcOX0aM6dPM5YTERERERHRl4/hpj2Gm58h3JSWVr+2aIHrV69hxvSpxsUgIvpQ9eo3RIJECTF+zBjVEpyIiIiIiIi+fAw37THcDOZwU4LN9h09sHfvbvyxbJlxIYiIPlb5ihWRK1ceDB08iAEnERERERHRfwDDTXsMN4M53Ozaoyf+PvoXg00i+iQk4Pw2U2b079PbWEZERERERERfJoab9hhuBmO4KWNshkAIdkUnok9Kuqj/g384BicREREREdEXjuGmPYabwRRuyqzoP1Spgi4eHY3KJyL6VAYMGozfFy/mLOpERERE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"}}},{"cell_type":"markdown","source":"## 1. Провести предварительное исследование данных\n\n- сколько у вас есть изображений? Все ли они одного разрешения? Какой баланс классов в данных?\n- какие есть особенности датасета?\n- если необходимо произвести очистку и предварительную обработку данных.","metadata":{"id":"gOLWe4Df3KpZ"}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nfrom pathlib import Path\nimport seaborn as sns\n\nBASE = \"/kaggle/input/competitions/butterflies-classification\"\nTRAIN_DIR = Path(BASE) / \"train_butterflies\" / \"train_split\"\nTEST_DIR = Path(BASE) / \"test_butterflies\" / \"valid\"\n\nclasses = sorted([d.name for d in TRAIN_DIR.iterdir() if d.is_dir()])\n## 1. how much images\nclass_counts = {}\nfor cls in classes:\n    cls_path = TRAIN_DIR / cls\n    images = list(cls_path.glob(\"*.jpg\")) + list(cls_path.glob(\"*.png\"))\n    class_counts[cls] = len(images)\n\ntotal_train = sum(class_counts.values())\nprint(f\"Всего тренировочных изображений: {total_train}\")\n\ntest_images = list(TEST_DIR.glob(\"*.jpg\")) + list(TEST_DIR.glob(\"*.png\"))\nprint(f\"Всего тестовых изображений: {len(test_images)}\")\n\n## 1.2. sizes of images\nsample_images = []\nfor cls in classes:  # возьмем первые 5 классов для примера\n    cls_path = TRAIN_DIR / cls\n    for img_path in list(cls_path.glob(\"*.jpg\"))[:20]:\n        sample_images.append(img_path)\n\nsizes = []\nfor img_path in sample_images:\n    with Image.open(img_path) as img:\n        sizes.append(img.size)  # (width, height)\n\nunique_sizes = set(sizes)\nprint(f\"Уникальных разрешений среди выборки: {len(unique_sizes)}\")\n","metadata":{"id":"RvTy75-y3ljg","trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:29:38.124471Z","iopub.execute_input":"2026-07-18T21:29:38.125595Z","iopub.status.idle":"2026-07-18T21:29:39.577034Z","shell.execute_reply.started":"2026-07-18T21:29:38.125561Z","shell.execute_reply":"2026-07-18T21:29:39.576143Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(14, 6))\nplt.bar(class_counts.keys(), class_counts.values())\nplt.xticks(rotation=40)\n#plt.xlabel(\"classes\")\nplt.ylabel(\"amount\")\nplt.title(\"class balance\")\nplt.tight_layout()\nplt.style.use('dark_background')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:29:39.578344Z","iopub.execute_input":"2026-07-18T21:29:39.578718Z","iopub.status.idle":"2026-07-18T21:29:40.038701Z","shell.execute_reply.started":"2026-07-18T21:29:39.578651Z","shell.execute_reply":"2026-07-18T21:29:40.037964Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_counts = pd.DataFrame(list(class_counts.items()), columns=[\"Class\", \"Count\"])\nprint(f\"min: {df_counts['Count'].min()}, max: {df_counts['Count'].max()}\")\nprint(f\"avg: {df_counts['Count'].mean():.1f}, med: {df_counts['Count'].median()}\")\nprint(f\"std: {df_counts['Count'].std():.1f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:29:40.039724Z","iopub.execute_input":"2026-07-18T21:29:40.040016Z","iopub.status.idle":"2026-07-18T21:29:40.063217Z","shell.execute_reply.started":"2026-07-18T21:29:40.039985Z","shell.execute_reply":"2026-07-18T21:29:40.062137Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# checking fro empty files\ncorrupted = []\nfor cls in classes:\n    cls_path = TRAIN_DIR / cls\n    for img_path in list(cls_path.glob(\"*.jpg\")) + list(cls_path.glob(\"*.png\")):\n        try:\n            with Image.open(img_path) as img:\n                img.verify()\n        except Exception as e:\n            corrupted.append(img_path)\nprint(f\"Битых/нечитаемых файлов: {len(corrupted)}\")\n\n# checking for not a jpg\nall_extensions = set()\nfor cls in classes:\n    cls_path = TRAIN_DIR / cls\n    for f in cls_path.iterdir():\n        all_extensions.add(f.suffix.lower())\nprint(f\"Расширения файлов в тренировочных данных: {all_extensions}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:29:40.065330Z","iopub.execute_input":"2026-07-18T21:29:40.066164Z","iopub.status.idle":"2026-07-18T21:30:22.841426Z","shell.execute_reply.started":"2026-07-18T21:29:40.066136Z","shell.execute_reply":"2026-07-18T21:30:22.840702Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Подготовить данные для обучения","metadata":{"id":"8Y7alZSf3rAC"}},{"cell_type":"markdown","source":"- Создать тренировочную и тестовую подвыборки для обучения и тестирования работы моделей\n- Создать класс на фреймворке `PyTorch` для создания датасета\n- Создать `loader` для передачи данных в модель нейронной сети","metadata":{"id":"MbSx5XVa3w61"}},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader, random_split\nfrom torchvision import transforms\nfrom PIL import Image\nimport torch\n\ntrain_transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.RandomHorizontalFlip(p=0.5),\n    transforms.RandomRotation(degrees=15),\n    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\nval_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\nclass MyDataset(Dataset):\n    def __init__(self, data_dir, transform=None, is_train=True):\n        self.data_dir = data_dir\n        self.transform = transform\n        self.is_train = is_train\n        self.images = []\n        self.labels = []\n        \n        if is_train:\n            self.classes = sorted([d.name for d in data_dir.iterdir() if d.is_dir()])\n            self.class_to_idx = {cls: idx for idx, cls in enumerate(self.classes)}\n            \n            for cls in self.classes:\n                cls_path = data_dir / cls\n                img_files = list(cls_path.glob(\"*.jpg\")) + list(cls_path.glob(\"*.png\"))\n                \n                for img_path in img_files:\n                    self.images.append(str(img_path))\n                    self.labels.append(self.class_to_idx[cls])\n        else:\n            img_files = list(data_dir.glob(\"*.jpg\")) + list(data_dir.glob(\"*.png\"))\n            \n            for img_path in img_files:\n                self.images.append(str(img_path))\n                self.labels.append(img_path.name)\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        img_path = self.images[idx]\n        image = Image.open(img_path).convert('RGB')\n        \n        if self.is_train:\n            label = self.labels[idx]\n            if self.transform:\n                image = self.transform(image)\n            return image, label\n        else:\n            img_name = self.labels[idx]\n            if self.transform:\n                image = self.transform(image)\n            return image, img_name\n\nBASE = \"/kaggle/input/competitions/butterflies-classification\"\nTRAIN_DIR = Path(BASE) / \"train_butterflies\" / \"train_split\"\nTEST_DIR = Path(BASE) / \"test_butterflies\" / \"valid\"\n\ntrain_data = MyDataset(TRAIN_DIR, transform=train_transform, is_train=True)\ntest_data = MyDataset(TEST_DIR, transform=val_transform, is_train=False)\n\ndataset_size = len(train_data)\ntrain_size = int(0.8 * dataset_size)\nval_size = dataset_size - train_size\n\nprint(f\"Размер датасета: {dataset_size}\")\nprint(f\"Тренировочная часть: {train_size}\")\nprint(f\"Валидационная часть: {val_size}\")\n\ntrain_data, valid_data = random_split(\n    train_data,\n    [train_size, val_size],\n    generator=torch.Generator().manual_seed(42)\n)\n\nvalid_data.dataset.transform = val_transform\n\nBATCH_SIZE = 32\nNUM_WORKERS = 2\n\ntrain_loader = DataLoader(\n    train_data,\n    batch_size=BATCH_SIZE,\n    shuffle=True,\n    num_workers=NUM_WORKERS,\n    pin_memory=True,\n    drop_last=False\n)\n\nvalid_loader = DataLoader(\n    valid_data,\n    batch_size=BATCH_SIZE,\n    shuffle=False,\n    num_workers=NUM_WORKERS,\n    pin_memory=True,\n    drop_last=False\n)\n\ntest_loader = DataLoader(\n    test_data,\n    batch_size=BATCH_SIZE,\n    shuffle=False,\n    num_workers=NUM_WORKERS,\n    pin_memory=True,\n    drop_last=False\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:30:22.842388Z","iopub.execute_input":"2026-07-18T21:30:22.842660Z","iopub.status.idle":"2026-07-18T21:30:23.045615Z","shell.execute_reply.started":"2026-07-18T21:30:22.842635Z","shell.execute_reply":"2026-07-18T21:30:23.044863Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Реализация модели\n\n- создать класс для модели\n- создать функцию для обучения модели\n- создать функцию для валидации модели","metadata":{"id":"MkAU6J_L4ZgK"}},{"cell_type":"code","source":"import torch.nn as nn\nimport torchvision.models as models\n\nclass RSNAModel(nn.Module):\n    def __init__(self, num_classes=50, model_name='resnet50'):\n        super(RSNAModel, self).__init__()\n        \n        if model_name == 'resnet50':\n            self.backbone = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V1)\n            in_features = self.backbone.fc.in_features\n            self.backbone.fc = nn.Sequential(\n                nn.Dropout(0.3),\n                nn.Linear(in_features, 256),\n                nn.ReLU(),\n                nn.Dropout(0.3),\n                nn.Linear(256, num_classes)\n            )\n        elif model_name == 'efficientnet':\n            self.backbone = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.IMAGENET1K_V1)\n            in_features = self.backbone.classifier[1].in_features\n            self.backbone.classifier = nn.Sequential(\n                nn.Dropout(0.3),\n                nn.Linear(in_features, num_classes)\n            )\n        elif model_name == 'densenet':\n            self.backbone = models.densenet121(weights=models.DenseNet121_Weights.IMAGENET1K_V1)\n            in_features = self.backbone.classifier.in_features\n            self.backbone.classifier = nn.Linear(in_features, num_classes)\n        \n        self.model_name = model_name\n\n    def forward(self, x):\n        return self.backbone(x)","metadata":{"id":"0foopS2P4rLh","trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:30:23.046579Z","iopub.execute_input":"2026-07-18T21:30:23.046961Z","iopub.status.idle":"2026-07-18T21:30:23.054772Z","shell.execute_reply.started":"2026-07-18T21:30:23.046936Z","shell.execute_reply":"2026-07-18T21:30:23.053770Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm import tqdm\n\ndef train_one_epoch(model, train_dataloader, optimizer, loss_fn, epoch, device, log_wandb=True, verbose=False):\n    model.train()\n    running_loss = 0.0\n    correct = 0\n    total = 0\n    \n    loop = tqdm(train_dataloader, desc=f'Epoch {epoch} Training') if verbose else train_dataloader\n    \n    for batch_idx, (images, labels) in enumerate(loop):\n        images, labels = images.to(device), labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = loss_fn(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        \n        running_loss += loss.item()\n        _, predicted = outputs.max(1)\n        total += labels.size(0)\n        correct += predicted.eq(labels).sum().item()\n        \n        if verbose and batch_idx % 50 == 0:\n            print(f'Epoch: {epoch} | Batch: {batch_idx} | Loss: {loss.item():.4f}')\n    \n    avg_loss = running_loss / len(train_dataloader)\n    accuracy = 100.0 * correct / total\n    \n    return avg_loss, accuracy\n\n@torch.no_grad()\ndef valid_one_epoch(model, valid_dataloader, loss_fn, epoch, device, log_wandb=True, verbose=False):\n    model.eval()\n    running_loss = 0.0\n    correct = 0\n    total = 0\n    \n    loop = tqdm(valid_dataloader, desc=f'Epoch {epoch} Validation') if verbose else valid_dataloader\n    \n    for images, labels in loop:\n        images, labels = images.to(device), labels.to(device)\n        outputs = model(images)\n        loss = loss_fn(outputs, labels)\n        \n        running_loss += loss.item()\n        _, predicted = outputs.max(1)\n        total += labels.size(0)\n        correct += predicted.eq(labels).sum().item()\n    \n    avg_loss = running_loss / len(valid_dataloader)\n    accuracy = 100.0 * correct / total\n    \n    return avg_loss, accuracy","metadata":{"id":"05KUACqv4zlx","trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:30:23.055901Z","iopub.execute_input":"2026-07-18T21:30:23.056389Z","iopub.status.idle":"2026-07-18T21:30:23.076707Z","shell.execute_reply.started":"2026-07-18T21:30:23.056350Z","shell.execute_reply":"2026-07-18T21:30:23.075967Z"},"jupyter":{"source_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Обучение модели\n*   Определить необходимые параметры для обучения модели (learning rate, optimizer, loss function, etc)\n*   Реализовать процесс обучения модели\n*   Оценить эффективность работы модели\n\n","metadata":{"id":"kohYYP3N5GkT"}},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(f\"Используемое устройство: {device}\")\n\nEPOCHS = 10\nLEARNING_RATE = 0.0001\nNUM_CLASSES = 50\n\nmodel = RSNAModel(num_classes=NUM_CLASSES, model_name='resnet50')\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)\nscheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=3, factor=0.5)\n\nbest_val_acc = 0\nhistory = {'train_loss': [], 'train_acc': [], 'val_loss': [], 'val_acc': []}\n\nprint(\"=\"*50)\nprint(\"НАЧАЛО ОБУЧЕНИЯ\")\nprint(\"=\"*50)\n\nfor epoch in range(1, EPOCHS + 1):\n    print(f\"\\nEpoch {epoch}/{EPOCHS}\")\n    print(\"-\" * 30)\n    \n    train_loss, train_acc = train_one_epoch(\n        model, train_loader, optimizer, criterion, \n        epoch, device, log_wandb=False, verbose=True\n    )\n    \n    val_loss, val_acc = valid_one_epoch(\n        model, valid_loader, criterion, \n        epoch, device, log_wandb=False, verbose=True\n    )\n    \n    scheduler.step(val_loss)\n    \n    history['train_loss'].append(train_loss)\n    history['train_acc'].append(train_acc)\n    history['val_loss'].append(val_loss)\n    history['val_acc'].append(val_acc)\n    \n    print(f\"\\nTrain Loss: {train_loss:.4f} | Train Acc: {train_acc:.2f}%\")\n    print(f\"Val Loss: {val_loss:.4f} | Val Acc: {val_acc:.2f}%\")\n    print(f\"LR: {optimizer.param_groups[0]['lr']:.6f}\")\n    \n    if val_acc > best_val_acc:\n        best_val_acc = val_acc\n        torch.save(model.state_dict(), 'best_model.pth')\n        print(f\">>> Новая лучшая модель! Acc: {best_val_acc:.2f}%\")\n\nprint(\"\\n\" + \"=\"*50)\nprint(f\"Лучшая валидационная точность: {best_val_acc:.2f}%\")\nprint(\"=\"*50)\n\nplt.figure(figsize=(12, 4))\n\nplt.subplot(1, 2, 1)\nplt.plot(history['train_loss'], label='Train Loss', color='blue')\nplt.plot(history['val_loss'], label='Val Loss', color='red')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\nplt.title('Потери')\n\nplt.subplot(1, 2, 2)\nplt.plot(history['train_acc'], label='Train Acc', color='blue')\nplt.plot(history['val_acc'], label='Val Acc', color='red')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy (%)')\nplt.legend()\nplt.title('Точность')\n\nplt.tight_layout()\nplt.show()","metadata":{"id":"SMN4I1wB5jtP","trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:30:23.078011Z","iopub.execute_input":"2026-07-18T21:30:23.078408Z","iopub.status.idle":"2026-07-18T21:37:52.924535Z","shell.execute_reply.started":"2026-07-18T21:30:23.078368Z","shell.execute_reply":"2026-07-18T21:37:52.923625Z"},"jupyter":{"source_hidden":true,"outputs_hidden":true},"collapsed":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5. Экспериментальная часть\n\n- протестировать не менее 3х разных моделей для решения задачи\n- сравнить их эффективность (по метрикам и потерям)\n- сделать выводы","metadata":{"id":"Jo1g3CnF5Xyp"}},{"cell_type":"code","source":"models_to_try = ['resnet50', 'efficientnet', 'densenet']\nresults = {}\n\nfor model_name in models_to_try:\n    print(\"\\n\" + \"=\"*60)\n    print(f\"ОБУЧЕНИЕ МОДЕЛИ: {model_name.upper()}\")\n    print(\"=\"*60)\n    \n    model = RSNAModel(num_classes=50, model_name=model_name)\n    model = model.to(device)\n    \n    optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)\n    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=3, factor=0.5)\n    \n    best_val_acc = 0\n    history = {'train_loss': [], 'train_acc': [], 'val_loss': [], 'val_acc': []}\n    \n    for epoch in range(1, 8):\n        train_loss, train_acc = train_one_epoch(\n            model, train_loader, optimizer, criterion, \n            epoch, device, log_wandb=False, verbose=False\n        )\n        \n        val_loss, val_acc = valid_one_epoch(\n            model, valid_loader, criterion, \n            epoch, device, log_wandb=False, verbose=False\n        )\n        \n        scheduler.step(val_loss)\n        \n        history['train_loss'].append(train_loss)\n        history['train_acc'].append(train_acc)\n        history['val_loss'].append(val_loss)\n        history['val_acc'].append(val_acc)\n        \n        if val_acc > best_val_acc:\n            best_val_acc = val_acc\n            torch.save(model.state_dict(), f'best_{model_name}.pth')\n    \n    results[model_name] = {\n        'best_acc': best_val_acc,\n        'history': history\n    }\n    \n    print(f\"{model_name.upper()} - Лучшая точность: {best_val_acc:.2f}%\")\n\nprint(\"\\n\" + \"=\"*60)\nprint(\"СРАВНЕНИЕ МОДЕЛЕЙ\")\nprint(\"=\"*60)\n\nfor model_name, data in results.items():\n    print(f\"{model_name.upper()}: {data['best_acc']:.2f}%\")\n\nfig, axes = plt.subplots(1, 3, figsize=(18, 5))\n\nfor idx, (model_name, data) in enumerate(results.items()):\n    ax = axes[idx]\n    ax.plot(data['history']['train_acc'], label='Train Acc', marker='o')\n    ax.plot(data['history']['val_acc'], label='Val Acc', marker='s')\n    ax.set_xlabel('Epoch')\n    ax.set_ylabel('Accuracy (%)')\n    ax.set_title(f'{model_name.upper()}\\nBest: {data[\"best_acc\"]:.2f}%')\n    ax.legend()\n    ax.grid(True, alpha=0.3)\n\nplt.tight_layout()\nplt.show()\n\nfig, axes = plt.subplots(1, 3, figsize=(18, 5))\n\nfor idx, (model_name, data) in enumerate(results.items()):\n    ax = axes[idx]\n    ax.plot(data['history']['train_loss'], label='Train Loss', marker='o')\n    ax.plot(data['history']['val_loss'], label='Val Loss', marker='s')\n    ax.set_xlabel('Epoch')\n    ax.set_ylabel('Loss')\n    ax.set_title(f'{model_name.upper()}')\n    ax.legend()\n    ax.grid(True, alpha=0.3)\n\nplt.tight_layout()\nplt.show()\n\nbest_model = max(results.items(), key=lambda x: x[1]['best_acc'])\nprint(f\"\\nЛучшая модель: {best_model[0].upper()} с точностью {best_model[1]['best_acc']:.2f}%\")\n\ntest_dataset = MyDataset(TEST_DIR, transform=val_transform, is_train=False)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=2)\n\nmodel = RSNAModel(num_classes=50, model_name=best_model[0])\nmodel.load_state_dict(torch.load(f'best_{best_model[0]}.pth'))\nmodel = model.to(device)\nmodel.eval()\n\npredictions = []\nfilenames = []\n\nwith torch.no_grad():\n    for images, names in tqdm(test_loader, desc='Predicting'):\n        images = images.to(device)\n        outputs = model(images)\n        _, predicted = outputs.max(1)\n        predictions.extend(predicted.cpu().numpy())\n        filenames.extend(names)\n\nidx_to_class = {idx: cls for cls, idx in train_data.dataset.class_to_idx.items()}\n","metadata":{"id":"EXV2-qaG5k6G","trusted":true,"execution":{"iopub.status.busy":"2026-07-18T21:37:52.925988Z","iopub.execute_input":"2026-07-18T21:37:52.926262Z","iopub.status.idle":"2026-07-18T21:51:08.027751Z","shell.execute_reply.started":"2026-07-18T21:37:52.926230Z","shell.execute_reply":"2026-07-18T21:51:08.026562Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'index': [filename[:-4] for filename in filenames],\n    'label': [idx_to_class[idx][6:] for idx in predictions]\n}).sort_values('index').reset_index(drop=True)\nsubmission.to_csv('submission.csv', index=False)\nprint(\"\\nСабмит сохранен как submission.csv\")\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-18T22:17:44.875650Z","iopub.execute_input":"2026-07-18T22:17:44.876606Z","iopub.status.idle":"2026-07-18T22:17:44.887048Z","shell.execute_reply.started":"2026-07-18T22:17:44.876574Z","shell.execute_reply":"2026-07-18T22:17:44.886298Z"}},"outputs":[],"execution_count":null}]}