Нейросети - это то самое перспективное направление программирования. Сейчас они уже постепенно внедряются в наш обиход: реклама, основанная на ваших предпочтениях и т.п. У 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 попыток. А если увеличить количество расчетов до миллиона? Давайте проверим...
Я очень долго составлял материал для этой статьи и, чтобы замотивировать меня делать их дальше, пожалуйста, поставьте лайк и напишите комментарий
Мне будет приятно. Я буду рад узнать, что моя статья была кому то интересна!)) А на этом я с вами прощаюсь, можете попробовать поменять значения и поиграть с тем, что у вас получилось.
11010000101000111101000010110100110100001011000011010001100001111101000010111000