Найти в Дзене
Игры, фотошоп, IT

Пример простой нейросети на Python

Нейросети - это то самое перспективное направление программирования. Сейчас они уже постепенно внедряются в наш обиход: реклама, основанная на ваших предпочтениях и т.п. У YouTube и Twitch также имеются свои нейросети. Google, Яндекс... Да почти все их внедряют в свои продукты. Пора и вам научиться их создавать, а потом, при встрече с друзьями, вы сможете смело заявить, что умеете создавать нейросети. Круто, не правда ли? Как работают нейросети? Нейросеть - это совокупность нейронов, которые связываются друг с другом в цепочки. Каждое из звеньев - отдельный элемент, который отвечает за распознавание какого-либо критерия: например, цвета, размера, объема и так далее. При этом каждое звено имеет разный вес. А вместе нейросети видят предмет в целом. Эта система может работать по заданному алгоритму и обучаться самостоятельно. Если сложно, объясню на примере... Вы любите гулять, но у вас есть несколько факторов, определяющих, пойдете ли вы на прогулку сегодня или нет. Допустим, нас есть
Оглавление
Вот она, простейшая нейросеть, которую вы можете сделать сами
Вот она, простейшая нейросеть, которую вы можете сделать сами

Нейросети - это то самое перспективное направление программирования. Сейчас они уже постепенно внедряются в наш обиход: реклама, основанная на ваших предпочтениях и т.п. У YouTube и Twitch также имеются свои нейросети. Google, Яндекс... Да почти все их внедряют в свои продукты. Пора и вам научиться их создавать, а потом, при встрече с друзьями, вы сможете смело заявить, что умеете создавать нейросети. Круто, не правда ли?

Как работают нейросети?

Нейросеть - это совокупность нейронов, которые связываются друг с другом в цепочки. Каждое из звеньев - отдельный элемент, который отвечает за распознавание какого-либо критерия: например, цвета, размера, объема и так далее. При этом каждое звено имеет разный вес. А вместе нейросети видят предмет в целом. Эта система может работать по заданному алгоритму и обучаться самостоятельно.

Если сложно, объясню на примере...

Вы любите гулять, но у вас есть несколько факторов, определяющих, пойдете ли вы на прогулку сегодня или нет.

Наглядная схема, делал сам
Наглядная схема, делал сам

Допустим, нас есть 4 основных факторов, определяющих, пойдем ли мы гулять или нет: П - это погода (хорошая - 1, плохая - 0), Н - это настроение (хорошее - 1, плохое - 0), К - это компания (если у вас есть хорошая компания для прогулки, то 1, если нет - 0) и В - это выходной ли сегодня день или нет (да - 1, нет - 0)

Перейдем к практике

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

Даны 3 числа:

  • 1001
  • 0110
  • 1011
  • 111(?)

Какая цифра будет в конце последнего числа? В среднем, на решение этой задачи требуется около 30 секунд. Для человека, но не для искусственного интеллекта. Компьютер сможет решить её за несколько миллисекунд. Ну что, решили? Правильный ответ - 1. Последняя цифра каждого из этих четырехзначных чисел дублирует первую. Ну что ж, давайте научим находить последнюю цифру машину. Перейдём к созданию программы.

Перейдем в компилятор Python и установим модуль NumPy (но перед этим установите пакеты NumPy и SciPy), введя в консоль команду:

import numpy

(рекомендую этот сайт, если у вас не установлены нужные библиотеки. Заходите на сайт, удаляете шаблон и переходите к следующему пункту)

Когда модуль подключится, начнем писать программу:

import numpy
from numpy.random import rand

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

def Activation (x):
return 1 / (1 + numpy.exp (-x))
teachMatrix = numpy.array ([[1, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1]])

Создаем двумерный массив (матрицу) с нашими числами без последних цифр и называем teachMatrix. Далее создаем массив teachMatrixAnswers, состоящий из последних цифр наших чисел, не забыв перевернуть его в вертикальное положение функцией .T

teachMatrixAnswers = numpy.array ([[1, 0, 1, 1]]).T
numpy.random.seed (1)
sinaps = numpy.random.random ((3, 1))

И берем все числа от одного до трех рандомно. Программа будет решать нашу задачу методом подбора, циклом.

for i in range (2000):
inputLayout = teachMatrix
output = Activation (numpy.dot (inputLayout, sinaps))
err = teachMatrixAnswers - output
adj = numpy.dot (inputLayout.T, err * (output * (1 - output)))
sinaps += adj

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

У меня получилось. Я уверен, что у вас тоже получится
У меня получилось. Я уверен, что у вас тоже получится

Для удобства можете скопировать код ниже

import numpy
from numpy.random import rand
def Activation (x):
[TAB]return 1 / (1 + numpy.exp (-x))
teachMatrix = numpy.array ([[1, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
teachMatrixAnswers = numpy.array ([[1, 0, 1, 1]]).T
numpy.random.seed (1)
sinaps = numpy.random.random ((3, 1))
for i in range (2000):
[TAB]inputLayout = teachMatrix
[TAB]output = Activation (numpy.dot (inputLayout, sinaps))
[TAB]err = teachMatrixAnswers - output
[TAB]adj = numpy.dot (inputLayout.T, err * (output * (1 - output)))
[TAB]sinaps += adj
print (output)

Где [TAB], удалите и сделайте табуляцию.

Итоги

Мы добились того, что при входных числах 011, 101 и 111, программа без проблем находит последнюю цифру для каждого из чисел:

Для первого - 0.99937586, для второго - 0.02587273, для третьего - 0.99701349, а для четвертого - 0.97702636. Если округлять до целых эти числа, то мы получим правильный ответ. Программа максимально приблизилась к искомым числам с 2000 попыток. А если увеличить количество расчетов до миллиона? Давайте проверим...

Программа долго думала, но пришла к погрешности 0,01
Программа долго думала, но пришла к погрешности 0,01

Я очень долго составлял материал для этой статьи и, чтобы замотивировать меня делать их дальше, пожалуйста, поставьте лайк и напишите комментарий

Мне будет приятно. Я буду рад узнать, что моя статья была кому то интересна!)) А на этом я с вами прощаюсь, можете попробовать поменять значения и поиграть с тем, что у вас получилось.

11010000101000111101000010110100110100001011000011010001100001111101000010111000