От vc.ru том, как за несколько шагов создать простую нейронную сеть и научить её узнавать известных предпринимателей на фотографиях.

Шаг 0. Разбираемся, как устроены нейронные сети

Проще всего разобраться с принципами работы нейронных сетей можно на примере Teachable Machine — образовательного проекта Google.

В качестве входящих данных — то, что нужно обработать нейронной сети — в Teachable Machine используется изображение с камеры ноутбука. В качестве выходных данных — то, что должна сделать нейросеть после обработки входящих данных — можно использовать гифку или звук.

Например, можно научить Teachable Machine при поднятой вверх ладони говорить «Hi». При поднятом вверх большом пальце — «Cool», а при удивленном лице с открытым ртом — «Wow».

Для начала нужно обучить нейросеть. Для этого поднимаем ладонь и нажимаем на кнопку «Train Green» — сервис делает несколько десятков снимков, чтобы найти на изображениях закономерность. Набор таких снимков принято называть «датасетом».

Теперь остается выбрать действие, которое нужно вызывать при распознании образа — произнести фразу, показать GIF или проиграть звук. Аналогично обучаем нейронную сеть распознавать удивленное лицо и большой палец.

Как только нейросеть обучена, её можно использовать. Teachable Machine показывает коэффициент «уверенности» — насколько система «уверена», что ей показывают один из навыков.

Шаг 1. Готовим компьютер к работе с нейронной сетью

Теперь сделаем свою нейронную сеть, которая при отправке изображения будет сообщать о том, что изображено на картинке. Сначала научим нейронную сеть распознавать цветы на картинке: ромашку, подсолнух, одуванчик, тюльпан или розу.

Для создания собственной нейронной сети понадобится Python — один из наиболее минималистичных и распространенных языков программирования, и TensorFlow — открытая библиотека Google для создания и тренировки нейронных сетей.

Устанавливаем Python

  • Перевод
  • Tutorial

Что мы будем делать? Мы попробуем создать простую и совсем маленькую нейронную сеть, которую мы объясним и научим что-нибудь различать. При этом не будем вдаваться в историю и математические дебри (такую информацию найти очень легко) - вместо этого постараемся объяснить задачу (не факт, что удастся) вам и самим себе рисунками и кодом.

Многие из терминов в нейронных сетях связаны с биологией, поэтому давайте начнем с самого начала:


Мозг - штука сложная, но и его можно разделить на несколько основных частей и операций:

Возбудитель может быть и внутренним (например, образ или идея):

А теперь взглянем на основные и упрощенные части мозга:


Мозг вообще похож на кабельную сеть.

Нейрон - основная единица исчислений в мозге, он получает и обрабатывает химические сигналы других нейронов, и, в зависимости от ряда факторов, либо не делает ничего, либо генерирует электрический импульс, или Потенциал Действия, который затем через синапсы подает сигналы соседним связанным нейронам:

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

Разумеется, это всё упрощения и обобщения, но благодаря им мы можем описать простую
нейронную сеть:

И описать её формализовано с помощью графа:

Тут требуются некоторые пояснения. Кружки - это нейроны, а линии - это связи между ними,
и, чтобы не усложнять на этом этапе, взаимосвязи представляют собой прямое передвижение информации слева направо . Первый нейрон в данный момент активен и выделен серым. Также мы присвоили ему число (1 - если он работает, 0 - если нет). Числа между нейронами показывают вес связи.

Графы выше показывают момент времени сети, для более точного отображения, нужно разделить его на временные отрезки:

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

Когда на них направляют безопасную струю воздуха, кролики, как и люди, моргают:

Эту модель поведения можно нарисовать графами:

Как и в предыдущей схеме, эти графы показывают только тот момент, когда кролик чувствует дуновение, и мы таким образом кодируем дуновение как логическое значение. Помимо этого мы вычисляем, срабатывает ли второй нейрон, основываясь на значении веса. Если он равен 1, то сенсорный нейрон срабатывает, мы моргаем; если вес меньше 1, мы не моргаем: у второго нейрона предел - 1.

Введем еще один элемент - безопасный звуковой сигнал:

Мы можем смоделировать заинтересованность кролика так:

Основное отличие в том, что сейчас вес равен нулю , поэтому моргающего кролика мы не получили, ну, пока, по крайней мере. Теперь научим кролика моргать по команде, смешивая
раздражители (звуковой сигнал и дуновение):

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

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

Обучение сложному поведению можно упрощённо выразить как постепенное изменение веса между связанными нейронами с течением времени.

Чтобы обучить кролика, повторим действия:

Для первых трех попыток схемы будут выглядеть так:

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

Мы убрали воздействие воздухом, но кролик все еще моргает, услышав звуковой сигнал! Объяснить это поведение может наша последняя схемка:

Мы обучили кролика реагировать на звук морганием.


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

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

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

Мы можем изобразить (схематично), что делает кнопка при нажатии следующим образом:

Такую задачу лучше решать целиком, поэтому давайте посмотрим на все возможные результаты, включая правильный:


Нажмите на 3-ю кнопку, чтобы получить свой ужин.

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

Эта нейронная сеть просто получает входящую информацию - в данном случае это будет восприятие того, какую кнопку нажали. Далее сеть заменяет входящую информацию на веса и делает вывод на основе добавления слоя. Звучит немного запутанно, но давайте посмотрим, как в нашей модели представлена кнопка:


Обратите внимание, что все веса равны 0, поэтому нейронная сеть, как младенец, совершенно пуста, но полностью взаимосвязана.

Таким образом мы сопоставляем внешнее событие с входным слоем нейронной сети и вычисляем значение на ее выходе. Оно может совпадать или не совпадать с реальностью, но это мы пока проигнорируем и начнем описывать задачу понятным компьютеру способом. Начнем с ввода весов (будем использовать JavaScript):

Var inputs = ; var weights = ; // Для удобства эти векторы можно назвать
Следующий шаг - создание функции, которая собирает входные значения и веса и рассчитывает значение на выходе:

Function evaluateNeuralNetwork(inputVector, weightVector){ var result = 0; inputVector.forEach(function(inputValue, weightIndex) { layerValue = inputValue*weightVector; result += layerValue; }); return (result.toFixed(2)); } // Может казаться комплексной, но все, что она делает - это сопоставляет пары вес/ввод и добавляет результат
Как и ожидалось, если мы запустим этот код, то получим такой же результат, как в нашей модели или графике…

EvaluateNeuralNetwork(inputs, weights); // 0.00
Живой пример: Neural Net 001 .

Следующим шагом в усовершенствовании нашей нейросети будет способ проверки её собственных выходных или результирующих значений сопоставимо реальной ситуации,
давайте сначала закодируем эту конкретную реальность в переменную:

Чтобы обнаружить несоответствия (и сколько их), мы добавим функцию ошибки:

Error = Reality - Neural Net Output
С ней мы можем оценивать работу нашей нейронной сети:

Но что более важно - как насчет ситуаций, когда реальность дает положительный результат?

Теперь мы знаем, что наша модель нейронной сети не работает (и знаем, насколько), здорово! А здорово это потому, что теперь мы можем использовать функцию ошибки для управления нашим обучением. Но всё это обретет смысл в том случае, если мы переопределим функцию ошибок следующим образом:

Error = Desired Output - Neural Net Output
Неуловимое, но такое важное расхождение, молчаливо показывающее, что мы будем
использовать ранее полученные результаты для сопоставления с будущими действиями
(и для обучения, как мы потом увидим). Это существует и в реальной жизни, полной
повторяющихся паттернов, поэтому оно может стать эволюционной стратегией (ну, в
большинстве случаев).

Var input = ; var weights = ; var desiredResult = 1;
И новую функцию:

Function evaluateNeuralNetError(desired,actual) { return (desired - actual); } // After evaluating both the Network and the Error we would get: // "Neural Net output: 0.00 Error: 1"
Живой пример: Neural Net 002 .

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

Как обучать нейронную сеть?

Основа обучения как биологической, так и искусственной нейронной сети - это повторение
и алгоритмы обучения , поэтому мы будем работать с ними по отдельности. Начнем с
обучающих алгоритмов.

В природе под алгоритмами обучения понимаются изменения физических или химических
характеристик нейронов после проведения экспериментов:

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

Var learningRate = 0.20; // Чем больше значение, тем быстрее будет процесс обучения:)
И что это изменит?

Это изменит веса (прям как у кролика!), особенно вес вывода, который мы хотим получить:

Как кодировать такой алгоритм - ваш выбор, я для простоты добавляю коэффициент обучения к весу, вот он в виде функции:

Function learn(inputVector, weightVector) { weightVector.forEach(function(weight, index, weights) { if (inputVector > 0) { weights = weight + learningRate; } }); }
При использовании эта обучающая функция просто добавит наш коэффициент обучения к вектору веса активного нейрона , до и после круга обучения (или повтора) результаты будут такими:

// Original weight vector: // Neural Net output: 0.00 Error: 1 learn(input, weights); // New Weight vector: // Neural Net output: 0.20 Error: 0.8 // Если это не очевидно, вывод нейронной сети близок к 1 (выдача курицы) - то, чего мы и хотели, поэтому можно сделать вывод, что мы движемся в правильном направлении
Живой пример: Neural Net 003 .

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

Это не так уж и сложно, в природе мы просто делаем одно и то же снова и снова, а в коде мы просто указываем количество повторов:

Var trials = 6;
И внедрение в нашу обучающую нейросеть функции количества повторов будет выглядеть так:

Function train(trials) { for (i = 0; i < trials; i++) { neuralNetResult = evaluateNeuralNetwork(input, weights); learn(input, weights); } }
Ну и наш окончательный отчет:

Neural Net output: 0.00 Error: 1.00 Weight Vector: Neural Net output: 0.20 Error: 0.80 Weight Vector: Neural Net output: 0.40 Error: 0.60 Weight Vector: Neural Net output: 0.60 Error: 0.40 Weight Vector: Neural Net output: 0.80 Error: 0.20 Weight Vector: Neural Net output: 1.00 Error: 0.00 Weight Vector: // Chicken Dinner !
Живой пример: Neural Net 004 .

Теперь у нас есть вектор веса, который даст только один результат (курицу на ужин), если входной вектор соответствует реальности (нажатие на третью кнопку).

Так что же такое классное мы только что сделали?

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

Кроме того, это масштабируемая модель, игрушка и инструмент для нашего с вами обучения. Мы смогли узнать что-то новое о машинном обучении, нейронных сетях и искусственном интеллекте.

Предостережение пользователям:

  • Механизм хранения изученных весов не предусмотрен, поэтому данная нейронная сеть забудет всё, что знает. При обновлении или повторном запуске кода нужно не менее шести успешных повторов, чтобы сеть полностью обучилась, если вы считаете, что человек или машина будут нажимать на кнопки в случайном порядке… Это займет какое-то время.
  • Биологические сети для обучения важным вещам имеют скорость обучения 1, поэтому нужен будет только один успешный повтор.
  • Существует алгоритм обучения, который очень напоминает биологические нейроны, у него броское название: правило widroff-hoff , или обучение widroff-hoff .
  • Пороги нейронов (1 в нашем примере) и эффекты переобучения (при большом количестве повторов результат будет больше 1) не учитываются, но они очень важны в природе и отвечают за большие и сложные блоки поведенческих реакций. Как и отрицательные веса.

Заметки и список литературы для дальнейшего чтения

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

Биологическое строение мозга - тема не простая, отчасти из-за неточности, отчасти из-за его сложности. Лучше начинать с Neuroscience (Purves) и Cognitive Neuroscience (Gazzaniga). Я изменил и адаптировал пример с кроликом из Gateway to Memory (Gluck), которая также является прекрасным проводником в мир графов.

Еще один шикарный ресурс An Introduction to Neural Networks (Gurney), подойдет для всех ваших нужд, связанных с ИИ.

А теперь на Python! Спасибо Илье Андшмидту за предоставленную версию на Python:

Inputs = weights = desired_result = 1 learning_rate = 0.2 trials = 6 def evaluate_neural_network(input_array, weight_array): result = 0 for i in range(len(input_array)): layer_value = input_array[i] * weight_array[i] result += layer_value print("evaluate_neural_network: " + str(result)) print("weights: " + str(weights)) return result def evaluate_error(desired, actual): error = desired - actual print("evaluate_error: " + str(error)) return error def learn(input_array, weight_array): print("learning...") for i in range(len(input_array)): if input_array[i] > 0: weight_array[i] += learning_rate def train(trials): for i in range(trials): neural_net_result = evaluate_neural_network(inputs, weights) learn(inputs, weights) train(trials)
А теперь на GO! За эту версию благодарю Кирана Мэхера.

Package main import ("fmt" "math") func main() { fmt.Println("Creating inputs and weights ...") inputs:= float64{0.00, 0.00, 1.00, 0.00} weights:= float64{0.00, 0.00, 0.00, 0.00} desired:= 1.00 learningRate:= 0.20 trials:= 6 train(trials, inputs, weights, desired, learningRate) } func train(trials int, inputs float64, weights float64, desired float64, learningRate float64) { for i:= 1; i < trials; i++ { weights = learn(inputs, weights, learningRate) output:= evaluate(inputs, weights) errorResult:= evaluateError(desired, output) fmt.Print("Output: ") fmt.Print(math.Round(output*100) / 100) fmt.Print("\nError: ") fmt.Print(math.Round(errorResult*100) / 100) fmt.Print("\n\n") } } func learn(inputVector float64, weightVector float64, learningRate float64) float64 { for index, inputValue:= range inputVector { if inputValue > 0.00 { weightVector = weightVector + learningRate } } return weightVector } func evaluate(inputVector float64, weightVector float64) float64 { result:= 0.00 for index, inputValue:= range inputVector { layerValue:= inputValue * weightVector result = result + layerValue } return result } func evaluateError(desired float64, actual float64) float64 { return desired - actual }

Теги: Добавить метки

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

Думаю, практически все видели фантастический блокбастер "Терминатор". Суть его сводится к тому, что некая "разумная" сеть под названием "Скайнет" взбунтовалась против людей, решив захватить мир при помощи массированной ядерной атаки и разного рода роботов (собственно, терминаторов).

Казалось бы, просто фантастика, но на самом деле реальные прообразы всяческих "скайнетов" и "матриц" уже давно существуют! Имя им - нейросети. Многие, думаю, о них слышали, но немногие могут объяснить, что это такое. Поэтому сегодня мы постараемся разобраться с этими нейронными сетями.

Что такое нейросеть

Чтобы понять что такое искусственная нейросеть, нужно иметь представление о реальной биологической нейронной сети. Если упрощённо, то структурной единицей её является нейрон (в ИНС его называют ещё перцептроном), который может принимать и передавать по своим отросткам (коротким дендритам или длинным аксонам) нервные импульсы.

От типа импульса зависит дальнейший его путь. Это обусловлено тем, что нейрон выступает в роли простейшего процессора и может классифицировать поданный на него "сигнал" для дальнейшего перенаправления. Причём принимать импульсы он способен одновременно от нескольких источников, реализуя принцип нелинейности и параллельности их распределения.

В процессе жизнедеятельности живого организма между его нервными клетками устанавливаются устойчивые взаимосвязи на конкретные раздражители. То есть, формируются определённые модели реакций и условные рефлексы. Это направление в своё время изучал всем известный академик И.П. Павлов. Как раз на примере его опытов с собаками можно чётко понять как работает нейронная сеть.

Как мы знаем, Павлов делал следующее. Вначале на собаку производилось воздействие светом (лампочка) или звуком (колокольчик). Затем к этим раздражителям добавлялась еда. Причём еде всегда предшествовала визуальная или аудиальная стимуляция. У собак при виде еды начинала усиленно вырабатываться слюна.

Однако, когда после нескольких сеансов с предшествующими раздражителями Павлов убрал еду, слюна при предварительной стимуляции всё равно выделялась. По этому объективному признаку учёный и заключил, что в мозгу собаки установились устойчивые синаптические (синапс - место контакта нейронов) связи, которые реагируют на конкретный раздражитель, изначально никак не связанный с ожидаемой реакцией.

Приведённый выше пример ярко иллюстрирует самую важную характеристику любой (хоть биологической, хоть искусственной) нейроной сети: обучаемость . Обучается нейросеть за счёт накопления опыта путём установки постоянных синаптических связей между отдельными нейронами.

Здесь уместно привести аналогию с изучением детьми букв алфавита. Если показать, скажем, букву "А" взрослому, он её сразу узнает, поскольку имеет уже предварительный опыт её опознания. Ребёнок же, который только учит буквы, должен для начала увидеть различные варианты начертания буквы "А" и сопряжения её с другими буквами, прежде чем научится безошибочно её определять.

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

Таким образом, нейросеть в грубом приближении напоминает маленького ребёнка, которого чему-либо учат. Научившись, она будет выполнять свою работу с огромной скоростью, которая превышает скорость выполнения аналогичной работы человеком в разы! И в этом причина популярности нейросетей.

Виды нейросетей

Выше мы примерно выяснили как работают нейросети, но так и не получили ответ на вопрос, как же они выглядят. А дело в том, что выглядеть они могут по-разному. Тут зависит от того, какие задачи должна выполнять та или иная нейронная сеть. По принципу работы (и внешнему виду, соответственно) нейросети можно разделить на три категории:

  1. Программные . Полностью виртуальные сети, реализованные на программном уровне и выполняющиеся на обычном ПК или сервере.
  2. Программно-аппаратные . Нейросети, которые управляются специальным ПО, но для получения данных или вывода их используют специфическое аппаратное обеспечение Например, искусственные рецепторы, фотодатчики и т.п.
  3. Аппаратные (или аналоговые). Сети, которые используют в качестве нейронов не программный код, а реальные микропроцессоры или иные устройства приёма-передачи сигналов. Полностью аппаратными были нейросети уже прошлого ХХ века. Сегодня чаще используются именно программно-аппаратные решения.

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

Именно программные нейросети получили широкое распространение в последние годы. Их внедряют как в научное, так и в прикладное и даже развлекательное ПО. Ярким примером тому могут стать популярные мобильные приложения для обработки фотографий и стилизации их под картины, вроде Prisma или веб-сервисы наподобие Ostagram :

В научной среде, где ставятся более функциональные задачи, чаще используются нейросети, состоящие из программно-аппаратных комплексов. Например, в медицине на базе нейросетей создаются весьма современные протезы, способные управляться обычными нервными импульсами головного мозга и даже имеющие искусственные рецепторы, позволяющие получать обратную осязательную связь или опознавать захватываемые предметы, автоматически регулируя силу и тип хвата:

Кстати, нельзя со счетов списывать и полностью аналоговые нейросети. В последнее время из-за развития квантовых вычислений и значительных успехов в области изучения искусственного интеллекта, аппаратные нейросети могут вскоре пережить буквально второе рождение. Уже разрабатываются новые типы процессоров, которые способны хранить в себе информацию в виде так называемых графов, которые являют собой графики описания нейронов и синапсов нейросетей:

Снабжённые собственной памятью, такие процессоры (IPU - сокр. от Intelligent Processor Unit) смогут в разы ускорить выполнение различных расчётов, даже в сравнении с используемыми нынче решениями на базе плат видеоускорения с графическими процессорами (GPU).

Популярные сервисы с нейросетями

На самом деле нейросети уже совсем рядом с нами! Крупные поисковые гиганты такие как Гугл и Яндекс используют их как для улучшения алгоритмов поисковой выдачи, так и для некоторых отдельных сервисов, вроде или новомодного голосового помощника Алиса от Яндекса. Однако, есть и более узкоспециализированные сервисы и приложения, которые используют нейросети в различных областях науки и искусства.

Нейросети в изобразительном искусстве

Фактически именно с изобразительного искусства, а точнее с фотообработки, и начался в прошлом году информационный бум вокруг нейросетей. В AppStore и Google Play появилось уже упомянутое нами приложение Prisma . С тех пор у него появилось довольно много подражателей, которые превращают фотографии пользователей в оригинальные картины. Однако, нейросети умеют не только стилизовать фото, но и самостоятельно рисовать, дорисовывать или угадывать Ваши рисунки!

Например, Вы - девушка и хотите себе оригинальный аватар в стиле аниме, похожий на Вас. Но при этом Вы не желаете использовать собственные фото для его создания. Нет проблем! Вам поможет сервис MakeGirlsMoe . Просто выберите тип модели из выпадающего списка, задайте основные параметры портрета и нейросеть сама нарисует вполне няшное лицо:

Очень большое распространение получили также нейросети, которые дорисовывают Ваши "художества". Например, из кривых каляк-маляк мышью нейросеть Neural Doodle может создать вполне приличные картины в стиле известных художников-импрессионистов. А, например, простенький онлайн-сервис Pix2Pix превращает Ваши каракули в котов:)

Много различных разработок на базе нейросетей есть у уже упомянутого Гугла. Для экспериментов с ними даже создан отдельный сайт AIExperiments . Среди всех сервисов мне лично приглянулась небольшая игра под названием . Вам даётся задание за 20 секунд нарисовать что-то, а искусственный интеллект попытается за это время по незавершённому рисунку угадать, что Вы пытаетесь изобразить:

Кстати, опыт этой же нейросети используется другим сервисом AutoDraw . Здесь Вы можете делать набросок любого объекта, а искусственный интеллект будет предлагать готовые варианты изображений, которые Вы, возможно, хотели бы изобразить.

Это всё, конечно, развлечение, но есть нейросети и для решения более прикладных задач. Например, сервис позволяет автоматически раскрасить чёрно-белые фотографии прямо в окне Вашего браузера. Результаты, правда, не всегда идеальны, но сеть постоянно обучается, поэтому в ближайшем будущем из неё может получиться отличный инструмент на подмогу ретушёрам!

Нейросети в музыке

Не обошли вниманием разработчики нейросетей и такую область искусства как музыка. То и дело в новостях мелькают заголовки о том, что нейросети научились генерировать классические произведения в стиле известных композиторов прошлого или наоборот современные ambient-треки. Правда, пока такие нейросети больше находятся в частном доступе их разработчиков и ещё проходят обучение, но кое-что уже сейчас можно попробовать в деле.

Примером доступной уже сейчас музыкальной нейросети можно назвать сервис . Перейдя на сайт сервиса Вы не получите никаких инструментов настройки (возможно, только пока), но из Ваших колонок начнёт звучать сгенерированная полностью при помощи нейросети электронная музыка. По заверениям разработчиков такая музыка позволяет расслабиться и сосредоточиться на чём-либо. Для обладателей техники Apple на AppStore доступна мобильная версия сервиса .

Другим примером более функционального музыкального ПО на базе нейросети может стать сервис Flow-Machines . Этот сервис позволяет создавать композиции преимущественно в стилях джаз, латина и бродвейский поп. Вам нужно лишь задать последовательность аккордов, а нейросеть сама создаст на них гармоничную мелодию. Единственный недостаток, в данный момент публичная регистрация на сервисе не работает, поэтому "пощупать" что к чему у меня, увы, не получилось:(

Зато генератор музыки доступен всем и работает весьма сносно! В бесплатной версии Вы можете генерировать треки в стилях хип-хоп, саундтрек к фильмам, рок, фолк или поп 90-х. Из настроек доступен выбор настроения, темпа, длительности, тональности и набора инструментов для будущей композиции:

Нейросети в других отраслях

Открытых и бесплатных сервисов с использованием нейросетей пока ещё не так много, но они есть для решения практически любых задач. Нужно только поискать (правда, искать следует на английском, поскольку в Рунете открытых нейросетей раз-два и обчёлся)...

Для специалистов в области сайтостроения и дизайна в качестве интересных и полезных инструментов можно назвать сервисы uKit AI , Everypixel и . Первый сервис позволяет получить кликабельный современный шаблон для сайта - отличное решение для тех, кто решился на редизайн. Второй предлагает нам инструмент для поиска изображений с возможностью фильтрации по различным параметрам и одновременной оценки привлекательности картинки для пользователя. Последний, как видно из названия, позволяет генерировать логотипы:

Кстати, в данный момент ведётся активное обучение нейросети под названием Pix2Code , которая призвана облегчить (а то и вовсе заменить) работу верстальщика сайтов. Задача данной сети - генерация функционального кода сайта на HTML и CSS по предоставленному макету в формате JPEG.

Существуют нейросети для создания текстов и даже написания стихов в стиле любых известных поэтов. Примером тому может стать недавний дебют группы Нейронная Оборона с композициями в стиле Егора Летова, слова к которым были созданы нейросетью Яндекса. Начинают появляться нейросети и в играх. Например, создана нейросеть, играющая в настольную игру го лучше некоторых мастеров!

А уж сколько нейросетей существует для задач аналитики и прогнозирования популярных бирж Форекс, криптовалют, вроде биткоина и т.п. Правда, большинство из них платные. Но при желании можно найти и различные пробные демо-версии, либо приложения, которые предоставляют часть функционала на безвозмездной основе.

Выводы

Сегодня можно однозначно сказать, что нейросети вышли из стен всяческих научных лабораторий и уверенно входят в повседневную жизнь простых пользователей. Да, их ещё не так много и они далеко не идеально работают порой, но то, что мы можем ими пользоваться - уже большой плюс! Думаю, пройдёт ещё пара-тройка лет и нейросети обучатся до той степени, когда смогут реально значительно облегчать трудоёмкие и монотонные задачи.

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

P.S. Разрешается свободно копировать и цитировать данную статью при условии указания открытой активной ссылки на источник и сохранения авторства Руслана Тертышного.

В этот раз я решил изучить нейронные сети. Базовые навыки в этом вопросе я смог получить за лето и осень 2015 года. Под базовыми навыками я имею в виду, что могу сам создать простую нейронную сеть с нуля. Примеры можете найти в моих репозиториях на GitHub. В этой статье я дам несколько разъяснений и поделюсь ресурсами, которые могут пригодиться вам для изучения.

Шаг 1. Нейроны и метод прямого распространения

Так что же такое «нейронная сеть»? Давайте подождём с этим и сперва разберёмся с одним нейроном.

Нейрон похож на функцию: он принимает на вход несколько значений и возвращает одно.

Круг ниже обозначает искусственный нейрон. Он получает 5 и возвращает 1. Ввод - это сумма трёх соединённых с нейроном синапсов (три стрелки слева).

В левой части картинки мы видим 2 входных значения (зелёного цвета) и смещение (выделено коричневым цветом).

Входные данные могут быть численными представлениями двух разных свойств. Например, при создании спам-фильтра они могли бы означать наличие более чем одного слова, написанного ЗАГЛАВНЫМИ БУКВАМИ, и наличие слова «виагра».

Входные значения умножаются на свои так называемые «веса», 7 и 3 (выделено синим).

Теперь мы складываем полученные значения со смещением и получаем число, в нашем случае 5 (выделено красным). Это - ввод нашего искусственного нейрона.

Потом нейрон производит какое-то вычисление и выдает выходное значение. Мы получили 1, т.к. округлённое значение сигмоиды в точке 5 равно 1 (более подробно об этой функции поговорим позже).

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

Иллюстрация нейронной сети с Википедии.

Если вы объедините эти нейроны, то получите прямо распространяющуюся нейронную сеть - процесс идёт от ввода к выводу, через нейроны, соединённые синапсами, как на картинке слева.

Шаг 2. Сигмоида

После того, как вы посмотрели уроки от Welch Labs, хорошей идеей было бы ознакомиться с четвертой неделей курса по машинному обучению от Coursera , посвящённой нейронным сетям - она поможет разобраться в принципах их работы. Курс сильно углубляется в математику и основан на Octave, а я предпочитаю Python. Из-за этого я пропустил упражнения и почерпнул все необходимые знания из видео.

Сигмоида просто-напросто отображает ваше значение (по горизонтальной оси) на отрезок от 0 до 1.

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

Но на одних видео далеко не уедешь. Для полного понимания я решил закодить её самостоятельно. Поэтому я начал писать реализацию алгоритма логистической регрессии (который использует сигмоиду).

Это заняло целый день, и вряд ли результат получился удовлетворительным. Но это неважно, ведь я разобрался, как всё работает. Код можно увидеть .

Вам необязательно делать это самим, поскольку тут требуются специальные знания - главное, чтобы вы поняли, как устроена сигмоида.

Шаг 3. Метод обратного распространения ошибки

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

В закладки

Рассказываем, как за несколько шагов создать простую нейронную сеть и научить её узнавать известных предпринимателей на фотографиях.

Шаг 0. Разбираемся, как устроены нейронные сети

Проще всего разобраться с принципами работы нейронных сетей можно на примере Teachable Machine - образовательного проекта Google.

В качестве входящих данных - то, что нужно обработать нейронной сети - в Teachable Machine используется изображение с камеры ноутбука. В качестве выходных данных - то, что должна сделать нейросеть после обработки входящих данных - можно использовать гифку или звук.

Например, можно научить Teachable Machine при поднятой вверх ладони говорить «Hi». При поднятом вверх большом пальце - «Cool», а при удивленном лице с открытым ртом - «Wow».

Для начала нужно обучить нейросеть. Для этого поднимаем ладонь и нажимаем на кнопку «Train Green» - сервис делает несколько десятков снимков, чтобы найти на изображениях закономерность. Набор таких снимков принято называть «датасетом».

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

Как только нейросеть обучена, её можно использовать. Teachable Machine показывает коэффициент «уверенности» - насколько система «уверена», что ей показывают один из навыков.

Кроткое видео о работе Teachable Machine

Шаг 1. Готовим компьютер к работе с нейронной сетью

Теперь сделаем свою нейронную сеть, которая при отправке изображения будет сообщать о том, что изображено на картинке. Сначала научим нейронную сеть распознавать цветы на картинке: ромашку, подсолнух, одуванчик, тюльпан или розу.

Для создания собственной нейронной сети понадобится Python - один из наиболее минималистичных и распространенных языков программирования, и TensorFlow - открытая библиотека Google для создания и тренировки нейронных сетей.