Обучение нейронной сети В этой части статьи о разработке простой нейронной сети мы научимся обучать нейронные сети.
Будем обучать нейронную сеть решению задачи нахождения закономерности в ряду чисел.
Для простоты это будут цифры 0 и 1. Для обучения нейронной сети необходимо иметь условия задачи и решения; задания должны решать одну проблему.
Данные обучения выглядят так
Состояние | Отвечать | |
1 | 0 | 1 |
0 | 0 | 0 |
0 | 1 | 0 |
В результате обучения нейронная сеть находит логическую связь между условием и ответом.
Решением этой проблемы является первое введенное число.
Как условие задачи, которую должна решить нейросеть, это выглядит так
Состояние | Отвечать | |
1 | 1 | 1 |
Чем меньше потерь, тем лучше и правильнее результат. Чтобы избежать сложных формул, я не буду подробно объяснять принципы обучения, приведу более-менее понятный код и объясню функции, необходимые для обучения нейросети.
Для обучения нам понадобится производная сигмовидной.
Что такое производная, можно узнать в Википедии, а производная сигмовидной выглядит так:
Реализация Python выглядит следующим образом:
Давайте напишем этот код в файле Math.py. Также для обучения нам понадобятся 2 константы: скорость - скорость обучения count_learn — количество повторений тренировки Чем больше count_learn, тем лучше нейронная сеть будет учиться, но на обучение уйдет больше времени.def deriv_sig(x): return sig(x) * (1 - sig(x))
А со ставкой все понятно.
Присвоим значения константам: ставка = 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
после запуска нейросеть выдает
Теперь давайте вместо этого обновим входные данные
Состояние | Отвечать | |
1 | 1 | 1 |
Состояние | Отвечать | |
0 | 1 | 0 |
Теперь подведем итоги.
В серии статей об искусственных нейронных сетях мы изучали
- Принципы работы искусственных нейронов
- Принципы работы нейронных сетей
- Принципы обучения нейронных сетей
- Написал свою нейронную сеть
Вы можете найти окончательный код нейронной сети на моей странице GitHub .
Если вы хотите изучить математические формулы для обучения нейронных сетей, прочитайте эту статью .
Теги: #Машинное обучение #python #искусственный интеллект #ИИ #нейронные сети #машинное обучение #нейронные сети #нейронная сеть #AI #нейронная сеть #нейронная сеть с нуля
-
Главный Инструмент Для Каждого Ux-Эксперта
19 Oct, 24 -
Linux В Оперативной Памяти: Путь Debirf 2018
19 Oct, 24 -
Ппрвсн
19 Oct, 24