TL;DR

Привет, читатели!

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

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

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

Я обучил модели на Python, используя TensorFlow 2 с поддержкой Keras, а затем использовал их для демонстрации в браузере с помощью React и JavaScript версия Tensorflow.

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

⚠️ Во-первых, давайте сформулируем наши ожидания. Репозиторий содержит эксперименты по машинному обучению, а не готовый, многократно используемый, оптимизированный и доработанный код и модели. Это скорее песочница или площадка для обучения и опробования различных подходов, алгоритмов и наборов данных машинного обучения. Модели могут не работать хорошо, и есть место для переобучения / недообучения.

Поэтому иногда можно увидеть такие вещи:

Но будьте терпеливы, иногда модель может стать умнее 🤓 и дать вам следующее:

Фон

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

  1. 🗓 Поскольку Python может быть хорошим выбором для начала экспериментов с машинным обучением, я решил сначала изучить его базовый синтаксис. В результате появился проект 🐍 Playground and Cheatsheet for Learning Python. Это было просто для того, чтобы попрактиковаться в Python и в то же время иметь шпаргалку с базовым синтаксисом, когда он мне понадобится (для таких вещей, как dict_via_comprehension = {x: x**2 for x in (2, 4, 6)} и т. Д.).
  2. 🗓 Немного изучив Python, я хотел углубиться в основы математики, лежащие в основе машинного обучения. Итак, после прохождения великолепного Курса машинного обучения от Эндрю Нг на Coursera, появился проект 🤖 Самодельное машинное обучение. На этот раз речь шла о создании шпаргалки по базовым математическим алгоритмам машинного обучения, таким как линейная регрессия, логистическая регрессия, k-средних, многослойный персептрон и т. Д.
  3. 🗓 Следующей попыткой поиграть с базовой математикой машинного обучения была 🤖 NanoNeuron. Это было около 7 простых функций JavaScript, которые должны были дать вам представление о том, как машины на самом деле могут учиться.
  4. 🗓 Завершив еще одну замечательную Специализацию по глубокому обучению от Эндрю Нг на Coursera, я решил немного попрактиковаться с многослойными перцептронами, сверточными и рекуррентными нейронными сетями (CNN и RNN). На этот раз вместо того, чтобы реализовывать все с нуля, я решил начать использовать какой-нибудь фреймворк машинного обучения. В итоге я использовал TensorFlow 2 с Keras. Я также не хотел слишком зацикливаться на математике (позволяя фреймворку делать это за меня), и вместо этого я хотел придумать что-то более практичное, применимое и что-то, с чем я мог бы попробовать поиграть прямо в моем браузере. В результате появились новые 🤖 Интерактивные эксперименты по машинному обучению, о которых я хочу рассказать немного подробнее.

Тех-стек

Обучение моделей

  • 🏋🏻‍ Я использовал Керас внутри TensorFlow 2 для моделирования и обучения. Поскольку у меня не было опыта работы с фреймворками машинного обучения, мне нужно было с чего-то начать. Одним из аргументов в пользу TensorFlow было то, что он имеет как Python, так и вкус JavaScript библиотеки с аналогичным API. В итоге я использовал версию Python для обучения и версию JavaScript для демонстраций.
  • 🏋🏻‍ Я обучал модели TensorFlow на Python внутри блокнотов Jupyter локально и иногда использовал Colab, чтобы ускорить обучение на GPU.
  • 💻 Большинство моделей обучались на старом добром процессоре MacBook Pro (двухъядерный Intel Core i5 с тактовой частотой 2,9 ГГц).
  • 🔢 Конечно, от NumPy никуда не деться за матричные / тензорные операции.

Демо моделей

  • 🏋🏻‍ Я использовал TensorFlow.js, чтобы делать прогнозы с предварительно обученными моделями.
  • ♻️ Для преобразования моделей Keras HDF5 в формат TensorFlow.js Layers я использовал Конвертер TensorFlow.js. Это может быть неэффективно для передачи всей модели (мегабайтов данных) в браузер вместо того, чтобы делать прогнозы через HTTP-запросы, но опять же, помните, что это просто эксперименты, а не готовый к производству код и архитектура. Я хотел избежать выделенной серверной службы, чтобы упростить архитектуру.
  • 👨🏻‍🎨 Демонстрационное приложение было создано на React с использованием стартера create-react-app со стандартным вариантом Flow для проверки типов.
  • 💅🏻 Для стилизации я использовал Material UI. Это было, как говорится, убить сразу двух зайцев и опробовать новый стилевой фреймворк (простите, Bootstrap 🤷🏻‍).

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

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

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

Многослойный персептрон (MLP) - это класс искусственной нейронной сети с прямой связью (ИНС). Многослойные перцептроны иногда называют ванильными нейронными сетями (состоящими из нескольких слоев перцептронов), особенно когда они имеют единственный скрытый слой.

Распознавание рукописных цифр

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

Распознавание рукописных эскизов

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

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

Сверточная нейронная сеть (CNN или ConvNet) - это класс глубоких нейронных сетей, наиболее часто используемых для анализа визуальных образов (фотографий, видео). Они используются для обнаружения и классификации объектов на фото и видео, переноса стиля, распознавания лиц, оценки позы и т. Д.

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

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

Распознавание рукописных эскизов (CNN)

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

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

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

Камень, ножницы для бумаги (MobilenetV2)

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

Обнаружение объектов (MobileNetV2)

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

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

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

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

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

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

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

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

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

Генерация текста Википедии

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

Планы на будущее

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

  • Обнаружение эмоций
  • Перенос стиля
  • Языковой перевод
  • Создание изображений (например, рукописных цифр)
  • и т.п.

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

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

Удачного обучения! 🤖