Создать ии в браузере
Существует большая вероятность, что за последние месяцы вы хотя бы раз слышали о нейронной сети или искусственном интеллекте, которые, как представляется, творят чудеса: оценка вашего селфи, SIRI, понимающая ваш голос, победа над человеком в таких играх, как Шахматы и Го, превращение лошади в зебру на произвольной картинке или нейросеть, делающая вас моложе, старше или меняющая ваш пол на любом фото.
От частого использования словосочетания «Искусственный Интеллект» в разных контекстах само понятие стало настолько размытым, что оно в лучшем случае коррелирует с «чем-то, что выглядит умным».
Возможно, из-за такой путаницы машинное обучение кажется слишком сложным для понимания, типа: «Готов поспорить, столько математики — не для меня!».
Не парьтесь, у меня та же история, так что давайте отправимся в путешествие. Я расскажу вам все, что узнал, мои заблуждения, способ правильно интерпретировать результаты и некоторые основные словарные и интересные факты на этом пути.
Представьте себе коробку, в которой вы вырезаете несколько отверстий и размещаете предопределенное количество чисел 0 или 1 . Затем коробка бурно вибрирует и выдает из каждого отверстия одно число: 0 или 1 . Отлично.
Изначально ваша коробка тупая, как картон: она не выдаст ожидаемый результат магическим образом. Вы должны обучить ее достижению желаемой цели.
Моя самая большая ошибка — попытка осилить концепции, просто глядя на верхушку айсберга, играя с библиотеками и бомбить, когда ничего не работает. При попытке понять нейронные сети это непозволительно.
Изобретение этого магического термина датируется около 1943 года, когда 45-летний нейрофизиолог Уоррен Стургис Мак-Каллок и его коллега Уолтер Питтс написали статью под названием «Логическое исчисление идей, присущих нервной деятельности».
По примеру классических философов Греции, Мак-Каллок попытался математически смоделировать работу мозга.
Это была яркая идея, учитывая то, как долго на тот момент было известно о существовании нейрона (примерно с 1900-х годов) и что электрическая природа их сигналов будет продемонстрирована только в конце 1950-х годов.
Давайте здесь остановимся и вспомним, что опубликованные статьи не означают, что написавший их человек был абсолютно прав. Это означало: у парня была гипотеза, он знал кое что в этой области, имел какие-то результаты (иногда неприменимые) и опубликовал это. Затем другие квалифицированные люди из этой области должны воспроизвести результаты и решить, стоит ли на этом строить новую теорию.
Некоторые научные работы, будучи никем не проверяемы, могут породить аберрации, подобные этой статье 2011 года, в которой говорится, что люди могут видеть будущее.
Тем не менее, теперь мы знаем, что Мак-Каллок был нормальным парнем и в своей статье он попытался смоделировать некоторые алгоритмы физического мозга, лежащие в основе нервной системы (которой обладает большинство многоклеточных животных), являющейся на самом деле сетью нейронов.
Надеюсь, читая дальше, вы не потеряете слишком много таких штук (источник)Человеческий мозг имеет
86 миллиардов нейронов, каждый из которых имеет аксоны, дендриты и синапсы, соединяющие каждый нейрон с
7000 других. Это почти столько же связей, сколько галактик во Вселенной.
Проблема для Мак-Каллока заключалась в том, что в 1943 году экономическая ситуация была не очень оптимистичной: США в состоянии войны, Франклин Д. Рузвельт, чтобы предотвратить инфляцию, заморозил цены и заработную плату, Никола Тесла скончался, а лучшим компьютером был ЭНИАК, который стоил 7 миллионов долларов за 30 тонн (в то время в технике властвовал дикий сексизм, поэтому тот факт, что ЭНИАК был изобретен 6 женщинами, заставил их коллег мужчин ошибочно его недооценивать). Для сравнения: стандартный телефон Samsung 2005 года имел в 1300 раз большую вычислительную мощность, чем ЭНИАК.
Затем в 1958 году компьютеры стали немного лучше и Фрэнк Розенблатт, вдохновленный Мак-Каллоком, подарил нам Перцептрон.
Пока все были заняты развитием этих идей, 11 лет спустя Марвин Мински решил, что ему не нравится эта идея, как и то, что Фрэнк Розенблатт не отстранен от работы. Он объяснился, опубликовав книгу, в которой сказал: «Большинство работ Розенблатта… Не имеют научной ценности…». Влияние этой книги заключается в том, что она истощила и без того низкое финансирование в этой области.
Какие были доводы Мински против падавана Мак-Каллока?
Хотя это понятие может звучать как название серии «Теории Большого Взрыва», оно фактически представляет собой основу теории Минского, призванной отвлечь от оригинального Перцептрона.
Перцептрон Розенблатта очень похож на нашу коробку, в которой на этот раз мы пробурили одно отверстие:
Нейронная сеть на самом деле может принимать на вход значения между 0 и 1Если сумма наших входных сигналов (x1…x4), умноженная на их весовые коэффициенты (w1…w4) плюс смещение (b), достаточна для того, чтобы заставить результирующий затвор превышать порог (T), наша дверь выдаст значение 1 , иначе - 0 .
Чтобы это произошло, пороговое значение сравнивается с результатом функции активации. Точно так же, как мозговые нейроны реагируют на стимул. Если раздражитель слишком низок, нейрон не пропускает сигнал вдоль аксона к дендритам.
В общем случае в коде это выглядит так:
В организме человека ток нейрона в спокойном состоянии составляет -70 мВ, а его порог активации -55 мВ. В случае оригинального Перцептрона эта активация обрабатывается ступенчатой функцией Хевисайда.
0, если x отрицательный, 1 — если нет. X является суммой входных весов и смещенияОдной из наиболее известных функций активации является сигмоидальная функция: F (x) = 1 / (1 + exp (-x)) и сдвиг (bias) обычно используется для смещения порога активации:
Изменение функции активации может привести к большей вариативности результатов при срабатывании нейроновНекоторые функции активации могут давать отрицательные значения, а некоторые — нет. Это будет иметь важное значение при использовании результатов функции активации одного перцептрона для подачи в качестве входов другого перцептрона.
Использование 0 в качестве входного сигнала исключает связанный с ним вес из конечной суммы.
Таким образом, вместо наличия возможности получения отрицательного веса, 0 действует как деактиватор. Тогда как нам может потребоваться этот вес для инверсии значимости входа в итоговой сумме.
Перцептрон известен как бинарный классификатор. Это означает, что он может классифицировать только 2 класса (спам или не спам, апельсин или не апельсин… и так далее).
Его также можно назвать линейный классификатор. Его цель состоит в том, чтобы определить, к какому классу принадлежит объект в соответствии со своими характеристиками (или «функциями»: наши x1-x4), производя итерации до тех пор, пока не будет найдена линия, которая правильно отделяет объекты разных классов друг от друга.
Мы даем нашему классификатору некоторые примеры ожидаемых результатов, учитывая некоторые исходные данные, и он тренируется на поиск этого разделения путем регулировки сдвига и весов на каждом вводе.
В качестве примера давайте с использованием перцептрона классифицируем некоторые сущности по принципу «опасен или нет» в соответствии с двумя характеристиками: количество зубов и размер.
В зависимости от случая кошка может быть не того класса, что ожидаетсяТеперь, когда мы натренировали наш перцептрон, мы можем классифицировать образцы, которых он никогда не видел:
Здесь живая демка. Нет, серьезно, зацените. (прим. пер.: здесь исходный код с переводом интерфейса.)
То, в чем Минский упрекал Розенблатта, состояло примерно в следующем: что, если вдруг мой тренировочный набор содержал гигантскую змею, почти не имеющую зубов, но большую, как слон.
Тренировочный набор бывает невозможно разделить одной линиейТеперь требуется две линии, чтобы правильно отделить красные объекты от зеленых. При использовании одного перцептрона, эта невозможность заставит его приспосабливаться вечно, будучи неспособным разделить входные данные на классы одной прямой.
Вы уже, должно быть, понимаете обычное представление перцептрона:
Сдвиг (bias) может применяться либо после вычисления суммы, либо в качестве добавленного веса для мнимого ввода, всегда равного 1Один из способов — просто обучить два перцептрона: один ответственный за верхнее левое разделение, другой — за нижнее правое. Подключая их вместе через логическое «и», мы создаем некий мультиклассовый перцептрон.
Существуют и другие способы решения этой проблемы, которые мы рассмотрим в части 2Операция «логическое И», обозначаемая A^B, — одна из логических операций, которые может выполнять перцептрон. Полагая w5 и w6 равными примерно 0,6 и применяя смещение -1 к нашей сумме, мы действительно создали предиктор AND.
Помните, что входы, связанные с w5 и w6, поступают от активации ступенчатой функции Heaviside, которая дает только 0 или 1 в качестве выхода.
Выполняя эту цепочку и имея «удлиненный» наш первоначальный перцептрон, мы создали так называемый скрытый слой, который в основном представляет собой несколько нейронов, вставленных между исходными входами и конечным выходом.
На самом деле их следует называть «слоями детекторов признаков» или «слоями подпроцессов»Хуже всего то, что Минский все это знал и решил сосредоточиться на простейшей версии перцептрона, чтобы дискредитировать все работы Розенблатта. Розенблатт уже рассмотрел многослойный и перекрестно-связанный перцептрон в своей книге «Принципы нейродинамики: перцептроны и теория механизмов мозга» в 1962 году.
Все это подобно публикации книги про транзисторы, в которой непризнание компьютера мотивируется тем, что обособленный транзистор бесполезен.
Вы все должны быть знакомы со следующими уравнениями: y = f(x) , Y = mx + c или y = ax + b .
Итак, как мы получаем эти m и c из нашего тренированного перцептрона?
Чтобы понять это, мы должны вспомнить исходное уравнение нашего перцептрона: x1 * w1 + x2 * w2 + bias > T .
Смещение (bias) и порог (threshold) — это одинаковые понятия, а для перцептрона T = 0 , что означает, что уравнение принимает вид:
x1 * w1 + x2 * w2 > -bias , что можно переписать как:
X2 > (-w1 / w2) * x1 + (-bias / w2) , сравнивая это с:
Y = m * x + b , мы можем видеть, что
M это (-w1 / w2) и b это (-bias / w2) .
Это означает, что градиент (m) нашей линии определяется двумя весами, а точка пересечения прямой и вертикальной оси определяется сдвигом (bias) и вторым весом.
Теперь мы можем просто выбрать два значения x ( 0 и 1 ), заменить их в линейном уравнении и найти соответствующие значения y , а затем проследить линию между двумя точками (0; f(0)) и (1; f(1)) .
Подобно оцепленному месту преступления, имея доступ к уравнению, мы можем включить дедукцию:
- Градиент (угол поворота) линии зависит только от двух весов
- Знак минус перед w1 означает, что если оба веса имеют один и тот же знак, линия будет наклонена вниз, как \ , а если они отличаются друг от друга, она будет направлена вверх /
- Регулировка w1 будет влиять на угол поворота, но не на координату точки пересечения с вертикальной осью, вместе с тем w2 будет влиять и на угол поворота и на координату точки пересечения
- Поскольку сдвиг (bias) — это числитель (верхняя половина фракции), его увеличение поднимает линию выше по оси. (точка пересечения с вертикальной осью будет выше)
Вы можете проверить окончательные веса в демо, введя в консоли app.perceptron.weights .
И это именно то, что наш перцептрон пытается оптимизировать, пока не найдет правильную линию.
Я знаю, это может выглядеть как 2 линии, но это одна, движущаяся супер быстроОчевидно, наш перцептрон не может угадать вслепую и пробует каждое значение для своих весов, пока не найдет линию, правильно разделяющую сущности. Мы должны применять правило дельты.
Это правило обучения для обновления весов, связанных с входами в однослойной нейронной сети. Оно имеет следующее представление:
Не беспокойтесь, это может быть «упрощено» следующим образом:
Мы делаем это для каждого вхождения в тренировочном набореСопоставление ожидаемое - фактическое показывает значение ошибки (или стоимость). Цель состоит в том, чтобы пройти через тренировочный набор и уменьшить эту ошибку/стоимость до минимума, добавляя или вычитая небольшое количество весов каждого входа до тех пор, пока не совпадут с ответами все ожидания тренировочного набора.
Если после некоторых итераций ошибка равна 0 для каждого элемента в наборе тренировок, наш перцептрон обучен, и наше линейное уравнение, использующее эти конечные веса, правильно разделяет входящие наборы на классы.
В приведенном выше уравнении α представляет собой константу: скорость обучения, которая будет влиять на то, как изменяется каждый вес.
- Если α слишком мала, для поиска правильных весов потребуется больше итераций и вы можете попасть в локальные минимумы.
- Если α слишком велика, обучение может никогда не найти правильных весов.
Один из способов увидеть это — вообразить бедного парня в железных сапогах, связанных вместе, который хочет достичь сокровища на дне скалы, но он может двигаться только прыжком на α метров:
В случае дельта-формулы в содержании говорилось, что она не может быть применена к перцептрону, потому что у функции Хевисайда не существует производной в точке 0 , но в разделе «Разговор» приведены статьи преподавателей MIT, использующих ее.
Собрав воедино все, что мы узнали, мы, наконец, кодим перцептрон:
Кроме того, Перцептрон относится к категории нейронных сетей прямого распространения, которая является просто причудливой формулировкой, говорящей о том, что связи между элементами сети не образуют цикл.
В чем была некоторая правота Мински: при том что алгоритм перцептрона гарантированно сходится на каком-либо решении в случае линейно разделяемого обучающего набора, он все равно может выбрать любое допустимое решение, а некоторые проблемы могут допускать множество решений различного качества.
Ваш мозг делает почти то же самое. Как только он найдет правильный способ взаимодействовать с мышцей (например: мышца реагирует сокращением), он будет использовать этот способ и далее. Эти связи «мозг-мышца» для всех разные.
Интеллектуалы любят спорить друг с другом, как Мински и Розенблатт. Даже Эйнштейн оказался неправ в своей борьбе против Нильса Бора по вопросу квантового индетерминизма, утверждая своей знаменитой цитатой: «Бог не играет в кости».
Мы закончим поэтическими строками от отца нейронных сетей Уоррена Мак-Каллока (он действительно был поэтом).
Вы — веб-разработчик, заинтересовавшийся искусственным интеллектом (AI)? Хотите с легкостью создать приложения AI полностью на JavaScript, которые будут работать где угодно, без головной боли от утомительной установки, размещения на облачных сервисах или работы с Python? Тогда TensorFlow.js для вас!
Эта библиотека смещает парадигму и устраняет разрыв между разработчиками веб-интерфейсов и ранее трудоемким процессом обучения и приручения AI. Теперь разработчики могут с легкостью использовать искусственный интеллект для создания приложений, реагирующих в реальном времени на вводимые пользователем голосовые и мимические данные, или для создания более интеллектуальных приложений, которые учатся на поведении пользователей и адаптируются к ним. AI может создавать новые, личныевпечатления и автоматизировать утомительные задачи. Примерами могут служить системы рекомендаций, взаимодействие с помощью голосовых команд или жестов, использование камеры мобильного телефона для идентификации продуктов или мест, а также обучение, помогающее пользователю решать повседневные задачи. По мере того, как постоянно ускоряющаяся революция в искусственном интеллекте находит свое применение в интеллектуальных веб-приложениях, это также может стать ценным навыком, чтобы произвести впечатление на вашего начальника или потенциальных работодателей.
В первой части серии мы кратко расскажем о преимуществах TensorFlow.js по сравнению с традиционными подходами с бэкэндом на Python, чтобы продемонстрировать, почему это так важно.
В прошлом многие из лучших фреймворков машинного обучения (ML) и глубокого обучения (DL) требовали свободного владения Python и связанной с ним экосистемой библиотек. Эффективное обучение моделей ML требовало использования специального аппаратного и программного обеспечений, таких как графические процессоры NVIDIA и CUDA. На сегодняшний день интеграция ML в приложения JavaScript часто означает развертывание части ML в удаленных облачных сервисах, таких как AWS Sagemaker, и обращение к ней по API. Этот не родной, ориентированный на бэкэнд подход, вероятно, не позволил многим веб-разработчикам воспользоваться преимуществами, предлагаемыми AI для интерфейса.
С TensorFlow.js все не так! Преодолев вышеописанные препятствия, использование AI-решений стало быстрым, легким и увлекательным. Во второй части серии мы покажем, как легко создавать, обучать и тестировать собственные модели ML в браузере, используя только JavaScript!
Теперь вы можете писать код для ML на JavaScript, но действительно круто то, что TensorFlow.js позволяет исполнять его на стороне клиента, что имеет ряд неоспоримых преимуществ.
Предоставьте пользователю URL, и, вуаля, он взаимодействует с вашей моделью ML. Это так просто! Модели запускаются прямо в браузере без дополнительных файлов или установок. Вам больше не нужно связывать JavaScript с Python, работающим в облаке. И вместо того, чтобы бороться с виртуальными средами или менеджерами пакетов, все зависимости могут быть добавлены тегами script в HTML. Это позволяет эффективно работать в команде, быстро создавать прототипы и безболезненно проверять идеи.
Обучение и прогнозирование осуществляется на аппаратном обеспечении пользователя. Это исключает значительные затраты и усилия для разработчика. Вам не нужно беспокоиться о поддержке работы потенциально дорогостоящей удаленной машины и регулировке вычислительной мощности в зависимости от изменения объема использования. Забудьте о балансировке нагрузки, микросервисах, контейнеризации. Исключая подобные требования к серверной инфраструктуре, TensorFlow.js позволяет вам сосредоточиться на создании удивительных пользовательских интерфейсов! Тем не менее, мы все равно должны позаботиться о том, чтобы аппаратное обеспечение клиента было достаточно мощным для обеспечения удовлетворительного опыта, учитывая вычислительные требования наших моделей искусственного интеллекта.
Это крайне важно, так как пользователи все больше заботятся о защите своей конфиденциальной информации, особенно после массовых скандалов с данными и нарушений безопасности, таких как Cambridge Analytica. С TensorFlow.js пользователи могут использовать AI, не отправляя свои личные данные по сети и не передавая их третьим лицам. Это облегчает создание безопасных приложений, например, приложений для здравоохранения, которые подключаются к носимым медицинским датчикам. TensorFlow.js также позволяет создавать браузерные AI-расширения для улучшенного или адаптивного взаимодействия с пользователем, сохраняя при этом поведение пользователя приватным. Посмотрите этот репозиторий с примером расширения Google Chrome, которое использует TensorFlow.js для распознавания изображений в браузере.
(Вверху) Традиционная архитектура ML включает в себя разнообразные технологии, требующие координации и связи между несколькими приложениями. (Внизу) TensorFlow.js может значительно упростить архитектуру и технологический стек. Все запускается в клиентском браузере с использованием JavaScript.
Архитектура TensorFlow.js может быть еще более упрощена, если доступна предварительно обученная модель. В этом случае клиент загружает модель и полностью пропускает обучение. Если необходима дальнейшая специализация модели, можно сэкономить значительные усилия и время обучения, используя расширенное обучение (трансферное обучение) на предварительно обученной модели, а не обучение с нуля.
Прямая интеграция JavaScript облегчает подключение модели к входным устройствам, таким как микрофон или веб-камера. Поскольку на мобильных устройствах работает тот же самый код браузера, вы также можете использовать данные акселерометра, GPS и гироскопа. По состоянию на начало 2019 года обучение на мобильных устройствах остается непростым делом из-за аппаратных ограничений, но оно станет легче в течение следующих нескольких лет, поскольку производители мобильных процессоров начнут интегрировать оптимизацию вычислений для AI в линейки своих продуктов.
Вывод в режиме реального времени на стороне клиента позволяет создавать приложения, которые немедленно реагируют на пользовательский ввод, например жесты: Google выпустил игру для веб-камеры, позволяющую пользователю играть в Pacman головой (попробуйте здесь). Модель обучена связывать движения головы пользователя с конкретными клавишами управления. Приложения также могут обнаруживать и реагировать на человеческие эмоции, предоставляя новые возможности удивлять и радовать. Предварительно обученные модели могут быть загружены и затем настроены в браузере с помощью трансферного обучения, чтобы адаптировать их к конкретным пользователям.
Также TensorFlow.js имеет следующие преимущества:
Решайте сложные задачи быстро, загружая в браузер мощные предварительно обученные модели. Не нужно изобретать велосипед (модель) или начинать с нуля. Выберите среди растущего числа доступных моделей (по этой ссылке) или даже создайте JavaScript-порт модели на Python с помощью этого удобного преобразователя TensorFlow. TensorFlow.js также поддерживает расширенное обучение, позволяя переобучать модели на основе данных датчиков и адаптировать их к конкретному приложению с помощью трансферного обучения. Огромная ценность построения модели поверх предварительно обученных моделей заключается в том, что последние часто обучались на огромных выборках данных и использовали вычислительные ресурсы, обычно недоступные большинству людей, не говоря уже о браузере. Позвольте другим выполнять тяжелую работу, в то время как вы сосредоточитесь на более творческой задаче по подгонке моделей к потребностям вашего пользователя.
TensorFlow.js использует встроенные графические устройства для ускорения обучения модели благодаря использованию WebGL. Вам не нужен графический процессор NVIDIA с установленной CUDA для обучения модели. Это правда, наконец, можно обучать модели глубокого обучения и на графических процессорах AMD!
С поддержкой CUDA TensorFlow.js также работает на Node.js. В этом смысле он расширяет традиционное преимущество JavaScript «писать один раз, работая как на клиенте, так и на сервере», в области искусственного интеллекта.
Пара замечаний о том, что нужно учесть перед переходом на полную версию TensorFlow.js. TensorFlow.js может использовать значительно больше ресурсов, чем ваши типичные приложения JavaScript, особенно когда речь идет об изображениях или видео. Например, приложение Webcam Pacman использует приблизительно 100 мегабайт браузерных ресурсов и 200 мегабайт ОЗУ графического процессора при работе в Chrome v71 на MacBook Pro с Mojave v10.14.2.
Для лучшей производительности требуются браузеры с поддержкой WebGL и GPU. Вы можете проверить, поддерживается ли WebGL, перейдя по этой ссылке. Даже с WebGL поддержка графического процессора может быть недоступна на старых устройствах из-за требования обновления видеодрайверов.
Требования к современному оборудованию и обновленному программному обеспечению для достижения оптимальной производительности могут привести к значительному изменению пользовательского опыта на разных устройствах. Поэтому перед выкладкой приложения с TensorFlow.js следует провести всестороннее тестирование производительности на самых разных устройствах, особенно на самых слабых.
Существует несколько стратегий для устранения возможных ограничений производительности. Приложения могут проверять доступные вычислительные возможности и соответственно менять модель с соответствующим компромиссом в точности. Снижение требований к памяти в 5–10 раз часто достигается за счет уменьшения параметров модели без потери точности более чем на 20%. Уменьшение размера модели также поможет сэкономить пропускную способность в тех случаях, когда предварительно обученная модель передается на устройство клиента. Хорошее управление памятью поможет избежать утечек памяти (например, с помощью tf.tidy() ).
Наконец, ничто не может сравниться с хорошим пониманием данных и проблематикой. Например, многое в распознавании изображений можно решить с помощью изображений с удивительно низким разрешением. Некоторые проблемы также можно упростить, используя обычные алгоритмы с более низкими требованиями к ресурсам или используя пользователя для выполнения части работ, например, центровки обнаруживаемого объекта.
Эта статья для новичков и не претендует на высокий технический уровень, а если вам интересны сложные современные решения, обратите внимание, например, на статью о GIRAFFE, который для генерации реалистичного движения объединяет самые современные подходы в ИИ.
В конце статьи вы найдёте ссылки на проект очень простой веб-страницы с распознаванием рукописного ввода при помощи ИИ, а прочитав это руководство, переводом которого мы делимся к старту курса о машинном и глубоком обучении, сможете самостоятельно написать такую страницу. Для этого вам понадобится свой блокнот Colab или блокнот автора статьи. Скачиваемые блокнотом файлы модели занимают меньше мегабайта.
Обучим простую модель распознавания цифр на наборе данных MNIST
Если вы решили завести блокнот и выполнить всё с нуля, чтобы загрузить данные, в первую ячейку Вашего блокнота введите этот код:
Код отображает размерности данных tx и цели ty , а также данных валидации vx и целевых данных vy :
Выведем 10 образцов изображений каждой цифры, чтобы понять, как выглядят данные:
Обратите внимание на чёрный фон и белые цифры. Это важно в смысле рисования чисел и кода canvas в HTML:
Начнём со строительного блока свёртки, который кроме самой свёртки будет содержать пакетную нормализацию, функцию активации RELU, максимальное объединение и отсеивающие слои:
Наша полная сеть будет состоять из двух normConvBlock , затем плоского и последнего плотного слоя с активацией softmax. Оптимизировать модель мы можем при помощи Adam . В целевых данных есть маркировка порядка, поэтому также воспользуемся категориальной потерей перекрёстной энтропии:
Код выше отобразит структуру модели:
Предлагаемая архитектура модели состоит из двух наборов слоёв normConvBlock (b1 и b2), за ними следуют плоский и плотный слои
Чтобы обучить модель, вызовем model.fit с обработанными выше данными, а также определим обратный вызов ранней остановки, чтобы избежать переобучения:
Точности модели достаточно для примера (
99 % в наборе валидации). Если нужна модель точнее, измените её структуру или дополните набор данными:
Весь код
TensorFlow.js
Для взаимодействия с моделью TensorFlow.js разработаем набор компонентов HTML и JavaScript. TensorFlow.js — это библиотека с открытым исходным кодом для обучения и запуска моделей ML полностью в браузере при помощи JavaScript и высокоуровневого API.
Преобразуем TensorFlow в TensorFlow.js
Первый шаг размещения модели TensorFlow в браузере — её преобразование в модель TensorFlow.js, для которого можно вызвать метод tensorflowjs.converters.save_keras_model библиотеки tensorflowjs .
При работе в Colab загрузите файлы на локальную машину, они нам понадобятся.
Пишем веб-интерфейс
Начнём со структуры приложения. В папке digit_recognition создайте два файла с именами index.html и script.js . Внутри digit_recognition создайте папку tensorflow . Скопируйте два файла из блокнота Colab, group1-shard1of1.bin и model.json , в новую папку, вот так:
Откройте index.html любым редактором кода и скопируйте в него код ниже. Этот сценарий определяет основные компоненты для рисования и распознавания цифры:
В разделе <head> загружаются TensorFlow.js и её зависимости.
Строка 23 создаёт кнопку вызова функции вывода модели predictModel , которая запустится после нажатия, результат предсказания вы увидите в теге <p > .
На строке 26 создаётся кнопка очистки холста erase .
Строка 31 определяет объект canvas , где мы будем рисовать цифру для распознавания.
В строке 35 содержится файл script.js с логикой JavaScript, которая переносит цифру с холста в тензор и применяет модель.
Откройте файл script.js и добавьте показанные ниже фрагменты кода.
Основные переменные скрипта:
По событию mousedown (нажатию и удержанию кнопки) запускается сценарий, который инициирует рисование и записывает текущее положение мыши/прикосновения.
По событию mousemove скрипт начинает рисовать на холсте. По mouseup (когда отпускаем кнопки мыши) срабатывает останавливающий рисование скрипт:
Чтобы правильно выбрать событие в setPosition , напишем функцию проверки того, поддерживается ли устройством сенсорное управление:
Определим флаги начала и прекращения рисования:
Запишем положение мыши/прикосновения. Обратите внимание, что нам нужно знать, поддерживается ли сенсорное управление:
Перейдём к функции рисования.
Флаг draging определяет, рисует ли пользователь прямо сейчас (строка 8). Если это так, между прошлой позицией из setPosition и текущей позицией возникает линия, это строки с 18 по 21:
Загрузим модель. Метод tf.loadLayersModel загружает модель по URL или из локального каталога (строка 5). При первом предсказании она инициализирует веса, поэтому, чтобы во время первого предсказания избежать задержки, рекомендуется разогреть её (строка 8):
Получим текущие данные о цифре с холста:
Теперь о функции выводов модели:
getData загружает данные холста (строка 5).
tf.browser.fromPixels преобразует их в тензор (строка 8).
tf.image.resizeBilinear изменяет размер изображения до размера для модели (строка 11).
model.predict получает предсказание на строке 14, а строка 17 устанавливает цифру из прогноза y.argMax(1) в тег <p > .
Тестируем модель
Чтобы разрешить CORS в Firefox, введите about:config в поиске внутри Firefox, в строке открывшейся страницы введите privacy.file_unique_origin и измените значение по умолчанию на false .
Откройте index.html в Firefox:
А теперь нарисуем цифру и нажмём Predict:
Для размещения модели в сети автор оригинала использует хранилище Amazon S3, а для очень простых экспериментов подойдёт, например, Github Pages, отдельно отключать защиту CORS уже будет не нужно, поскольку всё будет выполняться на одном ресурсе.
Модель в действии
Эта статья напоминает, что модели машинного обучения могут работать не только в очень сложных, непривычных непосвящённому человеку системах, но и в самом простом окружении, а со временем искусственный интеллект, который называют новым электричеством, будет занимать всё больше места в быту. Если хочется изменить карьеру или прокачать свои навыки в ML, вы можете присмотреться к нашему курсу «Machine Learning и Deep Learning», а если интереснее веб-разработка, обратите внимание на курс по фронтенду или по Fullstack-разработке на Python. Также вы можете узнать, как начать развиваться или выйти на новый уровень в других направлениях:
Издание Gizmodo собрало подборку из 5 веб-сервисов, которые работаю с помощью искусственного интеллекта. Редакция AIN.UA приводит адаптированную версию материала.
Semantris
Игра от Google, в которой нужно подсказывать ИИ слова, написав примерное определение или ассоциацию. Механика похожа на тетрис, пользователю также нужно выбивать блоки разных цветов, чтобы не проиграть. У Semantris есть два режима: аркада и блоки, но поддерживается только английский язык. Как говорят в Google, они скормили алгоритму миллиарды предложений и диалогов, поэтому для ассоциаций можно использовать сленг, технические термины, отсылки и даже полные предложения.
This Person Does Not Exist
Этот сервис создает фотографии несуществующих людей. Проект создал инженер Uber Филип Вонг на базе технологий Nvidia. Снимки генерируются на базе обширной библиотеки, а уникальность сервиса в том, что он последовательно использует две нейросети: одна создает картинку, другая оценивает ее реалистичность.
AutoDraw
Этот сервис от Google помогает превратить небрежные наброски в выверенные, хорошо отрисованные изображения. Для этого ИИ сопоставляет рисунки с обширной базой данных и выбирает наиболее схожие варианты. Чем больше деталей вы добавите — тем лучше и достовернее будут рекомендации.
Cyborg Writer
Этот сервис умеет дописывать слова и предложения. Выбрав стиль одного из известных писателей (например, Шекспира), вы можете начать предложение — а дальше инициативу перехватит ИИ. В основе этого — движок TensorFire и работа команды энтузиастов. Поддерживается только английский язык.
Talk to Books
Google-сервис, который отвечает на вопросы цитатами из книг. В отличие от стандартного поиска, этот не боится даже самых абстрактных вопросов вроде «В чем смысл жизни?». В базе проекта около 100 000 произведений, а рекомендательный движок старается найти самые подходящие по смыслу выдержки. Ввод — только на английском языке.
Читайте также: