Автор: Владислав (Vanemy) ВУЗ: СПбГМТУ (Санкт-Петербургский государственный морской технический университет) Факультет: Цифровых и промышленных технологий Кафедра: Киберфизических систем Дисциплина: Методы и технологии машинного обучения
Данный репозиторий содержит цикл из 5 лабораторных работ по машинному обучению, выполненных в рамках учебной программы. Ключевая особенность: все алгоритмы реализованы с нуля на чистом Python с использованием только NumPy и Matplotlib, без применения высокоуровневых библиотек (TensorFlow, PyTorch, scikit-learn). Это позволяет глубоко понять математические основы работы нейронных сетей и алгоритмов обучения.
| Работа | Тема | Что сделано |
|---|---|---|
| ЛР №1 | Классический персептрон | Реализация алгоритма обучения персептрона Розенблатта для разделения двух классов. Визуализация процесса обучения и построение разделяющей линии. |
| ЛР №2 | Сеть из персептронов | Обучение отдельных персептронов для логических элементов (AND, OR, NAND) и сборка из них сети, реализующей сложную логическую схему (x1 AND x2) AND (x1 XOR x3). |
| ЛР №3 | Обратное распространение | Реализация алгоритма backpropagation для двухслойной сети. Решение нелинейно разделимой задачи XOR с использованием tanh и сигмоиды. |
| ЛР №4 | Распознавание MNIST | Двухслойная нейронная сеть для распознавания цифры 8 из датасета MNIST. Загрузка данных, обучение, анализ ошибок, точность >98%. |
| ЛР №5 | Классификация MNIST | Полносвязная сеть для распознавания всех 10 цифр. Сравнение моделей, аугментация данных, точность 98.91%. |
Тема: Алгоритм обучения персептрона для линейно разделимых классов
Реализован классический персептрон Розенблатта с пороговой функцией активации. Программа обучается на данных 18 варианта (таблица из 36 точек) и строит разделяющую линию. В процессе обучения визуализируется каждая эпоха своим цветом.
Ключевые моменты:
- Обучение только на ошибочных примерах
- Визуализация динамики изменения разделяющей линии
- Bias (смещение) как отдельный вес
Тема: Проектирование нейронной сети из персептронов для логической схемы
Обучаются базовые логические элементы (AND, OR, NAND), после чего из них собирается сеть, реализующая схему (x1 AND x2) AND (x1 XOR x3). XOR реализован через комбинацию OR и NAND.
Структура сети: 1-й слой: AND(x1,x2), OR(x1,x3), NAND(x1,x3) 2-й слой: AND(OR, NAND) = XOR 3-й слой: AND(AND, XOR) = результат
Тема: Обучение двухслойной сети для XOR алгоритмом обратного распространения
Поскольку XOR нелинейно разделима, однослойный персептрон не справляется. Реализована двухслойная сеть с обратным распространением ошибки.
Архитектура:
- Вход: 2 нейрона + bias
- Скрытый слой: 2 нейрона с tanh
- Выход: 1 нейрон с сигмоидой
Математика:
- Прямой проход: вычисление выходов
- Обратный проход: градиенты функции потерь
- Обновление весов: градиентный спуск
Тема: Распознавание цифры 8 из датасета MNIST
Самая объемная работа. Реализована двухслойная сеть для бинарной классификации (определяет, является ли изображение цифрой 8).
Характеристики:
- Вход: 784 нейрона (28×28 пикселей)
- Скрытый слой: 64 нейрона с tanh
- Выход: 1 нейрон с сигмоидой
- Обучающая выборка: 5000 примеров
- Тестовая выборка: 1000 примеров
- Достигнутая точность: 98.5%
Возможности:
- Загрузка данных из сжатых файлов .gz
- Нормализация изображений
- Визуализация процесса обучения
- Анализ ошибок (ложные срабатывания и пропуски)
- Сохранение и загрузка обученных весов
- Сходимость за 5 эпох
- Финальные веса: w0 = -0.500, w1 = -0.250, w2 = 0.250
- AND: сошелся за 2 эпохи
- OR: сошелся за 2 эпохи
- NAND: сошелся за 2 эпохи
- Итоговая схема работает на всех 8 комбинациях
- Обучение за ~2000 эпох
- Итоговая ошибка < 0.01
- Сеть корректно обрабатывает все 4 варианта входа
- Ошибка снизилась с 0.0738 до 0.0093 за 15 эпох
- Точность на тесте: 98.5%
- Из 1000 примеров ошибка только на 15
Тема: Распознавание всех 10 цифр датасета MNIST с помощью двухслойной сети и обратного распространения ошибки
Наиболее полная работа в цикле. Реализована двухслойная нейронная сеть для многоклассовой классификации. Проведено исследование влияния гиперпараметров и аугментации данных на точность распознавания.
Архитектура сети:
- Входной слой: 784 нейрона (28×28 пикселей) + bias
- Скрытый слой: настраиваемое количество нейронов (по умолчанию 64) с активацией
tanh - Выходной слой: 10 нейронов (по числу цифр) с активацией
sigmoid
Эксперименты:
- Базовая модель (LR=0.05, H=25) — точность 93.97%
- Улучшенная модель (LR=0.01, H=64) — точность 98.28%
- Модель с аугментацией — улучшенная модель + расширение данных сдвигами — точность 98.91%
Аугментация данных: Для каждого изображения создаются 4 дополнительные копии со сдвигом на 1 пиксель:
- влево
- вправо
- вверх
- вниз
Размер обучающей выборки увеличивается в 5 раз (с 60 000 до 300 000 примеров), что позволяет модели лучше обобщать и повышает точность на 0.63%.
git clone https://github.com/UnreadablePerson-wq/ML-Labs.git
cd ML-Labs
pip install -r requirements.txt
Зависимости:
Python 3.8+
NumPy (для матричных операций)
Matplotlib (для визуализации)
gzip (встроен в Python, для MNIST)
cd lab1_perceptron
python perceptron.py
cd ../lab2_neural_network
python perceptron_network.py
cd ../lab3_backpropagation
python xor_backprop.py
cd ../lab4_mnist
# Сначала проверь загрузку данных
python mnist_loader.py
# Обучи сеть
python train_network.py
# Посмотри визуализацию
python visualize_results.py
cd ../lab5_mnist_classification
# Поместите файлы MNIST в папку Mnist/
python train.py # запуск обучения и сравнения моделей
# Результаты сохранятся в папку results/
Во всех работах используется 18 вариант:
Работа Задание по варианту ЛР1 Таблица истинности с точками (x1, x2) из методички ЛР2 Логическая схема: (x1 AND x2) AND (x1 XOR x3) ЛР3 Функция XOR (универсально для всех вариантов) ЛР4 Распознавание цифры 8 (младший разряд 18 → 8) ЛР5 Полная классификация MNIST (все 10 цифр)
Функции активации Пороговая: для классического персептрона
Tanh: для скрытых слоев (диапазон [-1, 1])
Сигмоида: для выходного слоя (диапазон [0, 1], интерпретация как вероятность)
Алгоритмы обучения Персептрон: коррекция весов при ошибке: w += learning_rate * (target - output) * x
Backpropagation: градиентный спуск с обратным распространением ошибки
Инициализация весов Случайные значения из нормального распределения
Масштабирование factor = 0.1 для предотвращения взрывных градиентов
Каждая лабораторная работа содержит визуализацию:
ЛР1: процесс обучения (линии разделения разных эпох)
ЛР2: графики обучения каждого логического элемента
ЛР3: изменение ошибки в процессе обучения
ЛР4: примеры цифр, график обучения, анализ ошибок
ЛР5: графики обучения всех трех моделей, сравнительная диаграмма точности, примеры ошибочной классификации
Понимание математики нейронных сетей "под капотом"
Навыки работы с матричными операциями в NumPy
Умение визуализировать процессы обучения
Опыт отладки алгоритмов градиентного спуска
Понимание проблем (затухание градиента, локальные минимумы)
Практический опыт аугментации данных и её влияния на качество модели
Владислав (Vanemy)
GitHub: @UnreadablePerson-wq
Специализация: ML/AI инженер, киберфизические системы
Ищу работу в России, г. Санкт-Петербург
Готов к стажировке или позиции Junior ML Engineer
Проект доступен для использования в учебных целях. При использовании материалов ссылка на автора приветствуется.
Если проект оказался полезным для вашего обучения или вдохновил на собственные эксперименты, поставьте звездочку на GitHub - это лучшая благодарность для автора!