Нейронная сеть
В этой части мы изучим принципы работы нейронных сетей и напишем нейронную сеть из 2 слоев.
Нейронные сети состоят из связанных между собой нейронов.
Подробнее о нейронах я писал в предыдущей части.
Нейронные сети делятся на слои:
Входной слой
Скрытые слои
Выходной слой
Скрытые слои это слои между входным и выходным, количество скрытых слоев может быть любым.
Мы напишем нейронную сеть из 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
Вывод программы
Запустим еще раз
Наша программа будет выдавать каждый раз новый результат так как веса и смещения нейронов генерируются случайно. Это исправится когда мы начнем обучать нашу нейронную сеть.
Подведем итоги.
Сегодня мы:
Узнали принципы работы нейронных сетей
Выучили принципы связи нейронов в нейронных сетях
Написали класс NeuronNet на языке программирования python
Запустили свою первую нейронную сеть
В следующей части мы реализуем обучение нашей нейронной сети.
Если остались вопросы после чтения статьи, задайте их в комментариях.
AN3333
Вот прочитал пару книжек по сетям и не понимаю одну вещь. Устройство сетей более, менее ясно. Не ясно как вводить информацию. Она вводится в виде массивов чисел. Между этими числами нет связей. А это основная информация. Например:
Есть корзина с фруктами. Достаём их и вводим свойства в массив.
1 Яблоко
2 зеленое
3 100 грамм
4 Апельсин
5 красный
6 140 грамм
Однако, сеть ничего не знает что зеленое и 100 грамм относится к яблоку, но не к апельсину.
Если я перемешаю порядок пунктов, для сети ничего не изменится.
Буду очень благодарен за объяснение.
lair
А какую задачу вы решаете своим примером?
Массив — он вообще-то двумерный, одна "строка" — один пример.
Это зависит от сети, есть сети, которые работают с последовательностью данных.
andreishal Автор
Все входные данные идут на входы нейронам. То есть в вашем случае входных данных 6, и на первый нейрон идут все входные данные и суммируются по формуле показанной в прошлой части, на второй нейрон также идут все входные данные и суммируются, и так со всеми входными нейронами.