Сессионное задание. Курс «Продвинутые методы глубокого обучения», Skillfactory / МИФИ, 2026.
В этом проекте я сравниваю три подхода к классификации музыкальных жанров по спектрограммам на датасете GTZAN:
- MLP — базовая полносвязная сеть (результат из практики курса)
- CNN — собственная свёрточная нейронная сеть, построенная с нуля
- EfficientNet B0 — transfer learning с предобученными весами ImageNet
| Модель | Val Accuracy | Порог задания |
|---|---|---|
| MLP (из практики курса) | 30.46% | — |
| CNN (Задание 1) | 67.50% | ≥ 50% ✅ |
| EfficientNet B0 (Задание 2) | 66.00% | ≥ 65% ✅ |
Наилучший результат показала CNN (67.50%), незначительно опередив EfficientNet B0 (66.00%). Это объясняется спецификой датасета: спектрограммы существенно отличаются от фотографий реального мира, на которых обучалась EfficientNet, поэтому предобученные признаки ImageNet дают меньший выигрыш, чем обычно. Собственная CNN обучалась непосредственно на спектрограммах и выучила специфичные для задачи паттерны.
| Параметр | Значение |
|---|---|
| Фреймворк | PyTorch |
| Среда выполнения | Google Colab |
| GPU | Tesla T4 (15.6 GB VRAM) |
| Датасет | GTZAN Dataset — Music Genre Classification |
| Метрика | Accuracy (val) |
GTZAN Dataset — Music Genre Classification
- 999 изображений спектрограмм
- 10 жанров: blues, classical, country, disco, hiphop, jazz, metal, pop, reggae, rock
- Разбивка: 80% train (799) / 20% val (200)
- Источник: Kaggle —
andradaolteanu/gtzan-dataset-music-genre-classification
Архитектура (строго по условию задания):
Conv2d(3→32) → ReLU → MaxPool2d
Conv2d(32→64) → ReLU → MaxPool2d
Conv2d(64→128) → ReLU → MaxPool2d
Flatten
Linear(32768→256) → ReLU → Dropout(0.3)
Linear(256→10)
Параметры обучения:
- Вход: 128×128
- Оптимизатор: AdamW (lr=1e-3, weight_decay=1e-4)
- Эпохи: 50
Динамика обучения (ключевые эпохи):
| Эпоха | Train Loss | Train Acc | Val Loss | Val Acc |
|---|---|---|---|---|
| 1 | 2.3104 | 14.89% | 2.1692 | 18.00% |
| 10 | 1.1886 | 58.20% | 1.3207 | 55.00% |
| 25 | 0.1953 | 94.24% | 1.3111 | 65.00% |
| 35 | 0.0511 | 99.12% | 1.7507 | 67.50% |
| 50 | 0.0325 | 99.12% | 2.1090 | 66.00% |
Лучший Val Accuracy: 67.50% (эпоха 35) — выше порога ≥50%
Подход:
- Загружена EfficientNet B0 с весами ImageNet (
IMAGENET1K_V1) - Все слои заморожены (
requires_grad = False) - Заменён классификатор:
Linear(1280→10)+Dropout(0.3) - Обучаемых параметров: 12,810 из 4,020,358
Аугментация данных:
RandomHorizontalFlipRandomRotation(10)
Параметры обучения:
- Вход: 224×224
- Оптимизатор: Adam (lr=3e-4)
- Эпохи: 50
- Scheduler: ReduceLROnPlateau (factor=0.7, patience=5)
Динамика обучения (ключевые эпохи):
| Эпоха | Train Loss | Train Acc | Val Loss | Val Acc | LR |
|---|---|---|---|---|---|
| 1 | 2.2795 | 13.39% | 2.2221 | 22.50% | 3e-4 |
| 10 | 1.5488 | 53.32% | 1.6690 | 58.50% | 3e-4 |
| 20 | 1.3381 | 58.82% | 1.4518 | 63.00% | 3e-4 |
| 35 | 1.1825 | 62.70% | 1.3036 | 65.00% | 3e-4 |
| 40 | 1.1923 | 60.45% | 1.2823 | 66.00% | 3e-4 |
| 50 | 1.1042 | 66.46% | 1.2669 | 64.50% | 3e-4 |
Лучший Val Accuracy: 66.00% (эпоха 40) — выше порога ≥65%
По итогам обучения наилучший результат показала собственная CNN (67.50%), незначительно опередив EfficientNet B0 (66.00%). Это объясняется ограниченным размером датасета GTZAN: при transfer learning обучается только классификатор, и предобученные признаки ImageNet не всегда оптимальны для спектрограмм, которые существенно отличаются от фотографий реального мира, на которых обучалась EfficientNet.
Собственная CNN обучалась полностью с нуля именно на спектрограммах, что позволило ей выучить специфичные для задачи пространственные паттерны — частотные полосы и текстуры, характерные для конкретных жанров.
Базовая MLP ожидаемо показала наименьшую точность (30.46%): не имея пространственной инвариантности, она обрабатывает изображение как плоский вектор пикселей и не способна улавливать структурные закономерности спектрограмм.
Переход от MLP к CNN даёт значительный прирост точности за счёт свёрточных операций, а transfer learning с EfficientNet B0 демонстрирует сопоставимый результат при меньшем времени обучения, что подтверждает его практическую ценность на задачах с ограниченными данными.
gtzan-genre-classification/
├── README.md
└── GTZAN_Music_Genre_Classification_PJ_Begaliev_Manas.ipynb
- Открыть Google Colab
- File → Upload notebook → загрузить
.ipynb - Runtime → Change runtime type → T4 GPU
- Runtime → Run all
- Ввести Kaggle username и API key при запросе
- Токен: kaggle.com/settings → API → Create New API Token
Бегали уулу Манас
Курс: Машинное обучение, 2 семестр — Продвинутые методы глубокого обучения
Skillfactory / МИФИ, 2026