Как сделать ии на js

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

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


Эта статья для новичков и не претендует на высокий технический уровень, а если вам интересны сложные современные решения, обратите внимание, например, на статью о GIRAFFE, который для генерации реалистичного движения объединяет самые современные подходы в ИИ.

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

Обучим простую модель распознавания цифр на наборе данных MNIST

Если вы решили завести блокнот и выполнить всё с нуля, чтобы загрузить данные, в первую ячейку Вашего блокнота введите этот код:

Код отображает размерности данных tx и цели ty , а также данных валидации vx и целевых данных vy :

Выведем 10 образцов изображений каждой цифры, чтобы понять, как выглядят данные:

Обратите внимание на чёрный фон и белые цифры. Это важно в смысле рисования чисел и кода canvas в HTML:


Начнём со строительного блока свёртки, который кроме самой свёртки будет содержать пакетную нормализацию, функцию активации RELU, максимальное объединение и отсеивающие слои:

Наша полная сеть будет состоять из двух normConvBlock , затем плоского и последнего плотного слоя с активацией softmax. Оптимизировать модель мы можем при помощи Adam . В целевых данных есть маркировка порядка, поэтому также воспользуемся категориальной потерей перекрёстной энтропии:

Код выше отобразит структуру модели:

Предлагаемая архитектура модели состоит из двух наборов слоёв normConvBlock (b1 и b2), за ними следуют плоский и плотный слои

Предлагаемая архитектура модели состоит из двух наборов слоёв 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 любым редактором кода и скопируйте в него код ниже. Этот сценарий определяет основные компоненты для рисования и распознавания цифры:

В разделе загружаются TensorFlow.js и её зависимости.

Строка 23 создаёт кнопку вызова функции вывода модели predictModel , которая запустится после нажатия, результат предсказания вы увидите в теге

На строке 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) в тег

Тестируем модель

Чтобы разрешить CORS в Firefox, введите about:config в поиске внутри Firefox, в строке открывшейся страницы введите privacy.file_unique_origin и измените значение по умолчанию на false .


Откройте index.html в Firefox:


А теперь нарисуем цифру и нажмём Predict:


Для размещения модели в сети автор оригинала использует хранилище Amazon S3, а для очень простых экспериментов подойдёт, например, Github Pages, отдельно отключать защиту CORS уже будет не нужно, поскольку всё будет выполняться на одном ресурсе.

Модель в действии

Только для мобильных.

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 6 лет назад .

Лично мне приходят два варианта:

Взять какую-нибудь готовую игру и изменить AI персонажей в нём. Искал на GitHub'е, но ничего хорошего мне пока не попалось. В основном все игры либо слишком сложные (месяц будешь разбираться в механике), либо недоделанные. Очень желательно, чтобы игрушка была написана на Java или JS. Буду рад, если подскажете подходящую.

Конечно, можно и свой мир "запилить", и в нём AI гонять, но это слишком долго и нудно.

Могу предложить "воссоздание ИИ" на Java. Если интересует, какие-нибудь координаты для связи. Проект на Гитхабе.

Не понимаю смысл всех этих редактирований, но фраза "месяц будешь разбираться в механике" точно нужна

Не знаю как мне не пришло это в голову раньше, но гуглинг фразы "ai competition" даёт много интересного

1 ответ 1

Не очень понимаю, зачем тебе вообще с ИИ тренироваться. Само по себе написание ИИ не прикрепленной к конкретной данной задачи - это телега впереди лошади (мое мнение). Куда правильнее, я считаю, работать над конкретным продуктом и уже к нему, как составляющие, писать уже конкретный(е) ИИ под конкретные задачи. Вот как ты и сказал - свой мир "запилить": сделай свою игру и реализуй там ИИ - это будет куда правильнее, я считаю. А просто навыки по написанию ИИ тебе мало чего дадут: для тривиальных задач уже все изъезженно-переезженно, а для нетривиальных задач тебе все равно придется сидеть и ломать голову над алгоритмами в не зависимости от опыта на "тривиалках". В таком случае я бы тебе советовал лучше вообще углубляться в корень - в алгоритмы как таковые (в не зависимости ИИ/не ИИ) - в конце концов, любой игровой ИИ это не более чем набор алгритмов для решения различных задач + генератор случайных чисел для илюзии праавдоподобности=)

Доброго времени! Начну сначала, дабы описать проблему. Я делаю для презентации лабораторной работы программу где реализован логический ИИ. Так получилось, что решил я её делать на JS.
Часть исполнения таково: есть "вход" где появляется группа пикселей "муравьев", бесцельно бродящих близ "входа" и как только на поле выложить "еду" (пиксели другого цвета), то "муравьи" идут к еде и "тащат" её на "выход".
В целом всё готово, но мне не понравилось, что "муравей" выбирает свою целевую еду слишком просто - берется следующий элемент массива, где хранятся объекты "еда". Я решил сделать так, что бы "муравей" выбирал ближайший от своей текущей координаты объект "еда".
Однако не смотря на, казалось бы, правильно (по моему мнению) написанный код, все равно ничего не выходит.
Вот функция поиска "цели" "муравья":

Посоветуете что-нибудь, пожалуйста?

Если что-то непонятно в коде или нужная дополнительная информация - с радостью отвечу.

Построение логического вектора по правилу
Помогите пожалуйста с задачкой. Даны действительные x и матрица A(n,n), n<=20. Разработать.

Описать функцию логического типа IsSquare(K) логического типа
Описать функцию логического типа IsSquare(K) логического типа, возвращающую True, если целый.

Поиск данных и построение гистограммы (Vfp98)
помогите Разработать программы поиска данных и построения гистограммы. в программе microsoft.

Построение и поиск всех остовных деревьев графа
Есть готовая программа, выводит все остовные деревья. не могу понять работу кнопок "загрузить" и.

-- нужна геометрия (размеры муравья, кусочка еды, игрового поля, просвета выхода)
-- нужны количественные характеристики (сколько кусочков еды, на каком минимальном расстоянии от выхода она должна находиться, сколько всего муравьёв выползет на поле, причём надо определиться - по одному они выползать будут или кучкой из 3-4-5. )
-- нужны законы движения муравья (только по горизонтали-вертикали или ещё и по диагонали вплоть до столкновения с другим муравьём или с границей игрового поля)
-- нужны правила дорожного движения для муравьёв после столкновения (вправо-влево или назад)
-- нужен принцип определения еды (например, как бы "по запаху", начиная с определенного расстояния и куда должен поползти муравей, если одновременно "учует" еду и слева, и справа)
-- и ещё много-много чего нужно

но я сам думать об этом не желаю!
лень мне

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

О нет, Вы меня не правильно поняли ) Я же писал - программа уже готова! То есть уже написана и работает. Меня интересует лишь доработка только этого кусочка функции, т.к. когда я дополняю её указанным мною методом поиска ближайшего объекта "еда", то выполнение программы прекращается.
Хорошо, сейчас отвечу на все вопросы попорядку:

2."-- нужны количественные характеристики (сколько кусочков еды, на каком минимальном расстоянии от выхода она должна находиться, сколько всего муравьёв выползет на поле, причём надо определиться - по одному они выползать будут или кучкой из 3-4-5. )"
Ответ: Кусочков еды, её расстояние, количество муравьев всё задается произвольно и устанавливается там, где хочется. То есть выбрал элемент "вход", поставил где захотел и оттуда выползают муравьи. Положил где угодно "еду" и муравьи за ней идут - это всё работает уже. Выползают муравьи поочередно, но в силу скорости процесса, это можно назвать "кучкой.

3."-- нужны законы движения муравья (только по горизонтали-вертикали или ещё и по диагонали вплоть до столкновения с другим муравьём или с границей игрового поля)"
Ответ: реализовано только по горизонтали-вертикали и диагонали тоже. К тому же, если не ошибаюсь, диагональ выполняется все равно как комбинация движений горизонталь-вертикаль, так что думаю ответ тут всего один ) Далее, столкновения с другим муравьем не учитывается, границ игрового поля нет.

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

5. "-- нужен принцип определения еды (например, как бы "по запаху", начиная с определенного расстояния и куда должен поползти муравей, если одновременно "учует" еду и слева, и справа)"
Ответ: Вот! Вот над чем я сейчас работаю и о чём помощи попросил! Я же показал функцию поиска еды муравьем. То есть, когда еда появляется на поле, функция проходится по массиву, который хранит все объекты "еда" и дает "муравью" первый же незанятый объект "еда", вне зависимости от его расстояния. Я же прошу помочь мне и посоветовать (не сделать за меня, как Вы почему-то подумали), как можно реализовать определение наиближайшей от текущей точки "муравья" "еды".

6. "-- и ещё много-много чего нужно"
Ответ: мне нужно лишь доработать одну функцию и получить совет, что еще для этого надо?

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

Здесь всё просто - "муравью" дается следующая в массиве еда, которая полностью свободна.
Программа вполне успешно работает:

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

Читайте также: