Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

🧠 Перцептрон

Реализация нейронной сети с нуля на Python с обучением методом обратного распространения ошибки. Сеть демонстрирует обучение базовым логическим операциям: AND, OR, Implication и XOR.


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

Сеть состоит из трёх типов слоёв:

Входной слой  →  Скрытый слой(и)  →  Выходной слой
   (2 нейрона)      (3 нейрона)        (1 нейрон)
  • Функция активации: Сигмоида — σ(x) = 1 / (1 + e^(-x))
  • Обучение: Градиентный спуск + обратное распространение ошибки
  • Скорость обучения: 0.5 (настраивается)
  • Веса: Инициализируются случайными значениями в диапазоне [0.0, 1.0]

📁 Структура проекта

├── main.py                        # Точка входа: датасеты и запуск обучения
└── neural_network/
    └── neural_network.py          # Классы NeuronNetwork, Layer, Neuron, Input

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

Требования

pip install numpy matplotlib

Запуск

python main.py

🔬 Датасеты

В main.py определены четыре датасета для логических операций:

Операция [0,0] [0,1] [1,0] [1,1]
AND 0 0 0 1
OR 0 1 1 1
IMP (→) 1 1 0 1
XOR 0 1 1 0

⚠️ Важно: XOR не является линейно разделимой функцией. Для корректного обучения XOR необходим хотя бы один скрытый слой.


⚙️ Использование

from neural_network.neural_network import NeuronNetwork

# Создать сеть: 2 входа, 1 выход
nn = NeuronNetwork(input_l_size=2, output_l_size=1)

# Обучить на датасете
dataset_xor = [[[0, 0], 0], [[0, 1], 1], [[1, 0], 1], [[1, 1], 0]]
nn.train(dataset_xor, iters=10000)

# Протестировать
nn.test([[0, 0], [0, 1], [1, 0], [1, 1]], 'XOR')

Параметры конструктора NeuronNetwork

Параметр Тип По умолчанию Описание
input_l_size int Количество входных нейронов
output_l_size int Количество выходных нейронов
hidden_layer_size int 1 Количество скрытых слоёв
learning_rate float 0.5 Скорость обучения

🧩 Описание классов

NeuronNetwork

Главный класс сети. Управляет слоями, запускает обучение и тестирование.

  • train(dataset, iters) — обучение сети на заданном датасете
  • test(data, op_name) — вывод предсказаний для тестовых примеров
  • get_prediction() — возвращает выходные значения сети

Layer

Слой нейронов. Хранит список объектов Neuron и ссылку на предыдущий слой.

Neuron

Отдельный нейрон. Хранит входные связи (Input), вычисляет взвешенную сумму и значение активации, а также распространяет ошибку назад через метод set_error.

Input

Связь между нейронами. Хранит ссылку на нейрон предыдущего слоя и вес связи.


📊 Пример вывода (XOR, 10 000 итераций)

Начало обучения(10000 итераций)...

Обучение завершено!

0 XOR 0 ~ 0.04
0 XOR 1 ~ 0.96
1 XOR 0 ~ 0.96
1 XOR 1 ~ 0.05

📈 Визуализация результатов

График функции потерь

На графике показано изменение бинарной кросс-энтропии в процессе обучения. Уменьшение значения loss означает, что сеть постепенно подбирает веса так, чтобы ее ответы становились ближе к правильным значениям.

График loss для XOR

Вывод: в ходе обучения значение функции потерь уменьшается, что говорит о сходимости модели на выбранном наборе данных.

Сравнение правильных ответов и предсказаний

На графике сравниваются целевые значения логической функции и ответы нейронной сети после обучения. Пунктирная линия показывает порог классификации 0.5: значения выше порога относятся к классу 1, ниже порога - к классу 0.

Сравнение target и prediction для XOR

Вывод: после обучения предсказания сети находятся близко к ожидаемым значениям для всех входных комбинаций.

Поверхность решения

На графике показано, как сеть разделяет пространство двух входных признаков. Светлая линия соответствует порогу 0.5, то есть границе между классами.

Поверхность решения для XOR

Вывод: для XOR требуется нелинейная граница, поэтому наличие скрытого слоя позволяет сети приблизить нужное разделение.

Распределение весов

Гистограмма показывает, какие значения приняли веса связей после обучения. Такой график удобно использовать для анализа того, насколько сильно изменилась структура сети.

Распределение весов после обучения

Вывод: веса после обучения принимают разные значения, что показывает адаптацию связей сети под обучающую выборку.

Влияние скорости обучения

На графике сравнивается обучение при разных значениях learning_rate. Более крутое снижение loss означает более быструю сходимость, однако слишком большая скорость обучения может приводить к нестабильности.

Сравнение learning rate

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


📝 Примечания

  • Размер скрытого слоя вычисляется автоматически по формуле: min(2n − 1, ⌈2n/3 + m⌉), где n — число входов, m — число выходов.
  • Веса обновляются по правилу градиентного спуска непосредственно во время прохода по датасету (онлайн-обучение).
  • Для повышения стабильности можно уменьшить learning_rate и увеличить количество итераций.

About

Реализация нейронной сети с нуля на Python. Обучение методом обратного распространения ошибки с сигмоидальной функцией активации. Поддержка настраиваемого числа скрытых слоёв. Демонстрация на логических операциях: AND, OR, XOR, Импликация.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages