В предыдущих заданиях вы уже разобрали прямой проход одного нейрона, backward, локальный backward ReLU и численную проверку градиента. Теперь соберём эти части в одну небольшую нейронную сеть.
Сеть получает изображение рукописной цифры размером 8×8 пикселей, то есть 64 числа, сжимает его до двух чисел, а затем пытается восстановить исходное изображение.
Архитектура: 64 → 16 → 2 → 16 → 64.
Что нужно сделать
- Скачайте приложенную тетрадь
autoencoder_numpy.ipynb и откройте её в Google Colab или Jupyter.
- Реализуйте локальный backward ReLU.
- Реализуйте среднюю квадратичную ошибку.
- Реализуйте прямой проход
forward всей сети.
- Реализуйте обратный проход
backward всей сети.
- Напишите численную проверку отдельного веса методом центральной разности и добейтесь прохождения gradient check.
- Самостоятельно напишите цикл обучения: forward → loss → backward → обновление всех весов и смещений.
- Исследуйте восстановленные изображения и двумерное пространство bottleneck.
- Запустите последнюю ячейку и загрузите созданный файл
autoencoder_result.npz.
Данные
Используется встроенный набор sklearn.datasets.load_digits. Отдельно скачивать датасет не нужно. Изображения имеют размер 8×8, а значения пикселей нормируются в диапазон от 0 до 1.
Каждое пятое изображение используется как контрольное и не участвует в обновлении весов.
Архитектура сети
| Слой |
Размер |
Активация |
| Encoder 1 |
64 → 16 |
ReLU |
| Bottleneck |
16 → 2 |
нет |
| Decoder 1 |
2 → 16 |
ReLU |
| Выход |
16 → 64 |
sigmoid |
Функция ошибки
L = mean((X_hat - X) ** 2)
Что проверяет система
Проверяющая система не сравнивает ваши веса с заранее заданными весами: у правильно обученных сетей они могут различаться. Она сама выполняет прямой проход с присланными весами.
- проверяются размеры параметров и отсутствие некорректных чисел;
- проверяется, что gradient check был пройден;
- проверяется, что ошибка в процессе обучения заметно уменьшалась;
- проверяется соответствие сохранённых reconstruction и embedding итоговым весам;
- проверяется качество восстановления на контрольной выборке.
Качество расположения цифр на двумерной карте не оценивается: автокодировщик не обучается классифицировать цифры.
Ограничения
Для вычисления градиентов нельзя использовать PyTorch, TensorFlow, JAX, autograd и другие средства автоматического дифференцирования. Разрешены NumPy, matplotlib и scikit-learn для загрузки и визуализации данных.
Финальные эксперименты
После обязательной части тетрадь превращается в небольшую лабораторию: вы увидите, какие изображения decoder создаёт из двух чисел, плавно превратите одну цифру в другую и проверите сеть на повреждённых изображениях.
Важно: checker не оценивает красоту кластеров или морфинга. Эти эксперименты нужны, чтобы увидеть смысл обученного представления.
Файл ответа
Загрузите один файл: autoencoder_result.npz.