Нейронная сеть

В этой части мы изучим принципы работы нейронных сетей и напишем нейронную сеть из 2 слоев.

Нейронные сети состоят из связанных между собой нейронов.

Подробнее о нейронах я писал в предыдущей части.

Нейронные сети делятся на слои:

  1. Входной слой

  2. Скрытые слои

  3. Выходной слой

Скрытые слои это слои между входным и выходным, количество скрытых слоев может быть любым.

Мы напишем нейронную сеть из 2 слоев, входного и выходного слоев.

Вначале разберем принципы работы нейронных сетей.

Как я уже говорил нейронные сети делятся на слои. В каждом слое некоторое количество нейронов. Выходы всех нейронов в слое, отправляются на входы всех нейронов следующего слоя.

Схема нейронной сети из 3 слоев с 2 нейронами на входе, 3 скрытыми, 1 выходным будет выглядеть так

Такая связь между слоями называется, прямой связью.

В итоге у нас получилось 3 слоя и 6 нейронов.

Для больших проектов это немного, но так как мы только учимся, мы напишем нейронную сеть из 2 слоев с 2 входными нейронами и 1 выходным.

Схема для нашей нейронной сети

Создадим файл NeuronNet.py

Подключим класс нейрона который писали в прошлой части:

from Neuron import *

Опишем в файле класс NeuronNet и конструктор для него:

class NeuronNet:

    def __init__(self):
    
        self.n = []
        
        for i in range(3):
            self.n.append(Neuron(2))

В конструкторе класса создается массив из объектов класса Neuron размером в 3 нейрона. Нейрону передаем в параметры число 2, так как входов для всех нейронов будет по 2.

Для работы нейронной сети нам надо запустить функцию активации нейронов, запустить функцию активации 3 нейрона и передать ему выходы из 1 и 2 нейрона, на вход 1 и 2 нейрону передаем входные данные полученные от пользователя:

def activate(self, inputs):
    return self.n[2].activate(np.array([self.n[0].activate(inputs), self.n[1].activate(inputs)]))

В итоге у нас получился класс NeuronNet. Который мы записали в файл NeuronNet.py.

Полное содержание NeuronNet.py:

from Neuron import *

class NeuronNet:
    def __init__(self):

        self.n = []

        for i in range(3):
            self.n.append(Neuron(2))

    def activate(self, inputs):
        return self.n[2].activate(np.array([self.n[0].activate(inputs), self.n[1].activate(inputs)]))

Теперь создадим файл main.py, чтобы проверить работоспособность нашей нейронной сети.

Подключим к файлу main.py библиотеку numpy и наш файл NeuronNet.py:

import numpy as np
from NeuronNet import *

Создадим объект нейронной сети:

net = NeuronNet()

Объявим массив с входными данными и передадим его в нейронную сеть:

x = np.array([1, 2])

print(net.activate(x))

Полное содержание файла:

import numpy as np

from NeuronNet import *

net = NeuronNet()

x = np.array([1, 2])

print(net.activate(x))

Теперь запустим наш код. Введем в консоль:

python main.py

Вывод программы

Запустим еще раз

Наша программа будет выдавать каждый раз новый результат так как веса и смещения нейронов генерируются случайно. Это исправится когда мы начнем обучать нашу нейронную сеть.

Подведем итоги.

Сегодня мы:

  1. Узнали принципы работы нейронных сетей

  2. Выучили принципы связи нейронов в нейронных сетях

  3. Написали класс NeuronNet на языке программирования python

  4. Запустили свою первую нейронную сеть

В следующей части мы реализуем обучение нашей нейронной сети.

Если остались вопросы после чтения статьи, задайте их в комментариях.