Skip to content

UnreadablePerson-wq/ML-Labs

Repository files navigation

🧠 Лабораторные работы по машинному обучению

Автор: Владислав (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%.

🧠 Детальное описание работ

Лабораторная работа №1: Персептрон

Тема: Алгоритм обучения персептрона для линейно разделимых классов

Реализован классический персептрон Розенблатта с пороговой функцией активации. Программа обучается на данных 18 варианта (таблица из 36 точек) и строит разделяющую линию. В процессе обучения визуализируется каждая эпоха своим цветом.

Ключевые моменты:

  • Обучение только на ошибочных примерах
  • Визуализация динамики изменения разделяющей линии
  • Bias (смещение) как отдельный вес

Лабораторная работа №2: Нейронная сеть на персептронах

Тема: Проектирование нейронной сети из персептронов для логической схемы

Обучаются базовые логические элементы (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) = результат

Лабораторная работа №3: Backpropagation

Тема: Обучение двухслойной сети для XOR алгоритмом обратного распространения

Поскольку XOR нелинейно разделима, однослойный персептрон не справляется. Реализована двухслойная сеть с обратным распространением ошибки.

Архитектура:

  • Вход: 2 нейрона + bias
  • Скрытый слой: 2 нейрона с tanh
  • Выход: 1 нейрон с сигмоидой

Математика:

  • Прямой проход: вычисление выходов
  • Обратный проход: градиенты функции потерь
  • Обновление весов: градиентный спуск

Лабораторная работа №4: Распознавание MNIST

Тема: Распознавание цифры 8 из датасета MNIST

Самая объемная работа. Реализована двухслойная сеть для бинарной классификации (определяет, является ли изображение цифрой 8).

Характеристики:

  • Вход: 784 нейрона (28×28 пикселей)
  • Скрытый слой: 64 нейрона с tanh
  • Выход: 1 нейрон с сигмоидой
  • Обучающая выборка: 5000 примеров
  • Тестовая выборка: 1000 примеров
  • Достигнутая точность: 98.5%

Возможности:

  • Загрузка данных из сжатых файлов .gz
  • Нормализация изображений
  • Визуализация процесса обучения
  • Анализ ошибок (ложные срабатывания и пропуски)
  • Сохранение и загрузка обученных весов

📊 Результаты

ЛР1: Персептрон

  • Сходимость за 5 эпох
  • Финальные веса: w0 = -0.500, w1 = -0.250, w2 = 0.250

ЛР2: Сеть из персептронов

  • AND: сошелся за 2 эпохи
  • OR: сошелся за 2 эпохи
  • NAND: сошелся за 2 эпохи
  • Итоговая схема работает на всех 8 комбинациях

ЛР3: Backpropagation для XOR

  • Обучение за ~2000 эпох
  • Итоговая ошибка < 0.01
  • Сеть корректно обрабатывает все 4 варианта входа

ЛР4: MNIST

  • Ошибка снизилась с 0.0738 до 0.0093 за 15 эпох
  • Точность на тесте: 98.5%
  • Из 1000 примеров ошибка только на 15

ЛР5: Классификация MNIST (10 цифр)

Тема: Распознавание всех 10 цифр датасета MNIST с помощью двухслойной сети и обратного распространения ошибки

Наиболее полная работа в цикле. Реализована двухслойная нейронная сеть для многоклассовой классификации. Проведено исследование влияния гиперпараметров и аугментации данных на точность распознавания.

Архитектура сети:

  • Входной слой: 784 нейрона (28×28 пикселей) + bias
  • Скрытый слой: настраиваемое количество нейронов (по умолчанию 64) с активацией tanh
  • Выходной слой: 10 нейронов (по числу цифр) с активацией sigmoid

Эксперименты:

  1. Базовая модель (LR=0.05, H=25) — точность 93.97%
  2. Улучшенная модель (LR=0.01, H=64) — точность 98.28%
  3. Модель с аугментацией — улучшенная модель + расширение данных сдвигами — точность 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)

🚀 Быстрый старт

Лабораторная 1: Персептрон

cd lab1_perceptron
python perceptron.py

Лабораторная 2: Сеть из персептронов

cd ../lab2_neural_network
python perceptron_network.py

Лабораторная 3: Backpropagation

cd ../lab3_backpropagation
python xor_backprop.py

Лабораторная 4: Распознавание MNIST

cd ../lab4_mnist
# Сначала проверь загрузку данных
python mnist_loader.py
# Обучи сеть
python train_network.py
# Посмотри визуализацию
python visualize_results.py

Лабораторная 5: Классификация MNIST (10 цифр)

cd ../lab5_mnist_classification
# Поместите файлы MNIST в папку Mnist/
python train.py            # запуск обучения и сравнения моделей
# Результаты сохранятся в папку results/

📝 Вариант 18

Во всех работах используется 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 - это лучшая благодарность для автора!

Releases

No releases published

Packages

 
 
 

Contributors

Languages