Искусственные Нейронные Сети. Часть 3



Обучение нейронной сети В этой части статьи о разработке простой нейронной сети мы научимся обучать нейронные сети.

Будем обучать нейронную сеть решению задачи нахождения закономерности в ряду чисел.

Для простоты это будут цифры 0 и 1. Для обучения нейронной сети необходимо иметь условия задачи и решения; задания должны решать одну проблему.

Данные обучения выглядят так

Состояние Отвечать
1 0 1
0 0 0
0 1 0
Эту задачу вы можете увидеть практически во всех статьях по написанию нейросетей с нуля.

В результате обучения нейронная сеть находит логическую связь между условием и ответом.

Решением этой проблемы является первое введенное число.

Как условие задачи, которую должна решить нейросеть, это выглядит так

Состояние Отвечать
1 1 1
Обучение нейронной сети — это уменьшение потерь.

Чем меньше потерь, тем лучше и правильнее результат. Чтобы избежать сложных формул, я не буду подробно объяснять принципы обучения, приведу более-менее понятный код и объясню функции, необходимые для обучения нейросети.

Для обучения нам понадобится производная сигмовидной.

Что такое производная, можно узнать в Википедии, а производная сигмовидной выглядит так:

Искусственные нейронные сети.
</p><p>
 Часть 3

Реализация Python выглядит следующим образом:

  
  
  
  
  
  
  
  
   

def deriv_sig(x): return sig(x) * (1 - sig(x))

Давайте напишем этот код в файле Math.py. Также для обучения нам понадобятся 2 константы: скорость - скорость обучения count_learn — количество повторений тренировки Чем больше count_learn, тем лучше нейронная сеть будет учиться, но на обучение уйдет больше времени.

А со ставкой все понятно.

Присвоим значения константам: ставка = 0,1 count_learn = 10000 После объявления констант запускаем цикл от 0 до count_learn, внутри цикла запускаем еще один цикл, который будет выполняться столько раз, сколько у нас есть входных данных для обучения.

После этого будет некоторая сложная математика, поэтому я просто приведу вам код:

def learn(self, inputs, answers): rate = 0.1 count_learn = 10000 for o in range(count_learn): for inputt, answer in zip(inputs, answers): sum_n1 = self.n[0].

w[0] * inputt[0] + self.n[0].

w[1] * inputt[1] + self.n[0].

b n1 = sig(sum_n1) sum_n2 = self.n[1].

w[0] * inputt[0] + self.n[1].

w[1] * inputt[1] + self.n[1].

b n2 = sig(sum_n2) sum_n3 = self.n[2].

w[0] * n1 + self.n[2].

w[1] * n2 + self.n[2].

b n3 = sig(sum_n3) out_res = n3 err = -2 * (answer - out_res) err_rate = rate * err deriv_sig_n1 = deriv_sig(sum_n1) deriv_sig_n2 = deriv_sig(sum_n2) deriv_sig_n3 = deriv_sig(sum_n3) self.n[0].

w[0] -= err_rate * self.n[2].

w[0] * deriv_sig_n3 * inputt[0] * deriv_sig_n1 self.n[0].

w[1] -= err_rate * self.n[2].

w[0] * deriv_sig_n3 * inputt[1] * deriv_sig_n1 self.n[0].

b -= err_rate * self.n[2].

w[0] * deriv_sig_n3 * deriv_sig_n1 self.n[1].

w[0] -= err_rate * self.n[2].

w[1] * deriv_sig_n3 * inputt[0] * deriv_sig_n2 self.n[1].

w[1] -= err_rate * self.n[2].

w[1] * deriv_sig_n3 * inputt[1] * deriv_sig_n2 self.n[1].

b -= err_rate * self.n[2].

w[1] * deriv_sig_n3 * deriv_sig_n2 self.n[2].

w[0] -= err_rate * n1 * deriv_sig_n3 self.n[2].

w[1] -= err_rate * n2 * deriv_sig_n3 self.n[2].

b -= err_rate * deriv_sig_n3

Давайте напишем эту функцию в классе NeuronNet. В результате файл 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)])) def learn(self, inputs, answers): rate = 0.1 count_learn = 10000 for o in range(count_learn): for inputt, answer in zip(inputs, answers): sum_n1 = self.n[0].

w[0] * inputt[0] + self.n[0].

w[1] * inputt[1] + self.n[0].

b n1 = sig(sum_n1) sum_n2 = self.n[1].

w[0] * inputt[0] + self.n[1].

w[1] * inputt[1] + self.n[1].

b n2 = sig(sum_n2) sum_n3 = self.n[2].

w[0] * n1 + self.n[2].

w[1] * n2 + self.n[2].

b n3 = sig(sum_n3) out_res = n3 err = -2 * (answer - out_res) err_rate = rate * err deriv_sig_n1 = deriv_sig(sum_n1) deriv_sig_n2 = deriv_sig(sum_n2) deriv_sig_n3 = deriv_sig(sum_n3) self.n[0].

w[0] -= err_rate * self.n[2].

w[0] * deriv_sig_n3 * inputt[0] * deriv_sig_n1 self.n[0].

w[1] -= err_rate * self.n[2].

w[0] * deriv_sig_n3 * inputt[1] * deriv_sig_n1 self.n[0].

b -= err_rate * self.n[2].

w[0] * deriv_sig_n3 * deriv_sig_n1 self.n[1].

w[0] -= err_rate * self.n[2].

w[1] * deriv_sig_n3 * inputt[0] * deriv_sig_n2 self.n[1].

w[1] -= err_rate * self.n[2].

w[1] * deriv_sig_n3 * inputt[1] * deriv_sig_n2 self.n[1].

b -= err_rate * self.n[2].

w[1] * deriv_sig_n3 * deriv_sig_n2 self.n[2].

w[0] -= err_rate * n1 * deriv_sig_n3 self.n[2].

w[1] -= err_rate * n2 * deriv_sig_n3 self.n[2].

b -= err_rate * deriv_sig_n3

И Math.py выглядит так:

import numpy as np def sig(x): return 1 / (1 + np.exp(-x)) def deriv_sig(x): return sig(x) * (1 - sig(x))

Теперь запустим нашу нейросеть и обучим.

Добавим в файл main.py массив с обучающими данными и правильными ответами:

learn_inputs = np.array([[1, 0], [0, 0], [0, 1]]) learn_answers = np.array([1, 0, 0])

Далее приступим к обучению:

net.learn(learn_inputs, learn_answers)

И запустим нашу нейросеть, задав ей задачу, которую нужно решить:

x = np.array([1, 1]) if (net.activate(x) < 0.5): print("0") else: print("1")

В результате main.py выглядит так:

import numpy as np from NeuronNet import * net = NeuronNet() learn_inputs = np.array([[1, 0], [0, 0], [0, 1]]) learn_answers = np.array([1, 0, 0]) net.learn(learn_inputs, learn_answers) x = np.array([1, 1]) if (net.activate(x) < 0.5): print("0") else: print("1")

Теперь запустим программу, введя в консоль:

python main.py

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

Искусственные нейронные сети.
</p><p>
 Часть 3

Теперь давайте вместо этого обновим входные данные

Состояние Отвечать
1 1 1
Давайте поставим еще одну задачу
Состояние Отвечать
0 1 0
При изменении входных данных результат работы программы выглядит так

Искусственные нейронные сети.
</p><p>
 Часть 3

Теперь подведем итоги.

В серии статей об искусственных нейронных сетях мы изучали

  1. Принципы работы искусственных нейронов
  2. Принципы работы нейронных сетей
  3. Принципы обучения нейронных сетей
  4. Написал свою нейронную сеть
Эта часть статьи была последней.

Вы можете найти окончательный код нейронной сети на моей странице GitHub .

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

Теги: #Машинное обучение #python #искусственный интеллект #ИИ #нейронные сети #машинное обучение #нейронные сети #нейронная сеть #AI #нейронная сеть #нейронная сеть с нуля

Вместе с данным постом часто просматривают: