Разбор простейший структуры нейросети и пишем свою нейросеть на python

Разбор простейший структуры нейросети и пишем свою нейросеть на python

ⅅ卂尺ҠᎶ卂爪乇尺

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


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

Можно использовать 2+ входных нейронов (1 бессмысленно использовать), в этой статье мы будем использовать 3 и 5 входных нейронов.

Для начала, немного теории

Как нейронная сеть вообще может думать?

Все дело в синапсах, именно они определяют будет нейрон активен или нет.

Синапс это связь между двумя нейронами. У синапсов есть 1 параметр - вес. Благодаря ему, входная информация изменяется, когда передается от одного нейрона к другому. Допустим, есть 3 нейрона, которые передают информацию следующему. Тогда у нас есть 3 веса, соответствующие каждому из этих нейронов. У того нейрона, у которого вес будет больше, та информация и будет доминирующей в следующем нейроне.

Выходной нейрон выдает от 0 до 1, либо от -1 до 1, в зависимости какую вы формулу выберете, мы будем использовать формулу сигмоид (0,1).

Формулы по которым идут расчёты

Первая это сумма перемноженых входных данных на их веса (x1*w1+x2*w2+x3*w3), далее нужно пропустить ответ через функцию активации.

Вторая это функция активации, она служит для адаптация ответа в пригодное число, формула (1/1+e^-x).

Пишем простую нейросеть на python

Для начала определимся что она должна делать.

Имеем следующие данные:

[0,0,1] = 0
[1,0,1] = 1
[1,1,1] = 1

[0,1,1] = ?

Не сложно догадаться что ответ будет 0 т.к. первое число всегда ответ, сделаем так чтобы нейросеть сама догадалась до этого.


Импортируем нужный модуль для математических вычислений.

from numpy import exp, array, random, dot

Далее создадим класс нейросети и напишем функцию генерации случайного веса.

class Network():
  #при инициализации класса создаются случайные веса
  def __init__(self):
    #сид для случайной генерации
    random.seed(1)
    #случайный вес
    self.scales = 2 * random.random((3,1))

Далее создадим 2 функции сигмоид, одна для нейрона, другая для подсчета ошибки.

  def __sigmoid(self,x):
    return 1/(1+exp(-x))

  def __err_sigmoid(self,x):
    return x*(1-x)

Так же нужна функция которая будет "думать".

  def think(self,inputs):
    return self.__sigmoid(dot(inputs, self.scales))

Ну и функция обучения нашей нейросети.

  def train(self, input, output, epochs):
    for iteration in range(epochs):
      print("\rЭпоха - "+str(iteration), end="")
      #результат нейросети
      out = self.think(inputs)
      #подсчет ошибки
      error = output - out
      adjustment = dot(inputs.T, error * self.__err_sigmoid(output))
      self.scales += adjustment

Нейросеть готова, теперь ее можно использовать, для начала нам понадобятся тренеровочные данные, давайте возьмем те что были в начале.

train_inputs=[
[0,0,1],
[1,0,1],
[1,1,1]
]

Теперь ответы на данные задачи.

train_outputs=[
[0,1,1]
]

Инициализируем класс нейросети и обучим ее.

net=Network()

#выведем случайные весы
print("Веса до обучения: "+net.scales)

#обучим нейросеть используя 10000 эпох (это быстро)
net.train(train_inputs,train_outputs,10001)

#выведем вес после обучения
print("Веса после обучения: "+net.scales)

#теперь напишем вывод ответа в 1 или 0 для задачи [0,1,1]
print("Ответ на [0,1,1] - "+(1 if net.think(array([0,1,1])>0.5 else 0))

Как видите нейросеть научилась выполнять эту задачу (после обучения нужно заменить случайные веса на те что после обучения и убрать обучение).


Вот так легко создать свою нейросеть на python, чтобы понять больше как все работает поиграйтесь с кодом, вот что получилось написать мне за 10 минут:

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


👤Автор статьи и админ канала -> t.me/mozahist228

👤Создатель канала -> t.me/Enleann

☣️На чат -> t.me/termuxpub

Report Page