Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

🤖 Интерактивные эксперименты с машинным обучением на TensorFlow

Усі статті, обговорення, новини про AI — в одному місці. Підписуйтеся на DOU | AI!

Если вкратце

Я создал новый проект 🤖 Интерактивные эксперименты с машинным обучением на GitHub. Каждый эксперимент состоит из 🏋️ Jupyter/Colab ноутбука, показывающего как модель тренировалась, и 🎨 Демо странички, показывающей модель в действии прямо в вашем браузере.

Несмотря на то, что машинные модели в репозитории могут быть немного «туповатенькими» (помните, это всего-лишь эксперименты, а не вылизанный код, готовый к «заливке на продакшн» и дальнейшему управлению новыми Tesla), они будут стараться как могут чтобы:

  • 🖌 Распознать цифры и прочие эскизы, которые вы нарисуете в браузере
  • 📸 Определить и распознать объекты на видео из вашей камеры
  • 🌅 Классифицировать изображения, загруженные вами
  • 📝 Написать с вами поэму в стиле Шекспира
  • ✊🖐✌️И даже поиграть с вами в камень-ножницы-бумагу
  • и пр.

Я тренировал модели на Python с использованием TensorFlow 2 с поддержкой Keras. Для демо-приложения я использовал React и JavaScript версию Tensorflow.

Интерактивные эксперименты с машинным обучением

Производительность моделей

⚠️ Для начала, давайте определимся с нашими ожиданиями.️ Репозиторий содержит эксперименты с машинным обучением, а не готовые к «заливке на продакшн», оптимизированные и тонко настроенные модели. Этот проект скорее похож на песочницу, в которой можно учиться и тренироваться работе с алгоритмами машинного обучения и разными наборами данных. Обученные модели могут быть недостаточно точными (например, иметь 60% точности вместо ожидаемых, пускай, 97%), а также могу быть переученными и недоученными (overfitting vs underfitting).

Поэтому иногда вы можете увидеть что-то вроде:

Тупенькая машинная модель

Но будьте терпеливы, иногда эта же модель может выдавать что-то более «умное» 🤓:

Более умная машинная модель

Предыстория

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

  1. 🗓 Поскольку Python мог быть хорошим выбором для того, чтобы начать экспериментировать с машинным обучением я решил изучить его базовый синтаксис. В результате появился проект 🐍 Playground and Cheatsheet for Learning Python . Он был создан с одной стороны для того, чтобы практиковаться в написании кода на Python, а также в качестве «шпаргалки» с базовым синтаксисом, чтобы в нужный момент можно было быстро подсмотреть вещи наподобие dict_via_comprehension = {x: x**2 for x in (2, 4, 6)}.

  2. 🗓 После ознакомления с Python-ом я хотел чуть больше углубиться в математическую часть машинного обучения. В итоге после прохождения замечательного курса от Andrew Ng на Coursera я создал проект 🤖 Homemade Machine Learning . Это была очередная «шпаргалка для себя-же» с базовыми алгоритмами машинного обучения, такими как линейная регрессия, логистическая регрессия, алгоритм k-средних, многослойный перцептрон (или персептрон? 🤔) и прочие.

  3. 🗓 Моей следующей попыткой «поиграться в машинное обучение» стал 🤖 NanoNeuron. Это были 7 простых JavaScript функций, которые должны были дать понимание читателю о том, как же машина все-таки может «учиться».

  4. 🗓 После окончания очередного прекрасного курса по Deep Learning от все того-же Andrew Ng на Coursera я решил больше попрактиковаться с многослойными перцептронами (multilayer perceptrons), сверточными и рекуррентными нейронными сетями (convolutional and recurrent neural networks). На этот раз, вместо того, чтобы реализовывать их с нуля я решил воспользоваться уже готовым фреймворком. В итоге я начал с TensorFlow 2 с поддержкой Keras. Я так же не хотел фокусироваться на математике (позволив фреймворку сделать свое дело), вместо этого хотелось написать что-то более практичное и интерактивное, что-то, что можно было бы протестировать прямо в браузере телефона. В результате появился новый проект 🤖 Interactive Machine Learning Experiments , на котором я и хочу остановиться более детально в этой статье.

Технологический стек

Тренировка моделей

  • 🏋🏻 Для тренировки моделей я использовал Keras, как часть TensorFlow 2. Поскольку до этого у меня не было опыта с фреймворками для машинного обучения мне нужно было с какого-то из них начать. Один из ключевых факторов, который мне понравился в TensorFlow было наличие сразу двух его версий: версии на Python и версии на JavaScript, у которых был схожий API. В итоге я использовал Python версия для тренировки, а JavaScript версию библиотека для демо-приложения.

  • 🏋🏻 Я тренировал модели на Python внутри Jupyter ноутбуков локально. Иногда использовал Colab, чтобы воспользоваться GPU и тем самым ускорить тренировку.

  • 💻 Большинство моделей были натренированы на CPU старого доброго MacBook Pro (2,9 GHz Dual-Core Intel Core i5).

  • 🔢 И конечно же было никак не обойтись без NumPy для матричных (тензорных) операций.

Демонстрация моделей

  • 🏋🏻 Я использовал TensorFlow.js для того, чтобы воспользоваться в браузере заранее натренированными на предыдущем шаге (в Jupyter ноутбуке) моделями.

  • ♻️ Для конвертирования моделей из формата HDF5 в формат TensorFlow.js Layers я использовал TensorFlow.js converter. Это конечно же может быть неэффективно загружать всю модель в браузер целиком (речь ведь идет о мегабайтах данных) вместо того, чтобы делать предсказания вызывая модель удаленно через HTTP запросы, но, снова-таки, вспомним, что речь идет об экспериментах, а не о зрелой и оптимизированной архитектуре, которую можно брать и сразу же использовать для «продакшна». С точки зрения простоты подхода я также хотел избежать развертывания отдельного сервера с HTTP API для предсказаний моделей.

  • 👨🏻 🎨 Демонстрационное приложение было создано на React с использованием create-react-app стартера с поддержкой Flow по умолчания для проверки типов.

  • 💅🏻 Для стайлинга я воспользовался библиотекой Material UI. Я хотел, как говориться, «убить двух зайцев сразу» и заодно попробовать новый для себя фреймворк для пользовательских интерфейсов (прости, Bootstrap 🤷🏻 ).

Эксперименты

Демо-страничка с экспериментами, а также Jupyter ноутбуки с деталями тренировки доступны по следующим ссылкам:

Эксперименты с многослойным перцептроном (Multilayer Perceptron, MLP)

Распознавание цифр

Вы рисуете цифру, а модель пытается ее распознать.

Handwritten Digits Recognition

Распознавание эскизов

Вы рисуете эскиз, а модель пытается его распознать.

Handwritten Sketch Recognition

Эксперименты со сверточными нейронными сетями (Convolutional Neural Network, CNN)

Распознавание цифр (CNN)

Вы рисуете цифру, а модель пытается ее распознать. Этот эксперимент похож на предыдущий из раздела MLP, но на этот раз модель использует CNN.

Handwritten Digits Recognition (CNN)

Распознавание эскизов (CNN)

Вы рисуете эскиз, а модель пытается его распознать. Этот эксперимент похож на предыдущий из раздела MLP, но на этот раз модель использует CNN.

Handwritten Sketch Recognition (CNN)

Камень-Ножницы-Бумага (CNN)

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

Rock Paper Scissors (CNN)

Rock Paper Scissors (MobilenetV2)

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

Rock Paper Scissors (MobilenetV2)

Распознавание объектов (MobileNetV2)

Вы показываете модели ваше окружение (используя камеру ноутбука или телефона), а модель пытается определить предметы на видео и распознать их. Эта модель использует сеть MobilenetV2.

Objects Detection (MobileNetV2)

Классификация изображений (MobileNetV2)

Вы загружаете изображение, а модель пытается его классифицировать в зависимости от того, что она «видит» на картинке. Модель использует сеть MobilenetV2.

Image Classification (MobileNetV2)

Эксперименты с рекуррентными нейронными сетями (Recurrent Neural Networks, RNN)

Суммирование чисел

Вы набираете выражение (например, 17+38) и модель предсказывает результат (например 55). Интересность этой модели заключается в том, что она воспринимает выражение на входе, как последовательность символов (как текст). Модель учится «переводить» последовательность 11717+17+317+38 на входе в другую текстовую последовательность 55 на выходе. Считайте, что модель скорее делает перевод испанского Hola в английское Hello, чем оперирует математическими сущностями.

Numbers Summation

Генерация текста в стиле Шекспира

Вы начинаете поэму как Шекспир, а модель пытается ее продолжить как Шекспир. Ключевое слово «пытается» 😀.

Shakespeare Text Generation

Генерация текста в стиле Wikipedia

Вы начинаете печатать Wiki статью, а модель продолжает.

Wikipedia Text Generation

Планы

Как я упомянул выше, главная задача репозитория — быть тренировочной площадкой, песочницей для обучения машинному обучению (привет, каламбур 🙌🏻). Поэтому в планах — продолжать учиться и экспериментировать с различными задачами в области Deep Learning. Такими интересным задачами могут быть:

  • Определение эмоций
  • Перенос стиля
  • Машинный перевод
  • Генерация изображения (например тех-же написанных цифр)
  • и пр.

Другой интересной возможностью является более тонкая настройка уже имеющихся моделей, чтобы сделать их более точными. Мне кажется это может дать более глубокое понимание того, как преодолевать переученность/недоученность моделей и как поступать в случаях, когда точность модели застревает на 60% для тренировочных и валидационных данных и не хочет больше улучшаться 🤔.

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

Успешного обучения! 🤖

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному15
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Супер, обожаю пет проекты :)

ps: котика может распознать?

однозначно крутий проект, про який я дізнався не з ДОУ, а з Клубу vas3k. Приємно знати, що і наших там багато :)

аналогично

Ну так ты же троллил, или я посыл неправильно понял?

я еще глянул, кто из поддержавших еще какие посты поддержал.

Витя, тебе реально нечем заняться))

Искренне сочувствую

троллил, причем в явным сарказмом

ну і дарма — візуалізації дійсно цікаві. я, наприклад, приглядався що з цього можна використати, якщо доведеться писати другу частину курсу по ML.

Дуже крута стаття
Скільки часу знадобилось від «0» в ML до того рівня розуміння теми, який є зараз?

Дякую, Олег!
Якщо не рахувати перерви в декілька місяців то загалом пішло приблизно 6 місяців на навчання та на практику (зранку перед роботю по 1-1,5 години).

круто, большое спасибо!

Рад, что статья понравилась 👍🏻

можете поделиться ссылками/роадмапом, которыми Вы пользовались при изучении ML?

Мой роадмап, как и мои знания по ML, очень ограниченны пока :D Но, я бы порекомендовал начать с:

  1. Machine Learning курса на Coursera от Andrew Ng — тут базовые знания и математика (к сожалению пример на устаревшем языке Octave, но зато матчасть хорошо прокачивает)
  2. Deep Learning специализации (несколько курсов в одном пакете) от все-того же Andrew Ng — здесь уже Python и Jupyter ноутбуки, плюс нашумевшие Convolutional Neural Networks и Recurrent Neural Networks

Лектор очень классно и доходчиво объясняет — мне эти курсы очень понравились! Ну и надо разбавлять по ходу дела все практикой.

Сколько часов примерно на все это потрачено времени?

Точно не подсчитывал, но в целом работа над репозиторием длилась около 2-3 месяцев (~1-1.5 часа утром перед работой, 3-4 дня в неделю)

Отличная идея — сыграть в ИИ в камень-ножницы-бумагу. Снеси ему моск равновероятной комбинацией — и обломайся когда он будет тебя обыгрывать :)

Да, равновероятная комбинация — это сила 😄

приберіть емоджі, будь ласка, цей тренд дуже бісить

пс дякую за роботу, поставив зірочку

Віктор, радий що робота Вам сподобалася навіть незважаючи на велику кілкість емоджі. Я їх використував навмистно задля того, щоб зробити інформцію більш візуальною та легкою для сприйняття (принаймні мені вони допогають краще орієнтуватися в тексті). Але я звісно розумію, що те, що працює для одного може не зпрацювати для іншого.

Дуже класно виглядає. Величезний лайк

Підписатись на коментарі