Найти тему
Айти Поц

Нейронная сеть на C++ | Нейрон

Начинаем цикл статей по написанию нейронной сети на C++.

Я не собираюсь писать нейронку очень сложно, наоборот я буду пытаться писать код по принципу KISS (про который я говорил в своем Telegram канале)

Если не хотите пропускать статьи, подписывайтесь на мой Telegram-канал :)

Ну, всё. Начинаем

Создадим файл заголовка: Neuron.h

В который положим класс Neuron и перечисление функций:

Neuron.h
Neuron.h

Коротко об объявлении функций в классе:

Два конструктора, которые принимают в качестве входной параметр нейрона и тип функции активации (о них позже).

Три метода типа void, которые мы разберем ниже и обычные геттеры, которые мы опишем в файле заголовка.

И три четыре приватных поля: активационное значение, входное значение, выходное значение, и тип функции активации.

Отлично, 20% пути пройдено, переходим к файлу Neuron.cpp

Начнем с конструкторов, в них нет ничего сложного:

Конструктор
Конструктор

Не забываем прописать include для заголовочного файла и библиотеки с математикой :)

Переходим к самой интересной части нашей статьи, написание функции активации:

Функция активации
Функция активации

Если наш type равен TAHN, это значит, что активационное значение мы будем вычислять с помощью гиперболического тангенса:

-4
-5

Функция нелинейна и она хорошо подходит для комбинации наших слоёв. Диапазон значений функции от -1 до 1, поэтому мы уверены, что функция не перегрузится от больших значений. В коде используем функцию tahn() из math.h.

Следующая активационная функция ReLu выглядит так: f(x) = max(0,x)
Отсюда можно понять, что функция возвращает x, если оно положительно и 0 в противном случае. Я не буду останавливаться на этих функция подробно, так как это уже другая тема... Наша задача, написать нейронку с нуля на плюсах.

Переходим к следующей, самой популярной функции (внимательные читатели заметили, что она стоит по-умолчанию) SIGM или Сигмоида.

-6
-7

Она имеет ряд преимуществ над другими функциями, одно из них это фиксированный диапазон от 0 до 1. Много на этой функции останавливаться не будем. Реализация этой функции довольна проста.

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

-8

По сути это все, на написании простого нейрона можно временно забить и вернуться, когда мы будем рассматривать функцию derive() более подробно.

Ну и пробуем создать объект нашего нейрона и посчитать его активационное и выходное значение:

Реализация main()
Реализация main()

Ну и соответственно результат нашей работы:

-10

В следующей статье мы будем писать так называемые слои нейронов.
Если у вас остались вопросы, вы всегда можете задать их мне в Telegram: @rivizoft

Больше познавательных постов у меня в Telegram-канале!